繁体   English   中英

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

[英]Better way to call a chain of functions in python?

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

像这样:

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

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

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

使用循环:

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

你可以使用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 )。

传播函数式编程:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM