Python:求和的 Lambda

标签 python lambda sum closures

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

 yu = lambda x: 0
 for i in range(0,5):
      yu = lambda x: i + yu(x)

不幸的是,它返回:

RuntimeError:超出最大递归深度

当我这样做时:

print yu(0)

打印语句应返回 10。

正确的做法是什么?

最佳答案

最后,你有:

yu = lambda x: i + yu(x)

但是 yu 将在运行时 中查找,而不是在您构造 lambda 时查找。改为这样做:

for i in range(0,5):
    yu = lambda x, yu=yu: i + yu(x)

不过,这不会返回10。它返回 20 而不是:

>>> yu = lambda x: 0
>>> for i in range(0,5):
...     yu = lambda x, yu=yu: i + yu(x)
... 
>>> yu(0)
20

因为现在 i 仍然是从上下文中查找的(现在循环已经完成所以它是 4)。解决方案?也将 i 移动到关键字参数:

for i in range(0,5):
    yu = lambda x, yu=yu, i=i: i + yu(x)

现在这有效:

>>> yu = lambda x: 0
>>> for i in range(0,5):
...     yu = lambda x, yu=yu, i=i: i + yu(x)
... 
>>> yu(0)
10

故事的寓意?将您的上下文正确绑定(bind)到 lambda 的范围。

关于Python:求和的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124268/

相关文章:

python - move/重写与具有多个txt文件的文件夹中的字符串匹配的txt文件

python - 在 python 中安装一些库时遇到问题(oauth2client 和 gspread)

Python 自省(introspection) : access function name and docstring inside function definition

python - basemap 上的刻度线

javascript - PEG.js 中的 Lambda 表达式

lambda - 使用词法闭包的 Racket

c++ - std::transform with lambda: 跳过一些项目

r - R 中无限和的近似

javascript - 在纯 JavaScript 中自动计算数据属性的总和

满足条件的值的行计数