參考連接:css
http://blog.163.com/l_greatsea/blog/static/2049860442013220113640476/html
http://blog.chinaunix.net/uid-11989741-id-3389226.html函數
前一篇文章主要講解yield的用法,後面文章主要講了使用send的一個例子。可是以前理解起來一直困難。代碼以下:ui
結合兩篇文章,我將這個帶yield的函數分紅4部分。spa
紅色部分,yield以前。.net
綠色部分,yield將要返回的表達式。unix
紫色部分,yield語句。htm
黃色部分,yield以後的部分。blog
根據概念,我沒每調用一次generator的next()方法都會返回一次yield表達式的值。yield自己返回None,可是send(value)能夠給yield賦值。generator
咱們來看下面的運行過程:
c = countdown(5)
這句產生一個迭代器。
在for循環第一次print x 。將調用一次c.next()。
按照個人理解這第一次c.next()會運行紅色部分代碼,而後將綠色部分」n「這個值返回。因此第一次會打印5.(注意:這個時候想像成沒有運行紫色部分,yield這個語句)
接下來運行if判斷的語句。c.send(3)。從以前的兩篇文章中能夠得出結論:send自己算是一個next,可是它有一個功能就是能將yeild有返回值,值就是send的這個value。
因此,運行 ‘newvalue = yield’ 就至關於運行了newvalue=3.而後直接往下執行,直到下一次有遇到yield n。返回n值。而後進入下一次for循環的c.next().
下一次c.next()的時候yield語句(或者說是表達式)返回None,進入n -= 1。而後在下一個yield以前返回n值。以此類推。
我以爲這樣比文章2中的解釋好理解的多。歡迎交流。shezfp@qq.com