簡體   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