首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecursionError合成羔羊

RecursionError合成羔羊
EN

Stack Overflow用户
提问于 2016-11-10 00:58:21
回答 1查看 189关注 0票数 3

我正在尝试编写一个函数,它包含任意数量的lambda函数。

我有两个简单的lambda函数。

代码语言:javascript
复制
f = lambda x: x + 1
g = lambda x: x**2

我尝试编写函数是这样的:

代码语言:javascript
复制
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组成的函数。

代码语言:javascript
复制
c = compose(f, g)

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

代码语言:javascript
复制
RecursionError: maximum recursion depth exceeded

我想引入一个中间变量可以解决这个问题。

代码语言:javascript
复制
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

但也会引发同样的错误。

有办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-10 01:11:44

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

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

代码语言:javascript
复制
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的一个很好的用例。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40518460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档