2016-02-14 23 views
0

我有一大堆的功能列表:连续函数映射在python

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来做到这一点。可能吗?这个顺序函数映射习语是否有名字?

回答

3

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

使用reduce() function

from functools import reduce 

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

functools.reduce() importmap()filter()有助于双方Python 2和3

reduce()上述工作,在一起,是的,itertools,是最常用的工具在functional programming

1

查看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)