浅析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的Template使用指南
Sep 11 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
python+ffmpeg视频并发直播压力测试
Mar 06 Python
基于python的多进程共享变量正确打开方式
Apr 28 Python
python从子线程中获得返回值的方法
Jan 30 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
python redis 批量设置过期key过程解析
Nov 26 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
python中的列表和元组区别分析
Dec 30 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程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
JQuery 小练习(实例代码)
2009/08/07 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
Python页面加载的等待方式总结
2021/02/28 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
4s店总经理岗位职责
2013/12/31 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
先进单位申报材料
2014/12/25 职场文书
保卫工作个人总结
2015/03/03 职场文书
培训简讯范文
2015/07/20 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js
利用Apache Common将java对象池化的问题
2022/06/16 Servers