清华大学计算机硕士为大家带来史上最详细的生成…
2018-07-23 05:41:50来源:博客园 阅读 ()
0.本集概览
1.生成器可以避免一次性生成整个列表
2.生成器函数的运行过程解析及状态保存
3.生成器表达式的使用方法
4.生成器表达式的可迭代特性
2.生成器函数
进群:125240963 即可获取数十套PDF哦!
下面具体结合例子说说生成器函数。
2.1.运行过程分析
首先,我们还没有详细介绍过函数,先简单说一下,常规函数接受输入的参数然后立即送回单个结果,之后这个函数调用就结束了。
运行结果:
那这么看,在for循环等真正的使用场景中使用也不难了 代码片段:
运行结果:
- 0 1 4 9 16
2.2.状态保存
我们进一步来说说生成器函数里状态保存的话题。在每次循环的时候,生成器函数都会在yield处产生一个值,并将其返回给调用者,即for循环。然后在yield处保存内部状态,并挂起中断退出。在下一轮迭代调用时,从yield的地方继续执行,并且沿用上一轮的函数内部变量的状态,直到内部循环过程结束。
关于这个问题,具体可以看看这个例子:
代码片段:
运行结果:
我们不难发现,生成器函数计算出x的平方后就挂起退出了,但他仍然保存了此时x的值,而yield后的print语句会在for循环的下一轮迭代中首先调用,此时x的值即是上一轮退出时保存的值。
3.生成器表达式
再说说生成器表达式吧。
3.1.使用方法
列表解析式已经是一个不错的选择,从内存使用的角度而言,生成器更优,因为他不用一次性生成整个对象列表,这二者之间如何转化呢?
生成器表达式写法上很像列表解析式,但是外面的方括号换成了圆括号,结果大不同,简单的看看: 代码片段:
- print([x ** 2 for x in range(5)])
- print((x ** 2 for x in range(5)))
运行结果:
- [0, 1, 4, 9, 16]
- <generator object <genexpr> at 0x0000000002212558>
- for x in (x ** 2 for x in range(5)):
- print(x, end=',')
运行结果:
- 0,1,4,9,16,
代码片段:
- print(sum(x ** 2 for x in range(5)))
运行结果:
- 30
代码片段:
- print(sorted((x ** 2 for x in range(5)), reverse=True))
运行结果:
- [16, 9, 4, 1, 0]
代码片段:
- print(list(x ** 2 for x in range(5)))
运行结果:
- [0, 1, 4, 9, 16]
3.3.集合解析式与生成器对象
集合解析式等效于将生成器对象传入到list、set、dict等函数中作为构造参数 代码片段:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:00x1 python分支循环
- python3基础之“术语表(2)” 2019-08-13
- 单例模式 2019-07-24
- Python-13-模块和包 2019-07-24
- 第一章 计算机基础 2019-07-24
- python中的进制转换和原码,反码,补码 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash