2016-12-05 90 views
0

有什麼辦法可以調用一次函數,然後在不同時間返回數據多次?Python:如何在函數調用期間多次返回數據

例如,假設我有以下代碼:

def do_something(): 
    for i in range(1, 10): 
     return 1 

不過,我希望能夠從一個函數調用返回多個數據塊,但在異步時間,這是可能的?


對於情況下,我有一個生成word文檔,將它們轉換成PDF文件的程序,然後將它們組合成一個單一的PDF文檔。我希望能夠通過GUI調用外部函數來創建文檔,然後顯示一個進度條,通過該函數顯示當前進度。


編輯:

我已經知道了yield功能。我認爲問題底部的具體問題會有所幫助。爲了更清楚,我正在尋找的是從函數返回多個值併爲返回的每個值導致不同的事件的方法。雖然它可能是一個壞榜樣,我要的是能夠做的是類似於JavaScript中的.then(){}東西,但能夠使用多個返回值

+1

是的,有一些是正是:'yield' http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do – Iluvatar

+0

沒有'yield'你必須調用一次又一次。他希望它被稱爲單一時間。 – harshil9968

+1

@ harshil9968發電機需要調用一次。您存儲迭代器,然後再次調用**迭代器**。這是for循環語義所做的。重複調用該函數會導致迭代器失去狀態並從頭開始。 – bashrc

回答

0

.then(){}執行您想要一臺發電機:

def do_something(): 
    for i in range(1,10): 
     yield i 

nums = do_something() 

每當您撥打nextnums時,do_something的主體將繼續執行到下一個yield語句,此時它將返回該值。

>>> print next(nums) # Outputs 1 
>>> print next(nums) # Outputs 2 
>>> ... 
+0

你讀過他的問題陳述嗎?我認爲這不會解決他的問題。 – harshil9968

+0

這是一半。他需要一個生成器,但它不會隨意間隔地自動調用自己來爲未指定的消費者提供價值。 – chepner

+0

感謝您的回答,但我已經意識到「yield」功能。我認爲我在問題底部的具體問題會有所幫助,我正在尋找的是從函數中返回多個值併爲返回的每個值導致不同事件的方法 – Ronikos

0

您正在查看generators

而不是從您的函數返回yield(讀取What does the "yield" keyword do in Python?)。

def do_something(): 
    for i in range(1, 10): 
     yield i 

如果你想重複調用這個函數,你將需要一個重複調用這個函數的包裝器。有點類似:

def worker(): 
    for i in do_something(): 
     UpdateProgress(i) 
     sleep(prgressInterval) 

    thread = Thread(target=worker) 
    thread.start() 
+0

感謝您的回答,但我已經意識到「yield」功能。我認爲我的問題底部的具體問題將有所幫助,我正在尋找的是從函數返回多個值並導致返回的每個值的不同事件 – Ronikos

+0

@Ronikos更新了答案。 – bashrc

1

yield是返回或從功能越來越多值提到的幾乎每個人的東西。

閱讀完您的問題陳述。這是我爲你設計的解決方案。

創建一個函數來更新狀態欄,狀態欄的值將從全局變量中獲取。所以global x=0在開始,並在更新功能,它將首先更新x = x+1然後,它會增加狀態欄。

def do_something(): 
    for i in range(1, 10): 
     # fetch and perform operation on that Doc for PDF 
     update_status_bar() 
相關問題