无法想象这个功能组成代码

时间:2013-12-18 21:53:12

标签: python

我写了一个代码来获取n个函数并将它们组合在一起。如果函数没有收到任何输入,它返回“x”,我们称之为lambda函数。(example-compose()(3)#将返回3) 这是我的代码,我似乎无法看到问题:

def compose(*funcs):
    if len(funcs)==0:
        return lambda x: x
    else:
        for i in funcs[-1:0:-1]:

            return lambda x: funcs[0](funcs[i](x))

5 个答案:

答案 0 :(得分:2)

假设您有三个功能:

def f1(x):
    return 'f1 %s' % x

def f2(x):
    return 'f2 %s' % x

def f3(x):
    return 'f3 %s' % x

然后我们有一个函数compose:

def compose(*funcs):
    def f(x):
        ret = x
        for func in funcs[::-1]:
            ret = func(ret)
        return ret
    return f

我们可以像这样使用它:

F = compose(f1, f2, f3)
print F('x')

它会打印出来:

f1 f2 f3 x

希望这就是你想要的。

答案 1 :(得分:1)

实现功能组合的常用方法是:

def compose(*funcs):
    def _inner(x):
        functools.reduce(lambda acc, f: f(acc), funcs, x)
    return _inner

但是,为了修复您的代码,您可能会这样做:

def compose(*funcs):
    if not funcs:    # preferred to checking if len is 0
        return lambda x: x
    else:
        return lambda x: funcs[0](compose(*funcs[1:])(x))

答案 2 :(得分:0)

我认为你在谈论

def fn1(x):
    return x+1
def fn2(x):
    return x**2
def fn3(x):
    return math.sin(x)**0.5

def apply(my_list_of_stuff):
    if len(my_list_of_stuff) == 1:
         return my_list_of_stuff[0]
    return my_list_of_stuff[0](apply(my_list_of_stuff[1:]))

apply([fn1,fn2,fn3,7]) # -> fn1(fn2(fn3(7)))

假设我理解你的要求

答案 3 :(得分:0)

使用reduce可以优雅地实现功能组合。您也可以使用初始值设定项参数来实现无输入条件:

import functools

def compose(*funcs):
    return functools.reduce(lambda f, g: lambda x: f(g(x)), funcs, lambda x: x)

答案 4 :(得分:0)

我认为实现这个的更好方法是:

def compose(*funcs):
    chain = lambda f, g: lambda *a, **kw: f(g(*a, **kw))
    return reduce(chain, funcs, lambda x: x)

这将返回一个新函数,该函数是传递给它的函数列表的组成。如果你不关心kwargs,你可以这样做:

def compose(*funcs):
    chain = lambda f, g: lambda *a: f(g(*a))
    return reduce(chain, funcs, lambda x: x)

示例:

>>> def compose(*funcs):
...     chain = lambda f, g: lambda *a: f(g(*a))
...     return reduce(chain, funcs, lambda x: x)
...
>>> remove_newlines = compose(lambda l: "".join(l), lambda s: s.split("\n"))
>>> remove_newlines("hello\n world")
'hello world'

注意:在python3中,reduce已从stdlib移出到functools中,因此您需要执行from functools import reduce