浅析Python中yield关键词的作用与用法


Posted in Python onNovember 29, 2016

前言

为了理解yield是什么,首先要明白生成器(generator)是什么,在讲生成器之前先说说迭代器(iterator),当创建一个列表(list)时,你可以逐个的读取每一项,这就叫做迭代(iteration)。

>>> mylist = [1, 2, 3]
>>> for i in mylist :
... print(i)
1
2
3

mylist 是一个可迭代的对象。当使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist :
... print(i)
0
1
4

可以使用“for··· in ··· ”来操作可迭代对象,如:list,string,files,这些迭代对象非常方便我们使用,因为你可以按照你的意愿进行重复的读取。但是你不得不预先存储所有的元素在内存中,那些对象里有很多元素时,并不是每一项都对你有用。

生成器同样是可迭代对象,但是你只能读取一次,因为它并没有把所有值存放内存中,它动态的生成值:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
... print(i)
0
1
4

看起来除了把 [] 换成 () 外没什么不同。但是,你不可以再次使用 for i in mygenerator , 因为生成器只能被迭代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个…

yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。

>>> def createGenerator() :
... mylist = range(3)
... for i in mylist :
...  yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...  print(i)
0
1
4

这个示例本身没什么意义,但是它很清晰地说明函数将返回一组仅能读一次的值,要想掌握yield,首先必须理解的是:当你调用生成器函数的时候,如上例中的createGenerator() ,程序并不会执行函数体内的代码,它仅仅只是返回生成器对象,这种方式颇为微妙。函数体内的代码只有直到每次循环迭代(for)生成器的时候才会运行。

第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。

如果生成器内部没有定义 yield 关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能有所帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python时间整形转标准格式的示例分享
Feb 14 Python
解密Python中的描述符(descriptor)
Jun 03 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
python简易远程控制单线程版
Jun 20 Python
Python中按值来获取指定的键
Mar 04 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
聊聊python中的循环遍历
Sep 07 Python
Python 实现定积分与二重定积分的操作
May 26 Python
Python实现生成bmp图像的方法
Jun 13 Python
Python中 Lambda表达式全面解析
Nov 28 #Python
利用Python抓取行政区划码的方法
Nov 28 #Python
Python抓取手机号归属地信息示例代码
Nov 28 #Python
Python文本相似性计算之编辑距离详解
Nov 28 #Python
Python实现全角半角字符互转的方法
Nov 28 #Python
Python连接PostgreSQL数据库的方法
Nov 28 #Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 #Python
You might like
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
CI框架表单验证实例详解
2016/11/21 PHP
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
Python函数嵌套实例
2014/09/23 Python
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
专业毕业生个性的自我评价
2013/10/03 职场文书
会计自我鉴定
2014/02/04 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
单位更名证明
2015/06/18 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS