Python:Lambda总和

Eli*_*Eli 2 python lambda closures sum

我正在尝试执行以下操作,这是我最终目标的代表性示例:

 yu = lambda x: 0
 for i in range(0,5):
      yu = lambda x: i + yu(x)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它返回:

RuntimeError: maximum recursion depth exceeded

当我做:

print yu(0)
Run Code Online (Sandbox Code Playgroud)

print语句应返回10.

这样做的正确方法是什么?

Mar*_*ers 5

最后,你有:

yu = lambda x: i + yu(x)
Run Code Online (Sandbox Code Playgroud)

但是yu会在运行时查找,而不是在构造lambda时.改为:

for i in range(0,5):
    yu = lambda x, yu=yu: i + yu(x)
Run Code Online (Sandbox Code Playgroud)

但这并没有回归10.它返回20:

>>> yu = lambda x: 0
>>> for i in range(0,5):
...     yu = lambda x, yu=yu: i + yu(x)
... 
>>> yu(0)
20
Run Code Online (Sandbox Code Playgroud)

因为现在i仍然从上下文中查找(现在循环已完成,所以它是4).解?移动i到一个关键字参数太多:

for i in range(0,5):
    yu = lambda x, yu=yu, i=i: i + yu(x)
Run Code Online (Sandbox Code Playgroud)

现在这个工作:

>>> yu = lambda x: 0
>>> for i in range(0,5):
...     yu = lambda x, yu=yu, i=i: i + yu(x)
... 
>>> yu(0)
10
Run Code Online (Sandbox Code Playgroud)

故事的道德启示?将您的上下文正确绑定到lambda的范围.