gpt4 book ai didi

python - RecursionError 组成 lambda

转载 作者:行者123 更新时间:2023-11-28 17:23:07 28 4
gpt4 key购买 nike

我正在尝试编写一个由任意数量的 lambda 函数组成的函数。

我有两个简单的 lambda 函数。

f = lambda x: x + 1
g = lambda x: x**2

我对组合函数的尝试是这样的:

def compose(*functions):
composed = lambda x: x # Function that returns input
for function in reversed(functions):
composed = lambda x: function(composed(x))
return composed

我的想法是遍历可变数量的函数,每次都让 composed 函数在其中包含一个新函数。

然后我可以创建一个由 fg

组成的函数
c = compose(f, g)

因此调用 c(5) 应该返回 f(g(5)),即 26。但是,我得到了

RecursionError: maximum recursion depth exceeded

我认为引入一个中间变量可能会解决问题。

def compose(*functions):
composed = lambda x: x # Function that returns input
for function in reversed(functions):
intermediate = lambda x: function(composed(x))
composed = intermediate
return composed

但是报同样的错误。

有办法解决这个问题吗?

最佳答案

首先,我认为您的方法将受到后期闭包绑定(bind)的影响,因为 lambda 中的 function 只会在迭代结束时采用 function 的最后一个值。其次,由于第一个原因,composed最终只会递归调用自己; composed - lambda - 调用 composed 的最后一个值 - 本身!

一个可能的解决方法是在每次迭代时将 composedfunction 绑定(bind)到 lambda:

def compose(*functions):
composed = lambda x: x
for function in reversed(functions):
composed = lambda x, function=function, composed=composed: function(composed(x))
return composed

print(compose(f, g)(5))
# 26

但是您的整体问题看起来像是 functools.reduce 的一个很好的用例:

from functools import reduce

def compose(*functions):
def inner(v):
return reduce(lambda x, y: y(x), reversed(functions), v)
return inner

print(compose(f, g)(5))
# 26

关于python - RecursionError 组成 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40518460/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com