浅析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通过加号运算符操作列表的方法
Jul 28 Python
Python中查看文件名和文件路径
Mar 31 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
django 控制页面跳转的例子
Aug 06 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
python小白切忌乱用表达式
May 29 Python
python des,aes,rsa加解密的实现
Jan 16 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
Python实现八大排序算法
2016/08/13 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
Python验证码截取识别代码实例
2020/05/16 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
司机职责范本
2014/03/08 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
使用refresh_token实现无感刷新页面
2022/04/26 Javascript
SQL Server中的游标介绍
2022/05/20 SQL Server
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python