如何将嵌套函数作为参数传递

时间:2016-12-18 12:15:41

标签: python function nested

假设我们在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]并按顺序应用它们。还有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

或者,更一般地构成(即具有任意数量的参数函数):

from functools import partial, reduce

def compose(*funcs):
    return partial(reduce, lambda x, f: f(x), reversed(funcs))

(请参阅partialreduce上的文档 - 请注意,您不需要在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