如何防止lambda函数递归调用自身?

时间:2018-04-12 21:55:14

标签: python lambda

在我的代码中,我首先定义了两个lambda函数:

func1 = lambda x: x + 2
func2 = lambda x: x * 2

以后在我的代码中,我想创建一个lambda函数,它添加上面两个lambda函数的结果,但是这个函数必须与上面的函数之一具有相同的名称。也就是说,我想做这样的事情:

func2 = lambda x: func1(x) + func2(x)

请注意,功能名称func2会再次出现。

我知道这很愚蠢,还有其他方法可以达到同样的预期效果。然而,这个例子只是我试图实现的一个非常简化的版本。但是,这不起作用,因为它给了我错误:

  

RecursionError:超出最大递归深度

我认为这是因为func2一直在呼唤自己。有没有办法防止这种情况发生?我无法更改名称func1func2(请注意,这也意味着我无法创建两个具有不同名称但内容相同的新函数)。我试过这样的事情

func2Copy = lambda x: func2(x)
func1Copy = lambda x: func1(x)
func2 = lambda x: func1Copy(x) + func2Copy(x)

但看到了同样的错误(如预期的那样)。我正在尝试做什么?

2 个答案:

答案 0 :(得分:7)

你可以使用一些间接

func2 = (lambda f1, f2: lambda x: f1(x) + f2(x))(func1, func2)

那么

>>> func2(1)
5

这有点傻 - 短篇小说是你需要另一个功能。

答案 1 :(得分:4)

您需要保存原始功能的参考。快速而肮脏的方法是将它们作为lambda的默认参数。

func2 = lambda x, func1=func1, func2=func2: func1(x) + func2(x)

否则,更安全的方法是创建一个可以返回已更改函数的函数。

def new_func2(func1, func2):
    return lambda x: func1(x) + func2(x)
func2 = new_func2(func1, func2)