python中的顺序函数映射

时间:2016-02-14 21:54:05

标签: python itertools

我在列表中有很多功能:

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找出一种干净的方法。可能吗?这个顺序函数映射习语是否有名称?

2 个答案:

答案 0 :(得分:4)

在这里使用itertools毫无意义;您正在生成一个输出,并且您无法将其应用于无限可迭代。你必须在输入迭代中有一个有限个函数才能使它工作。

使用reduce() function

from functools import reduce

x = reduce(lambda res, func: func(res), funcs, x)

functools.reduce() import有助于Python 2和3中的上述工作。

reduce()以及map()filter()和是itertoolsfunctional 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)