2017-02-10 49 views
2

我試圖學習Python,通過學習Python書閱讀,並遇到在生成器中使用return語句的部分,我發現很難將它包裹在它周圍。在生成器中使用return語句

它說,雖然在生成器函數中使用return語句,但它會產生一個StopIteration異常以提高效率,從而有效地結束迭代。如果return聲明實際上是使該函數返回某些內容,則會破壞迭代協議。

下面的代碼示例

def geometric_progression(a, q): 
    k = 0 
    while True: 
     result = a * q**k 
     if result <= 100000: 
      yield result 
     else: 
      return 
     k += 1 

for n in geometric_progression(2,5): 
    print(n) 

誰能請解釋它,以及如何在其他任何情況下繼續使用它。提供額外的例子,如果你可以。

+0

只要把它看成是儘早停止迭代。在這種情況下,條件'result <= 100000'使發生器停止產生大於'100000'的結果,這是一種人爲的做法,因爲你可以在<= 100000'時使while循環達到相同的效果效果(對'result'有一些適當的初始值)。老實說,我不認爲它使用得太多,但有些情況下,你想立即停止迭代,可能會派上用場。 –

+0

[在Python 3.3中與yield一起返回生成器的可能的副本](http://stackoverflow.com/questions/16780002/return-in-generator-together-with-yield-in-python-3-3) –

+0

@ Chris_Rands - FWIW,這與這個問題略有不同。這就是具體問什麼「返回值」的意思,而這是問裸迴歸(因此也適用於python2.x)。我同意 - 他們很相似,我可以理解,如果這樣做最終會被封閉爲: - ) – mgilson

回答

3

return在發生器中只是語法糖raise StopIteration。在python 3.3(?)+中,你也可以返回一個值(return value == raise StopIteration(value))。至於你爲什麼要把它放在那裏,明顯提高StopIteration意味着發電機將停止產出物品。換句話說,發生器完成執行 - 就像return表示函數執行結束。類似地,任何迭代生成器的東西(例如for循環)都會明白它應該停止嘗試從生成器中獲取值。

已添加return value位以支持使用協同例程IIRC的一些工作流程。這是一個非常先進的功能,但在各種異步上下文中發現了很多有用的功能。

+0

因此,這裏的'return'語句意味着當它達到需要的特定值時從迭代中突破? – phawk

+0

@phawk - 是的。非常好。 – mgilson