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

相关文章
相关标签/搜索