我想使用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]。
如何在不手动逐个输入的情况下创建此功能列表! 任何解释?谢谢!
答案 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))
并且我认为这与列表是可变的这一事实有关,而元组则不是。