- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Python函数式编程指南生成器
Python函数式编程指南(四):生成器生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。这是函数式编程指南的最后一篇,似乎拖了一个星期才写好,嗯……转载请注明原作者和原文地址:)4. 生成器(generator)4.1. 生成器简介首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。从Python 2.5开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。4.2. 生成器函数4.2.1. 使用生成器函数定义生成器如何获取一个生成器?首先来看一小段代码:1234567 def?get_0_1_2():...?? yield?0...?? yield?1...?? yield?2... get_0_1_2function get_0_1_2 at 0x00B2CB70我们定义了一个函数get_0_1_2,并且可以查看到这确实是函数类型。但与一般的函数不同的是,get_0_1_2的函数体内使用了关键字yield,这使得get_0_1_2成为了一个生成器函数。生成器函数的特性如下:调用生成器函数将返回一个生成器;123 generator =?get_0_1_2() generatorgenerator object?get_0_1_2 at 0x00B1C7D8第一次调用生成器的next方法时,生成器才开始执行生成器函数(而不是构建生成器时),直到遇到yield时暂停执行(挂起),并且yield的参数将作为此次next方法的返回值;12 generator.next()0之后每次调用生成器的next方法,生成器将从上次暂停执行的位置恢复执行生成器函数,直到再次遇到yield时暂停,并且同样的,yield的参数将作为next方法的返回值;1234 generator.next()1 generator.next()2如果当调用next方法时生成器函数结束(遇到空的return语句或是到达函数体末尾),则这次next方法的调用将抛出StopIteration异常(即for循环的终止条件);1234 generator.next()Traceback (most recent call last):??File?stdin, line 1, in?moduleStopIteration生成器函数在每次暂停执行时,函数体内的所有变量都将被封存(freeze)在生成器中,并将在恢复执行时还原,并且类似于闭包,即使是同一个生成器函数返回的生成器,封存的变量也是互相独立的。?我们的小例子中并没有用到变量,所以这里另外定义一个生成器来展示这个特点:12345678910111213 def?fibonacci():...?? a =?b =?1...?? yield?a...?? yield?b...?? while?True:...???? a, b =?b, a+b...???? yield?b... for?num in?fibonacci():...?? if?num 100: break...?? print?num,...1?1?2?3?5?8?13?21?34?55?89看到while True可别太吃惊,因为生成器可以挂起,所以是延迟计算的,无限循环并没有关系。这个例子中我们定义了一个生成器用于获取斐波那契数列。4.2.2. 生成器函数的FAQ接下来我们来讨论一些关于生成器的有意思的话题。你的例子里生成器函数都没有参数,那么生成器函数可以带参数吗??当然可以啊亲,而且它支持函数的所有参数形式。要知道生成器函数也是函数的一种:)12345 def?counter(start=0):...?? while?True:...???? yield?start...???? start +=?1...这是一个从指定数开始的计数器。既然生成器函数也是函数,那么它可以使用return输出返回值吗??不行的亲,是这样的,生成器函数已经有默认的返回值——生成器了,你不能再另外给一个返回值;对,即使是return None也不行。但是它可以使用空的return语句结束。如果你坚持要为它指定返回值,那么Python将在定义的位置赠送一个语法错误异常,就像这样:123456 def?i_wanna_return():...?? yield?None...?? return?N
您可能关注的文档
- lol英雄联盟连招大全.doc
- Lookatmytoys教学设.docx
- Longerthanlife合唱与比赛1.doc
- linux软件安装说明.doc
- LPDDR4与LPDDR3的区别.doc
- LOL英雄联盟S3新旧装备全部改动最新最全面信息.docx
- LR出现SystemExceptionsEXCEPTIONACCESSVIOLATION的解决方法.doc
- l雷锋月演讲比赛策划书.doc
- Mac下配置Press环境的方法.docx
- Mac下编译OpenSSL静态库.doc
- 数据仓库:Redshift:Redshift与BI工具集成.docx
- 数据仓库:Redshift:数据仓库原理与设计.docx
- 数据仓库:Snowflake:数据仓库成本控制与Snowflake定价策略.docx
- 大数据基础:大数据概述:大数据处理框架MapReduce.docx
- 实时计算:GoogleDataflow服务架构解析.docx
- 分布式存储系统:HDFS与MapReduce集成教程.docx
- 实时计算:Azure Stream Analytics:数据流窗口与聚合操作.docx
- 实时计算:Kafka Streams:Kafka Streams架构与原理.docx
- 实时计算:Kafka Streams:Kafka Streams连接器开发与使用.docx
- 数据仓库:BigQuery:BigQuery数据分区与索引优化.docx
文档评论(0)