浅析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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
Python中os.path用法分析
Jan 15 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
Python2随机数列生成器简单实例
Sep 04 Python
django的登录注册系统的示例代码
May 14 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
Django通过json格式收集主机信息
May 29 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 Python
python批量生成条形码的示例
Oct 10 Python
Python的scikit-image模块实例讲解
Dec 30 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 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 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
smarty简单应用实例
2015/11/03 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
Js 随机数产生6位数字
2010/05/13 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
python动态监控日志内容的示例
2014/02/16 Python
python打开文件并获取文件相关属性的方法
2015/04/23 Python
python用post访问restful服务接口的方法
2018/12/07 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
九年级英语教学反思
2014/01/31 职场文书
企业节能减排实施方案
2014/03/19 职场文书
小学运动会加油稿
2015/07/22 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android
Python OpenGL基本配置方式
2022/05/20 Python