天天看點

yield 的了解

最近在學習Python的時候看到yield的相關文法,感覺很獨特,相比其他如C/C++的文法比較有意思,于是在看完資料相關章節做一個總結。

  yield 是一個類似于 return的文法,但是對于return 而言,在其執行之後,意味着将資料傳回給調用者,子程式結束,但是yield卻不一樣,它能夠繼續執行,直到下一個yield 轉交執行權,之後又可以進入繼續執行,周而複始,直到抛出異常。

  for in range()是一個簡單有用的循環,之前的學習知道range()傳回的是一個對象,有惰性求值的特點,下面是一個利用yield簡單模拟range()函數的特點

結果:

這種獨特文法現象的原因,從書中摘出相關資料如下:

  當函數中使用yield産生一個值的時候,調用函數會傳回一個generator對象,也就是一個生成器,此對象有__next__()方法,通常會調用next()調用該方法取出下一個産生的值,若無法産生下一個值,就會發生StopIteration這樣的異常  --《Python程式設計教程》

除了解釋以上現象,反之也可推測 for in 函數的參數可以是生成器,生成器具有惰性求值特點,推測之前遇到過惰性求值的都是生成器(推測)

yield可以通過send函數來産生值,下面用一個課本上的DEMO來熟悉其相關函數的使用,課本完成了一個生産者消費者模型:

上面注釋的地方比較有意思,隻是執行一次yield,而沒有任何輸出,似乎是沒用,但是删除之後程式卻無法執行,我的了解是必須執行一次使值轉化成生成器對象才能接受相關資料。

為了印證我的觀點,執行以下代碼:

輸出:

本文轉自xsster51CTO部落格,原文連結http://blog.51cto.com/12945177/1932220: ,如需轉載請自行聯系原作者