使用列表推导式调用函数列表

41

我能否调用函数列表并使用列表推导?

def func1():
    return 1

def func2():
    return 2

def func3():
    return 3

fl = [func1, func2, func3]

fl[0]()
fl[1]()
fl[2]()

我知道我能做到

for f in fl:
    f()

但我可以做以下吗?

[f() for f in fl]

一个额外的问题,针对那些好心的人,如果我的函数列表在类中,例如:
class F:
    
    def __init__(self):
        self.a, self.b, self.c = 0, 0, 0
        
    def func1(self):
        self.a += 1

    def func2(self):
        self.b += 1

    def func3(self):
        self.c += 1

    fl = [func1, func2, func3]

fobj = F()

for f in fobj.fl:
    f()

它能工作吗?


19
为什么不尝试交互模式? - MAK
1
刚试了一下,它确实可以工作。当我在思考这个问题时,我没有Python shell。 - Jerry Gao
http://docs.python.org/release/3.2/tutorial/datastructures.html#list-comprehensions - Tyler Crompton
4个回答

31
>>> [f() for f in fl]
[1, 2, 3]

当然可以 :)


20

当然可以,就像Fábio Diniz所说的那样 :)

但是对于类方法,当作为可调用函数使用时,必须给定一个对象作为参数:

fobj = F()

for f in fobj.fl:
    f(fobj)

对象必须作为参数传递给可调用函数,因为当你查看方法的定义def funcX(self):时,该方法需要一个参数self


1
如果我需要向函数传递参数,我该如何做到这一点? - vipulnj
这是一个奇怪的方法。我认为将fl移入__init__会更有意义,即self.fl = [self.func1, self.func2, self.func3]。然后你就不需要将实例传递给f了。但是,现在并不清楚OP到底想要实现什么,所以谁知道呢。 - wjandrea

1

可以的。结果列表将保存您函数的返回值。


0

可以的 - 函数会按照预期被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接