【问题标题】:Defining functions recursively in python在python中递归定义函数
【发布时间】:2017-07-10 12:22:41
【问题描述】:

我有一个关于 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方法可以正确地做到这一点?

【问题讨论】:

    标签: python python-3.x loops lambda


    【解决方案1】:

    创建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 对此进行了介绍。

    【讨论】:

    • 因为答案完全一样,所以我接受了第一个。谢谢
    • 还有没有办法使用def而不是lambda来做到这一点?
    【解决方案2】:

    在您的 lambda 中查找名称 f在调用 lambda 时 - 此时它指的是 lambda 本身,因此是无限递归。

    在特定时刻捕获值的常用习惯用法是使其成为 lambda 的默认参数,在定义时对其进行评估:

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

    【讨论】:

    • 还有没有办法使用def而不是lambda来做到这一点?
    • 当然,使用默认参数的相同技巧同样适用于常规函数。请记住,lambda 不会向 Python 添加任何实际的新功能,它们只是定义非常简单的函数的快捷方式。
    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2023-01-12
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2023-04-01
    • 2014-07-11
    相关资源
    最近更新 更多