假设我们在python中有函数:
def _abs(iterable): #cause its normally for one element only
return [abs(i) for i in iterable]
def A(list, foo):
return foo(list)
list = [2,3,-5]
print( A(list,foo=sum) )
>> 0
虽然我可以将foo=sum
传递给A,但我正在寻找一种优雅的方法来传递foo=sum(_abs)
之类的内容来执行sum(_abs(list))
。
我现在看到的唯一方法是发送函数列表[sum, _abs]
并按顺序应用它们。还有更好的方法吗?
答案 0 :(得分:5)
或者,更一般地构成(即具有任意数量的参数函数):
from functools import partial, reduce
def compose(*funcs):
return partial(reduce, lambda x, f: f(x), reversed(funcs))
(请参阅partial
和reduce
上的文档 - 请注意,您不需要在Python 2.x中导入reduce
然后:
>>> compose(sum, _abs)([2, 3, -5])
10
答案 1 :(得分:4)
你可以制作一个明确的撰写函数
>>> def compose(f, g):
... return lambda x: f(g(x))
...
然后使用它
>>> A(list, compose(sum, _abs))
10
答案 2 :(得分:2)
def compose(funcs, funcargs):
for func in reversed(funcs):
funcargs = func(funcargs)
return funcargs