浅析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中的函数编程
Apr 13 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
Python文件的读写和异常代码示例
Oct 31 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
python 定义给定初值或长度的list方法
Jun 23 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
Python closure闭包解释及其注意点详解
Aug 28 Python
python的range和linspace使用详解
Nov 27 Python
python爬虫模拟浏览器的两种方法实例分析
Dec 09 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
Python web如何在IIS发布应用过程解析
May 27 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 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 版本]
2007/03/20 PHP
php中随机显示图片的函数代码
2011/06/23 PHP
php读取csc文件并输出
2015/05/21 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
农历与西历对照
2006/09/06 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
python如何去除字符串中不想要的字符
2020/07/05 Python
浅谈Django的缓存机制
2018/08/23 Python
python中pika模块问题的深入探究
2018/10/13 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
python conda操作方法
2019/09/11 Python
德国购买门票网站:ADticket.de
2019/10/31 全球购物
乔迁宴答谢词
2014/01/21 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
留学推荐信中文范文
2015/03/26 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
javascript函数式编程基础
2021/09/15 Javascript