浅析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正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
python3爬取各类天气信息
Feb 24 Python
python3爬取数据至mysql的方法
Jun 26 Python
python读出当前时间精度到秒的代码
Jul 05 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
python目标检测给图画框,bbox画到图上并保存案例
Mar 10 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
PHP 读取文件内容代码(txt,js等)
2009/12/06 PHP
php explode函数实例代码
2012/02/27 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
js实现日历与定时器
2017/02/22 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
微信小程序-form表单提交代码实例
2019/04/29 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
对python调用RPC接口的实例详解
2019/01/03 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
详解python logging日志传输
2020/07/01 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
会计专业求职信范文
2014/03/16 职场文书
个人授权委托书范本
2014/04/03 职场文书
工程材料采购方案
2014/05/18 职场文书
党的群众路线调研报告
2014/11/03 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书
css3应用示例:新增的选择器
2022/03/16 HTML / CSS
MySQL时区造成时差问题
2022/04/13 MySQL