我在列表中有很多功能:
funcs = [f1, f2, f3, f4, f5]
并且所有函数都返回一个参数,例如
f1 = lambda x: x*2
我想将所有这些功能映射到一起
result = lambda x: f5(f4(f3(f2(f1(x)))))
或迭代funcs
def dispatch(x):
for f in funcs:
x = f(x)
return x
dispatch
工作正常,但我无法使用iterools
找出一种干净的方法。可能吗?这个顺序函数映射习语是否有名称?
答案 0 :(得分:4)
在这里使用itertools
毫无意义;您正在生成一个输出,并且您无法将其应用于无限可迭代。你必须在输入迭代中有一个有限个函数才能使它工作。
from functools import reduce
x = reduce(lambda res, func: func(res), funcs, x)
functools.reduce()
import有助于Python 2和3中的上述工作。
reduce()
以及map()
,filter()
和是itertools
是functional programming中经常使用的工具。
答案 1 :(得分:2)
另一种(效率较低,唉)看待Martijn答案的方式是意识到你想要编写功能列表。
# function composition: compose(f,g)(x) = f(g(x))
def compose(f, g):
return lambda x: f(g(x))
# Identity for function composition
# compose(f, identity)(x) = f(x)
identity = lambda x: x
# result(x) = f1(f2(...fn(x)...))
result = reduce(compose, funcs, identity)