通过列表理解定义匿名函数

时间:2018-11-26 22:10:12

标签: python

我需要创建函数(很多)并存储在数组或列表中。我尝试使用列表推导来生成函数(如下面所示的代码,确实是一个简单的案例)。

f = [lambda x: x*i for i in range(0,3)]

给出

f[0](1) = 2       # expected 0
f[1](1) = 2       # expected 1
f[2](1) = 2       # expected 2 (no prblm with last case)

但是,如果不使用迭代器(如列表推导)来生成函数,则如果我在列表内显式编写函数(定义每个函数),则可以正常工作。

那么,上述代码(使用迭代器生成匿名函数)有什么问题吗?

2 个答案:

答案 0 :(得分:2)

我相信语法的这种变体将为您提供所需的内容:

f = [lambda x, i=n: x * i for n in range(0, 3)]

示例

>>> f[0](1)
0
>>> f[1](1)
1
>>> f[2](1)
2
>>> 

我相信@ user2357112引导您迈向的是变化:

from functools import partial

f = [partial(lambda x, i: x * i, i=n) for n in range(0, 3)]

从引用的重复页面中调出来可能并不容易。

答案 1 :(得分:1)

调用函数时将评估lambda函数的内部,而不是在创建函数时对其进行评估。此时,i的值为2。您可以运行以下命令进行验证:

>>> f = [lambda x: x*i for i in range(0,3)]
>>> i
2

cdlane在回答中指出,您可以通过将range()语句中的值存储到lambda函数的默认参数中来解决此问题:

>>> f = [lambda x, i=i: x*i for i in range(0,3)]
>>> f[0](1)
0
>>> f[1](1)
1
>>> f[2](1)
2

之所以起作用,是因为与函数主体不同,在创建函数时会评估函数 definition