具有几个参数python的函数列表

时间:2018-06-08 18:29:50

标签: python

我正在尝试实现一个使用不同参数调用的相同函数的列表,如下所示:

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()

我做错了什么?

3 个答案:

答案 0 :(得分:1)

使用functools.partial

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