【问题标题】:how to pass nested function as an argument如何将嵌套函数作为参数传递
【发布时间】:2017-05-03 15:45:55
【问题描述】:

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

【问题讨论】:

  • 你问的是函数composition(而不是嵌套)stackoverflow.com/questions/16739290/…
  • 你描述的是“函数组合”。如果您想做这种函数式编程,请考虑使用专用于该目的的库:toolz.readthedocs.io/en/latest/…。或者试试foo=lambda l: sum(map(abs, l))
  • 附带说明,通常建议返回生成器而不是列表,对于您的_abs,它将是:return (abs(i) for in iterable)
  • @jonrsharpe 这是一个很好的解决方案,正是我一直在寻找的。 MarkusMeskanen 为什么会这样?
  • @MarkusMeskanen 或 map(abs, iterable) 如果他们使用的是 3.x。

标签: python function nested


【解决方案1】:
def compose(funcs, funcargs):
    for func in reversed(funcs):
        funcargs = func(funcargs)
    return funcargs

【讨论】:

  • 这会以错误的(或至少,非常规)顺序应用它们。
  • @jonrsharpe,我会修改我的答案。
【解决方案2】:

或者,更一般地组合(即使用任意数量的参数函数):

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

【讨论】:

    【解决方案3】:

    你可以创建一个显式的 compose 函数

    >>> def compose(f, g):
    ...   return lambda x: f(g(x))
    ...
    

    那就用吧

    >>> A(list, compose(sum, _abs))
    10
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多