浅析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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 Python
详解爬虫被封的问题
Apr 23 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
用python批量下载apk
Dec 29 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
基于jquery的cookie的用法
2011/01/10 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
Python 元类使用说明
2009/12/18 Python
Python字符串替换实例分析
2015/05/11 Python
python链接Oracle数据库的方法
2015/06/28 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
远程调用的原理
2014/07/05 面试题
酒吧总经理岗位职责
2013/12/10 职场文书
民事代理词范文
2015/05/25 职场文书
放假通知怎么写
2015/08/18 职场文书
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript