python中的lambda带有额外的未压缩变量

时间:2016-08-05 10:29:10

标签: python linux lambda

我是python脚本新手。 我很困惑lambda如何解释传递的变量,如下例所示。

def create_multipliers():
  return [lambda x : i * x for i in range(5)]

for multiplier in create_multipliers():
  print multiplier(2),

返回8 8 8 8 8

我看到lambda只接受一个参数(即'x')。

它如何解释create_multipliers中的x和i? 乘数(2)的意思是什么?

请帮忙

还有下面的例子

def make_incrementor (n): return lambda x: x + n
print make_incrementor(22)(33)

返回55

lambda / make_incrementor函数如何决定哪个是'x'和'n'?

1 个答案:

答案 0 :(得分:2)

代码的第一部分创建一个lambdas列表,每个lambda都采用单个参数x并将其与i相乘。请注意,每个lambda bound到变量i而不是它的'当前值。由于列表推导后i的值为4,因此每个lambda将返回x * 4

>>> def create_multipliers():
...     return [lambda x: i * x for i in range(5)]
...
>>> l = create_multipliers()
>>> l[0](1)
4
>>> l[4](1)
4
>>> l[4]('foobar')
'foobarfoobarfoobarfoobar'

然后循环将使用参数2执行每个lambda并将结果打印到同一行。由于有5个lambda,4 * 2为8,因此您可以获得输出。 ,语句之后的print将导致输出打印在同一行:

>>> for multiplier in l:
...     print multiplier(2),
...
8 8 8 8 8

make_incrementor使用相同的原则。它返回一个lambda,它接受单个参数x,当调用lambda时,它被“决定”。然后它将返回x + n,其中n是传递给make_incrementor的值:

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> inc = make_incrementor(2) # n is "decided" here
>>> inc(3)                    # and x here
5

UPDATE 嵌套函数示例:

>>> def make_incrementor(n):
...     def nested(x):
...         return x + n
...     return nested
...
>>> inc = make_incrementor(2)
>>> inc(3)
5