如何使用 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 在函数定义中解释局部变量的方式。这是我经常在这个网站上看到的问题,例如 here or . Unfortunately, those users want to define constant functions, so the proposed solution (which is to define a local copy of the iterable variable k) do not work for me (it is also the same solution proposed in the Python FAQ)。例如,以下语法不起作用:
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
函数获得相同的结果:
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 函数来实现此结果?或者我有一个 "moving parameter" 的事实注定我要以某种方式或其他方式定义两个变量的函数?让我准确地说我问这个是因为我试图更好地理解 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 只在循环结束时被求值一次,而这里的函数创建,对 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
工作正常
假设我想创建一个函数列表 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 在函数定义中解释局部变量的方式。这是我经常在这个网站上看到的问题,例如 here or
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
函数获得相同的结果:
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 函数来实现此结果?或者我有一个 "moving parameter" 的事实注定我要以某种方式或其他方式定义两个变量的函数?让我准确地说我问这个是因为我试图更好地理解 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 只在循环结束时被求值一次,而这里的函数创建,对 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
工作正常