20
2017
10

python 的生成器(generator)

要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。看下面的例子,杨辉三角:

C:\Users>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def yanghui():
...     L=[1]
...     while True:
...         yield L
...         L.append(0)
...         L = [L[i-1] + L[i] for i in range(len(L))]  # i 是从 0 开始,range 返回的范围是 0 ... len(L) - 1
...
>>> n = 0
>>> for t in yanghui():
...     print(t)
...     n+=1
...     if n == 10:
...         break
...
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
>>>

因为 generator 和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而 generator 的函数,在每次调用next()的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继续执行。所以 yanghui() 一遇到 yield 就暂停,让后输出 L 。再次循环调用他会继续执行下面的语句,再次循环 到 yield 然后输出 L, 此时的 L 是经过计算的 下一行列表。

    注意L = [1]   L = L.append(0) 不对,这样 print(t) 返回 None, 英文 append 不返回值。

>>> x = [1]
>>> x = x.append(0)
>>> x
>>> print(x)
None
>>>

但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIterationvalue中: 此问题待解决


  generator function产生的generator与普通的function有什么区别呢

  (1)function每次都是从第一行开始运行,而generator从上一次yield开始的地方运行

  (2)function调用一次返回一个(一组)值,而generator可以多次返回

  (3)function可以被无数次重复调用,而一个generator实例在yield最后一个值 或者return之后就不能继续调用了


参考

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

http://www.cnblogs.com/xybaby/p/6322376.html


« 上一篇 下一篇 »

评论列表:

1.今天头条新闻  2017-10-22 20:39:29 回复该评论
文章不错支持一下

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。