创建一个函数列表

时间:2018-02-20 16:38:18

标签: python list function lambda list-comprehension

我想使用list comprehension / for loop

创建一个函数列表
yScale

这样

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

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

然而,当我尝试这样做时:

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

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   

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

如何在不手动逐个输入的情况下创建此功能列表! 任何解释?谢谢!

3 个答案:

答案 0 :(得分:0)

您需要提供i作为参数来绑定i中的range

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

输出:

[0, 2, 4, 6]
[0, 3, 6, 9]

在您的情况下,i始终是range循环的最后一个值,因为该函数在调用时会查找i。提供i作为关键字实际上会在创建时为创建的函数创建i默认参数。

答案 1 :(得分:0)

考虑将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]

答案 2 :(得分:-1)

它帮我取代了' ['与'('喜欢

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

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