浅析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实现统计英文单词个数及字符串分割代码
May 28 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
Python调用百度根据经纬度查询地址的示例代码
Jul 07 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
Python面向对象封装操作案例详解
Dec 31 Python
tensorflow 变长序列存储实例
Jan 20 Python
python实现简单坦克大战
Mar 27 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 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
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
一些常用的Javascript函数
2006/12/22 Javascript
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
vue源码入口文件分析(推荐)
2018/01/30 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
django 修改server端口号的方法
2018/05/14 Python
python Django的web开发实例(入门)
2019/07/31 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
python基于win32api实现键盘输入
2020/12/09 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
android面试问题与答案
2016/12/27 面试题
财务会计专业毕业生自荐信
2013/10/19 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
整改报告格式
2014/11/06 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript