生成器的那些隐藏技能你肯定不知道!最详细的使…
2018-07-18 01:16:04来源:博客园 阅读 ()
---恢复内容开始---
1.避免一次性生成整个列表
避免一次性生成整个结果列表的本质是在需要的时候才逐次产生结果,而不是立即产生全部的结果,Python中有两种语言结构可以实现这种思路。
一个是生成器函数。外表看上去像是一个函数,但是没有用return语句一次性的返回整个结果对象列表,取而代之的是使用yield语句一次返回一个结果。
运行的过程是这样的:生成器函数返回一个迭代器,for循环等迭代环境对这个迭代器不断调用next函数,不断的运行到下一个yield语句,逐一取得每一个返回值,直到没有yield语句可以运行,最终引发StopIteration异常。看,这个过程是不是很熟悉。
首先,下面这个例子证实了生成器函数返回的是一个迭代器 代码片段:
那这么看,在for循环等真正的使用场景中使用也不难了 代码片段:
2.2.状态保存
我们进一步来说说生成器函数里状态保存的话题。在每次循环的时候,生成器函数都会在yield处产生一个值,并将其返回给调用者,即for循环。然后在yield处保存内部状态,并挂起中断退出。在下一轮迭代调用时,从yield的地方继续执行,并且沿用上一轮的函数内部变量的状态,直到内部循环过程结束。
关于这个问题,具体可以看看这个例子:
3.生成器表达式
再说说生成器表达式吧。
3.1.使用方法
列表解析式已经是一个不错的选择,从内存使用的角度而言,生成器更优,因为他不用一次性生成整个对象列表,这二者之间如何转化呢?
生成器表达式写法上很像列表解析式,但是外面的方括号换成了圆括号,结果大不同,简单的看看: 代码片段:
代码片段:
- (sorted((x **
- 2
- for
- x
- in
- range(
- 5
- )), reverse=
- True
- ))
运行结果:
- [
- 16
- ,
- 9
- ,
- 4
- ,
- 1
- ,
- 0
- ]
代码片段:
- (list(x **
- 2
- for
- x
- in
- range(
- 5
- )))
运行结果:
- [
- 0
- ,
- 1
- ,
- 4
- ,
- 9
- ,
- 16
- ]
3.3.集合解析式与生成器对象
集合解析式等效于将生成器对象传入到list、set、dict等函数中作为构造参数 代码片段:
谢谢阅读,进群:125240963 即可获取数十套PDF哦!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Python学习日记(十) 生成器和迭代器 2019-08-13
- 那些搜过很多遍的python基础知识 2019-07-24
- python学习-39 生成器总结 2019-07-24
- python学习-38迭代器和生成器 2019-07-24
- Python-11-生成器 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