鱼C论坛

 找回密码
 立即注册
查看: 2098|回复: 0

[技术交流] 十一章节:生成器

[复制链接]
发表于 2017-8-30 21:41:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
             49课时:乱入:生成器
生成器是一种特殊的迭代器,有了迭代器为什么还要生成器呢?因为可以使得python更为简洁优雅,因为生成器不需要在类里面重写__iter_()和__next__()方法,只需要加入一个yield语句。
yield语句
协同程序:所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。python里的生成器就类似协同程序。一旦一个函数里面出现了yield语句,这个函数就被视作一个生成器。
以普通函数为例,函数运行后把控制权交还给用户有三种情况:1、出现异常2、遇到return等人为设置的退出动作3、完全运行结束。这就是一个完整的运行流程        

加入一个yield语句后运行流程暂停并返回一个值,然后遇到调用回到刚刚暂停的地方继续执行下去。这就是yield语句的作用

举例说明:
  1. >>> def my_fun():
  2.         print('生成器被执行!')
  3.         yield 1
  4.         yield 2

  5.         
  6. >>> test = my_fun()
  7. >>> next(test)                        #生成器是特殊的迭代器,可以使用next()
  8. 生成器被执行!        #遇到第一个yield,暂停流程,并把后面的1返回
  9. 1
  10. >>> next(test)                #再次执行,又遇到yield,暂停并返回2
  11. 2
  12. >>> next(test)                #再执行,后面没有代码要执行了,就抛出StopIteration
  13. Traceback (most recent call last):
  14.   File "<pyshell#15>", line 1, in <module>
  15.     next(test)
  16. StopIteration
复制代码

试试斐波那契数列
  1. >>>def fibs():
  2.         x = 0
  3.         y = 1
  4.         while True:
  5.                 x, y = y, x+y
  6.                 yield x
  7. >>> for i in fibs():
  8.         if i >100:
  9.                 break
  10.         else:
  11.                 print(i, end=' ')

  12.                
  13. 1 1 2 3 5 8 13 21 34 55 89
复制代码


生成器表达式
>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (i for i in range(10))
<generator object <genexpr> at 0x0392C990>

前者是一个列表推导式,后者把中括号改为圆括号就成为了一个生成器表达式。
生成器表达式返回的是一个生成器对象,可以作为函数的参数来使用。
例如:
>>> sum(i for i in range(10))             #作为参数可以不用加上括号
45








评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 05:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表