浅析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 异常处理实例详解
Mar 12 Python
Python类的定义、继承及类对象使用方法简明教程
May 08 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
Python计算两个日期相差天数的方法示例
May 23 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
Python3.5字符串常用操作实例详解
May 01 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
浅谈Python中的正则表达式
Jun 28 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
模仿OSO的论坛(一)
2006/10/09 PHP
让PHP以ROOT权限执行系统命令的方法
2011/02/10 PHP
php模板中出现空行解决方法
2011/03/08 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
jquery.pager.js实现分页效果
2019/07/29 jQuery
python 矩阵增加一行或一列的实例
2018/04/04 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
使用python计算三角形的斜边例子
2020/04/15 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
Ruby如何定义一个类
2012/10/08 面试题
全国税务系统先进集体事迹材料
2014/05/19 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
React更新渲染原理深入分析
2022/12/24 Javascript