我写了一个代码来获取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))
答案 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