Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用lambda函数定义循环中的非常量函数列表?_Python_Function_Lambda_Currying - Fatal编程技术网

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

Python 如何使用lambda函数定义循环中的非常量函数列表?,python,function,lambda,currying,Python,Function,Lambda,Currying,假设我想创建一个函数列表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) 问题是这种方法不起

假设我想创建一个函数列表
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在函数定义中解释局部变量的方式。例如,我经常在这个网站上看到这个问题。不幸的是,这些用户想要定义常量函数,因此建议的解决方案(即定义iterable变量k的本地副本)对我不起作用(这也是在中提出的相同解决方案)。例如,以下语法不起作用:

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函数来实现这个结果?或者我有一个“移动参数”这一事实注定了我要以某种方式定义一个由两个变量组成的函数?让我明确地说,我之所以问这个问题,是因为我试图更好地理解函数和curry在Python中的工作方式。

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

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

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

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_函数)每次都会触发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

工作正常

最初的问题是k在循环结束时只计算了一次,而在这里,函数创建(调用get_函数)每次都会触发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

工作正常

由于参数的顺序,lambda解决方案不起作用。你为命名函数翻页了这些,你也可以为lambda函数翻页。哦,是的,当然!非常感谢。这就是我一直在寻找的答案,难道你不想要求得到答案吗?当然=)很高兴帮助lambda解决方案因为参数的顺序而不起作用。你为命名函数翻页了这些,你也可以为lambda函数翻页。哦,是的,当然!非常感谢。这就是我一直在寻找的答案,你不想要求得到答案吗?当然=)很乐意帮忙