在python中调用函数链的更好方法是什么?

时间:2013-12-08 13:44:45

标签: python

我有一系列操作需要一个接一个地发生,每个操作都依赖于前一个函数的输出。

像这样:

out1 = function1(initial_input)
out2 = function2(out1)
out3 = function3(out2)
out4 = function4(out3)

等约10次。它在代码中看起来有点难看。

写它的最佳方法是什么?有没有办法使用一些函数编程魔术处理它?有没有更好的方法来调用和执行这个功能链?

4 个答案:

答案 0 :(得分:5)

使用循环:

out = initial_input
for func in [function1, function2, function3, function4]:
    out = func(out)

答案 1 :(得分:4)

您可以使用functools.reduce:

out = functools.reduce(lambda x, y : y(x), [f1, f2, f3, f4], initial_value)

引用functools.reduce文档:

  

将两个参数的函数累加应用于序列的项目,   从左到右,以便将序列减少到单个值。   例如,reduce(lambda x,y:x + y,[1,2,3,4,5])计算   ((((1 + 2)3)4)5)。如果存在initial,则将其放在项目之前   计算中的序列,并作为默认值   序列是空的。

在这里,我们使用的事实是函数可以被视为Python中的任何变量,而匿名函数只是“将x应用于函数y”。

这种“减少”操作是一种非常通用的模式的一部分,它已成功应用于并行化任务(参见http://en.wikipedia.org/wiki/MapReduce)。

答案 2 :(得分:3)

稍微传播函数式编程:

In [1]: compose = lambda f, g: lambda arg: f(g(arg))

In [2]: from functools import reduce

In [3]: funcs = [lambda x:x+1, lambda x:x*2]

In [4]: f = reduce(compose, funcs)

In [5]: f(1)
Out[5]: 3

In [6]: f(3)
Out[6]: 7

答案 3 :(得分:1)

您可以将返回值直接传递给下一个函数:

out4 = function4(function3(function2(function1(initial_input))))

但这不一定更好,也许可读性较差。