我正在尝试实现一个使用不同参数调用的相同函数的列表,如下所示:
def func1(num):
print("{}".format(num))
fl = [func1(1),func1(2),func1(3)]
for f in fl:
fl()
我收到一条错误消息,说'list'对象不可调用。
现在,这有效:
def func1():
print 1
def func2():
print 2
def func3():
print 3
fl = [func1,func2,func3]
for f in fl:
f()
我做错了什么?
答案 0 :(得分:1)
from functools import partial
functions = [partial(func1, i) for i in range(1, 4)]
for fun in functions:
fun()
在你的第一个例子中,我假设fl()
是一个拼写错误,你的意思是f()
(因为否则你将调用一个list
对象,这不是可调用)。
您知道func1(1)
正在调用该函数并返回此调用的结果,因此res = func1(1)
变量res
将成为结果执行函数..因此,该列表[func1(1), func1(2), ...]
是此函数返回的列表。该函数返回None
,这是不可调用的,这就是您的代码失败的原因。
你想用不同的参数调用函数(不是调用函数的结果!),这正是functools.partial
的用途。
答案 1 :(得分:1)
来自代码:
for f in f1:
f1()
说明:
正如您在类型f1
中定义list
并且您正在将该变量用作函数调用。但是python期望函数名称应该是string
类型。所以得到了错误list() type is not callable
但是当您将代码更改为:
时for f in f1:
f()
此处f
的类型为string
,因此python验证了该类型,因此它没有抛出错误
答案 2 :(得分:1)
首先,您正在调用试图将列表作为函数调用的fl()
。这不起作用。
在Python中,在函数之后放置()
来评估函数并提供返回值。这意味着fl = [func1(1),func1(2),func1(3)]
表示“创建一个列表,并将调用func1(1),func1(2)和func1(3)的结果放入”
如果你想稍后调用该函数,那么你可以将参数放入列表并遍历列表,或者你可以绑定。
f = func1 # storing the function as a variable
fl = [1,2,3]
for v in fl:
f(v)
然后你可以做一些像使用lambda绑定的东西:
f = func1 # storing the function as a variable
fl = [lambda :f(1), lambda :f(2), lambda :f(3)]
for v in fl:
v() # v is bound to the parameters, so you don't need to use a param