我有一个输入值val和按顺序应用的功能列表:
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/。
使用reduce()功能:
reduce()
# forward-compatible import from functools import reduce result = reduce(lambda res, f: f(res), funcs, val)
reduce()将第一个参数(可调用)应用于从第二个参数获取的每个元素,加上到目前为止的累计结果(如(result, element))。第三个参数是一个起始值(funcs否则将使用的第一个元素)。
(result, element)
funcs
在Python 3中,内置函数被移到了functools.reduce()location;为了向前兼容,Python 2.6及更高版本中提供了相同的参考。
functools.reduce()
其他语言可能将其称为折叠。
如果每个函数也需要 中间 结果,请使用itertools.accumulate()(仅从Python 3.3开始,用于带有函数参数的版本):
itertools.accumulate()
from itertools import accumulate, chain running_results = accumulate(chain(val, funcs), lambda res, f: f(res))