小编典典

优雅地应用Python函数列表

python

我有一个输入值val和按顺序应用的功能列表:

funcs = [f1, f2, f3, ..., fn]

如何优雅地申请而不是写作

fn( ... (f3(f2(f1(val))) ... )

也不使用for循环:

tmp = val
for f in funcs:
    tmp = f(tmp)

感谢Martijn的出色回答。我发现了一些阅读内容:https : //mathieularose.com/function-composition-in-
python/。


阅读 151

收藏
2020-12-20

共1个答案

小编典典

使用reduce()功能

# forward-compatible import
from functools import reduce

result = reduce(lambda res, f: f(res), funcs, val)

reduce()将第一个参数(可调用)应用于从第二个参数获取的每个元素,加上到目前为止的累计结果(如(result, element))。第三个参数是一个起始值(funcs否则将使用的第一个元素)。

在Python
3中,内置函数被移到了functools.reduce()location;为了向前兼容,Python
2.6及更高版本中提供了相同的参考。

其他语言可能将其称为折叠

如果每个函数也需要 中间
结果,请使用itertools.accumulate()(仅从Python
3.3开始,用于带有函数参数的版本):

from itertools import accumulate, chain
running_results = accumulate(chain(val, funcs), lambda res, f: f(res))
2020-12-20