浅析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 中Pickle库的使用详解
Feb 24 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
pytorch 调整某一维度数据顺序的方法
Dec 08 Python
python实现按行分割文件
Jul 22 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
python制作英语翻译小工具代码实例
Sep 09 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
python中数字是否为可变类型
Jul 08 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
Python加密与解密模块hashlib与hmac
Jun 05 Python
python解析照片拍摄时间进行图片整理
Jul 23 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
多重?l件?合查?(一)
2006/10/09 PHP
浅析php变量修饰符static的使用
2013/06/28 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
Django框架中的对象列表视图使用示例
2015/07/21 Python
python文件操作相关知识点总结整理
2016/02/22 Python
python中常用的九种预处理方法分享
2016/09/11 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
详解Python字典小结
2018/10/20 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
面试后的英文感谢信
2014/02/01 职场文书
咖啡店创业计划书
2014/08/15 职场文书
六一儿童节活动总结
2014/08/27 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
寒假致家长的一封信
2015/10/10 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书