2013-04-06 106 views
0

我想知道是否有更pythonic或替代方法來做到這一點。我想比較累計函數的結果。每個函數都會修改前面的輸出,我希望在每個函數之後看到效果。請注意,爲了在運行主函數後獲得實際結果,需要最後一個函數來計算某些內容。在代碼中,事情是這樣的(只是僞代碼的那種):Python 3 - 累積函數替代方案

for textfile in path: 
    data = doStuff1(textfile) 
calculateandPrint() 

for textfile in path: 
    data = doStuff1(textfile) 
    data = doStuff2(data) 
calculateandPrint() 

for textfile in path: 
    data = doStuff1(textfile) 
    data = doStuff2(data) 
    data = doStuff3(data) 
calculateandPrint() 

正如你所看到的,對於n功能,我需要1/2(n(n+1))手動進行循環。像我說的那樣,是否有更多pythonic(例如帶有函數的列表),它會清理代碼並在添加越來越多的函數時使代碼變得更短,更易於管理?

的實際代碼,其中documents是一個自定義對象:

for doc in documents: 
    doc.list_strippedtext = prepareData(doc.text) 
bow = createBOW(documents) 

for doc in documents: 
    doc.list_strippedtext = prepareData(doc.text) 
    doc.list_strippedtext = preprocess(doc.list_strippedtext) 
bow = createBOW(documents) 

for doc in documents: 
    doc.list_strippedtext = prepareData(doc.text) 
    doc.list_strippedtext = preprocess(doc.list_strippedtext) 
    doc.list_strippedtext = abbreviations(doc.list_strippedtext) 
bow = createBOW(documents) 

而這僅僅是一小部分,更多的功能需要添加。

+1

在每一個你做的東西與循環變量循環,並將它放入'data',但後來放棄所有,但最後的結果循環。應該用'calculateandPrint()'調用縮進嗎? – 2013-04-06 07:58:51

+0

事實上你是對的,爲了使它更清晰:在每個循環中,我編輯一個對象內的變量,每個文本文件都有一個不同的對象。所以calculateandPrint()函數使用了所有的對象,因此使用了所有的'數據',儘管從我的例子中可能不清楚。但重點更多的是函數調用的迭代。 – Tim 2013-04-06 10:32:48

回答

3

你可以定義一組鏈,應用與functools.reduce()

from functools import reduce 

chains = (
    (doStuff1,), 
    (doStuff1, doStuff2), 
    (doStuff1, doStuff2, doStuff3), 
) 

for textfile in path: 
    for chain in chains: 
     data = reduce(lambda data, func: func(data), chain, textfile) 
     calculateandPrint(data) 

reduce()呼叫有效呢func3(func2(func1(textfile))如果chain包含3種功能。

我在這裏假設你想申請calculateandPrint()文本文件的路徑後,功能鏈已被應用。

for chain in chains循環的每次迭代代表你原來的例子你doStuffx循環體之一,但我們只遍歷for textfile in path一次

您也可以交換循環;調整你的例子:

for chain in chains: 
    for doc in documents: 
     doc.list_strippedtext = reduce(lambda data, func: func(data), chain, doc.text) 
    bow = createBOW(documents) 
+0

我認爲這接近我正在尋找的答案。我添加了實際的代碼,以便更好地瞭解需要完成的工作。是否有可能使用我的代碼鏈?那麼是否有可能修改鏈中對象的內容? – Tim 2013-04-06 10:41:30

+0

當然;只需在我的答案中交換兩個循環;將鏈循環移出,將每個鏈應用於文檔,內循環後調用createBOW()函數,每個鏈循環一次。 – 2013-04-06 11:04:00

+0

是的,這是完美的作品。非常感謝你 :-)。 – Tim 2013-04-06 19:54:12