python yield理解

參考連接:css

http://blog.163.com/l_greatsea/blog/static/2049860442013220113640476/html

http://blog.chinaunix.net/uid-11989741-id-3389226.html函數

前一篇文章主要講解yield的用法,後面文章主要講了使用send的一個例子。可是以前理解起來一直困難。代碼以下:ui

  1. def countdown(n):
  2.     print "Counting down from", n
  3.     while n >= 0:
  4.         newvalue = yield n
  5.         if newvalue is not None:
  6.             n = newvalue
  7.         else:
  8.             n -= 1
  9. # The holy grail countdown
  10. c = countdown(5)
  11. for x in c:
  12.     print x
  13.     if x == 5:
  14.         c.send(3)

結合兩篇文章,我將這個帶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

相關文章
相關標籤/搜索