Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中递归定义函数_Python_Python 3.x_Loops_Lambda - Fatal编程技术网

在python中递归定义函数

在python中递归定义函数,python,python-3.x,loops,lambda,Python,Python 3.x,Loops,Lambda,我有一个关于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 我认为lambda函数可以像这样灵活地使用。我想有一种已知的pythonic方法可以正确地做到这一点?在调用lambda时,会查找lambda中的名称f,此时它引用lambda本

我有一个关于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

我认为lambda函数可以像这样灵活地使用。我想有一种已知的pythonic方法可以正确地做到这一点?

在调用lambda时,会查找lambda中的名称
f
,此时它引用lambda本身,因此是无限递归

在特定时刻捕获值的常用习惯用法是将其作为lambda的默认参数,该参数在定义时进行计算:

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

创建
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
f=lambda x:x**2
j=0
J=2

因为答案完全相同,所以我接受了第一个答案。谢谢,还有没有办法使用
def
而不是
lambda
?有没有办法使用
def
而不是
lambda
?当然,默认参数的相同技巧同样适用于常规函数。请记住,lambdas并没有向Python添加任何实际的新功能,它们只是定义真正简单函数的快捷方式。哇!这太疯狂了
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