浅析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的Tornado框架中的协程异步实现原理
Apr 23 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
Python的Django框架中模板碎片缓存简介
Jul 24 Python
python实现给数组按片赋值的方法
Jul 28 Python
python生成excel的实例代码
Nov 08 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
使用python绘制温度变化雷达图
Oct 18 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
python控制台打印log输出重复的解决方法
May 14 Python
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
php常用表单验证类用法实例
2015/06/18 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
python 判断是否为正小数和正整数的实例
2017/07/23 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
python读取和保存图片5种方法对比
2018/09/12 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
2019/04/01 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
卫生巾广告词
2014/03/18 职场文书
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
中秋节祝酒词
2015/08/12 职场文书