繁体   English   中英

如何使用 lambda 函数在循环中定义非常量函数列表?

[英]How to define a list of non-constant functions in a loop with lambda functions?

假设我想创建一个函数列表funclist ,这样该列表的函数就会以这种方式运行:

funclist[0](x) = 0
funclist[1](x) = x
funclist[2](x) = 2*x
funclist[3](x) = 3*x

假设列表太长(例如大小为 100)而无法逐个定义这些函数,那么自然的编写方法是:

funclist = []
for k in range(100):
    f = lambda x: k*x
    funclist.append(f)

问题是这种方法不起作用,因为 Python 解释 function 定义中的局部变量的方式。 这是我在这个网站上经常看到的一个问题,例如这里这里 不幸的是,这些用户想要定义常量函数,因此建议的解决方案(即定义可迭代变量 k 的本地副本)对我不起作用(这也是Python 常见问题解答中提出的相同解决方案)。 例如,以下语法不起作用:

funclist = []
for k in range(100):
    f = lambda local_k=k, x: local_k*x
    funclist.append(f)

我找到的解决方案是:

funclist = []
for k in range(10):
    def f(x, product_factor=k): return x*product_factor
    funclist.append(f)

可以按我的意愿工作。 我也可以使用partial function 实现相同的结果:

from functools import partial 

def product(x,product_factor): return x*product_factor
funclist = []
for k in range(10):
    funclist.append( partial(product, product_factor=k) )

所以我的问题是:有什么方法可以仅使用 lambda 函数来实现此结果? 或者我有一个“移动参数”这一事实注定我要以某种方式或其他方式定义两个变量的 function? 让我准确地说我问这个是因为我想更好地理解函数和柯里化在 Python 中是如何工作的。

您的 lambda 方法不起作用,因为您在位置参数之前有一个关键字参数。 只需像在工作解决方案中那样翻转顺序:

funclist = [(lambda x, local_k=k: local_k*x) for k in range(100)]

>>> funclist[3](8)
24
>>> funclist[5](9)
45

最初的问题是 k 只被评估了一次,在循环结束时,而这里 function 创建,对 get_function 的调用,每次都会触发对 k 的评估。

当然,您使用默认参数的解决方案也可以,这显然是解决此问题的最常见解决方案

现在您说它不适用于 lamdba,这仅仅是因为您将默认参数放在首位:

funclist = []
for k in range(100):
    f = lambda  x, local_k=k,: local_k*x
    funclist.append(f)


print(funclist[10](3)) #30
print(funclist[99](3)) # 297
print(funclist[0](3)) # 0

工作得很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM