2017-02-21 59 views
3

我有一个关于lambda函数的简单问题。我想做一个循环,其中每次迭代都定义一个基于前一次迭代的lambda函数的新lambda函数。python中递归地定义函数

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如何正确地做到这一点?

回答

3

在你的拉姆达内部的名称f在当时称为的时候抬头- 在这一点上它指的是拉姆达本身,因此是无限递归。

的常用成语的时间在特定时刻捕获值,使其在lambda,它获取在定义时计算的默认参数:

f2 = lambda x, f=f: 0.5*f(x) 
+0

是否还有一种方法可以使用'def'而不是'lambda'来执行此操作? – splinter

+0

当然,与默认参数相同的技巧也适用于常规功能。请记住,lambdas不会为Python添加任何实际的新功能,它们只是定义真正简单函数的捷径。 – jasonharper

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 

注意,这是覆盖在Python docs FAQ

+0

因为答案完全一样,我接受了第一个答案。谢谢 – splinter

+0

不用担心,你不能同时接受:) –

+0

也有一种方法可以使用'def'而不是'lambda'来执行此操作吗? – splinter