Python 3:如何用随机顺序的参数运行函数?
问题描述:
我知道如何运行没有参数的函数。在这种情况下,我想运行具有随机顺序参数的函数吗?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()
答
当该行执行:
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
答
在你的循环,我是一个函数,而不是一个字符串,因此比较字符串不会工作,你在其他结束。而是使用if i.__name__ == 'hi
答
尝试类似的东西:
functions = [(hi, ['John']), (howold, ['20', 'John']), (howmuch, ['50'])]
random.shuffle(functions)
for func, args in functions:
func(*args)
答
你functions
列表包含在循环已经评价函数的结果,而不是一个部分应用的不带参数的函数(这样就可以用i()
给他们打电话) 。
您可以使用lambda表达式产生不带参数的这样的新功能:
functions = [lambda: hi('John'),
lambda: howold('20', 'John'),
lambda: howmuch('50')]
random.shuffle(functions)
for f in functions:
f()
你的函数直接调用该行'功能= [喜( '约翰'),howold('20 ','John'),多少('50')]。因此他们打印一条消息并返回None。你的列表是[None,None,None],然后尝试调用None(),这不起作用。 –
@ S.deMelo好的。出于某种原因,我没有注意到被调用的方法。它最初看起来像函数正在与字符串进行比较。 – idjaw
@ S.deMelo作为回答发布邮件 – idjaw