我正在尝试编写一个函数,它包含任意数量的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函数中包含一个新函数。
然后,我可以创建一个由f和g组成的函数。
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但也会引发同样的错误。
有办法解决这个问题吗?
发布于 2016-11-10 01:11:44
首先,我认为您的方法会受到后期闭包绑定的影响,因为lambda中的function只会在迭代结束时使用函数的最后一个值。其次,由于第一个原因,composed最终只能递归地调用自己;composed -- lambda --调用composed的最后一个值--本身!
一个可能的解决方法是在每次迭代时将composed和function绑定到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))
# 26https://stackoverflow.com/questions/40518460
复制相似问题