2016-10-10 93 views
-1

我知道如何运行没有参数的函数。在这种情况下,我想运行具有随机顺序参数的函数吗?Python 3:如何用随机顺序的参数运行函数?

它显示的结果,但不是随机的,有一些错误:请帮我纠正我的代码。谢谢:)

import random 
def hi(name): 
    print('a ' + name) 

def howold(old, name): 
    print(name + 'is ' + old + "years old") 

def howmuch(money): 
    print(money + ' dollars') 


functions = [hi('John'),howold('20', 'John'),howmuch('50')] 
random.shuffle(functions) 
for i in functions: 
    i() 
+3

你的函数直接调用该行'功能= [喜( '约翰'),howold('20 ','John'),多少('50')]。因此他们打印一条消息并返回None。你的列表是[None,None,None],然后尝试调用None(),这不起作用。 –

+1

@ S.deMelo好的。出于某种原因,我没有注意到被调用的方法。它最初看起来像函数正在与字符串进行比较。 – idjaw

+0

@ S.deMelo作为回答发布邮件 – idjaw

回答

1

当该行执行:

functions = [hi('John'),howold('20', 'John'),howmuch('50')] 

Python会在调用你的3个功能hi()howold()然后howmuch()订单,然后将其结果存储在名为functions的列表中。所以所有的print()都会在这一点上运行。正如你所说,这就是为什么“它显示的结果,但不是随机的”。由于您的所有功能都不会返回任何内容,因此您的functions将等于[None, None, None]

然后将以下代码:

random.shuffle(functions) 
for i in functions: 
    i() 

将尝试执行无()。这会产生一个错误,正如你所说的“有一些错误”:这个错误是TypeError: 'NoneType' object is not callable

如何解决:例如使用functools.partial()

from functools import partial 
functions = [partial(hi, 'John'), partial(howold, '20', 'John'), partial(howmuch, '50')] 
random.shuffle(functions) 
for i in functions: 
    i() 

官方文档在这里:https://docs.python.org/2/library/functools.html#functools.partial

-1

在你的循环,我是一个函数,而不是一个字符串,因此比较字符串不会工作,你在其他结束。而是使用if i.__name__ == 'hi

3

尝试类似的东西:

functions = [(hi, ['John']), (howold, ['20', 'John']), (howmuch, ['50'])] 

random.shuffle(functions) 
for func, args in functions: 
    func(*args) 
2

functions列表包含在循环已经评价函数的结果,而不是一个部分应用的不带参数的函数(这样就可以用i()给他们打电话) 。

您可以使用lambda表达式产生不带参数的这样的新功能:

functions = [lambda: hi('John'), 
      lambda: howold('20', 'John'), 
      lambda: howmuch('50')] 
random.shuffle(functions) 

for f in functions: 
    f()