参考连接: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