创建函数列表

2021-05-13 14:03:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用list comprehension/for循环创建一个函数列表

def multiplier():
    return [(lambda x: x*0),(lambda x: x*1),(lambda x: x*2),(lambda x: x*3)]

就这样

^{pr2}$

将分别输出[0,2,4,6]和[0,3,6,9]

但是,当我试图这么做时:

def multiplier():
    return [lambda x:i*x for i in range(4)]

或者

def multiplier():
    result = [] 
    for i in range(4):
        result.append(lambda x:x*i)
   return result

或者

def multiplier():
    result = [] 
    for i in range(4):
        def m(x): return x*i 
        result.append(m)
    return result   

以下内容:

^{pr2}$

将分别输出[6,6,6,6]和[9,9,9,9]。在

如何在不手动逐个键入的情况下创建此函数列表! 有什么解释吗?谢谢!在

3条回答
网友
1楼 ·

您需要提供i作为参数,以便从range绑定到i

def multiplier():
    return [lambda x, i=i:i*x for i in range(4)]

print([m(2) for m in multiplier()])
print([m(3) for m in multiplier()])

输出:

^{pr2}$

在您的例子中,i将始终是range循环的最后一个值,因为函数在调用时会查找i。提供ias关键字实际上使创建的函数在创建时i成为默认参数。在

网友
2楼 ·

对我来说,把“[”替换为“(”之类的)很管用

(lambda x:i*x for i in range(4))

我认为这与列表是可变的而元组不是可变的这一事实有关。在

网友
3楼 ·

考虑在字典中使用functools.partial

from functools import partial

def multiplier(x, n):
    return x * n

m = {k: partial(multiplier, n=k) for k in range(0, 4)}

[m[k](2) for k in m]  # [0, 2, 4, 6]
[m[k](3) for k in m]  # [0, 3, 6, 9]

相关问题