我有一个关于lambda函数的简单问题。我想做一个循环,其中每个迭代都根据前一次迭代中的lambda函数定义一个新的lambda函数。
f = lambda x: x**2
j=0
J=2
while j<J:
f2 = lambda x: 0.5*f(x)
f = f2
j+=1
我期望f(3)的结果为2.25 = 0.5 * 0.5 * 3 ** 2。但是,我收到以下错误:
RecursionError: maximum recursion depth exceeded
我认为lambda函数可以像这样灵活使用。我想有一种已知的pythonic方式如何正确地做到这一点?
答案 0 :(得分:3)
lambda中的名称f
在调用lambda时被查找 - 此时它引用lambda本身,因此是无限递归。
在特定时刻捕获值的通常习惯是使其成为lambda的默认参数,在定义时对其进行评估:
f2 = lambda x, f=f: 0.5*f(x)
答案 1 :(得分:3)
创建lambda
函数时,它会维护对本地环境的引用,以便在调用lambda
时可以在lambda
内查找变量。您需要将第一个f = lambda x: x**2
j=0
J=2
while j<J:
f2 = lambda x, f=f: 0.5*f(x)
f = f2
j+=1
函数作为参数传递给第二个函数:
Array
(
[files] => Array
(
[0] => news/idENPYygDf.png
)
[metas] => Array
(
[0] => Array
(
[date] => Tue, 21 Feb 2017 03:55:27 +0100
[extension] => png
[file] => news/idENPYygDf.png
[name] => idENPYygDf.png // Can't get this Name
[old_name] => lobat.png
[replaced] =>
[size] => 313342
[size2] => 306.00 KB
[type] => Array
(
[0] => image
[1] => png
)
)
)
)
请注意,Python docs FAQ。
中介绍了这一点