Python中的yield浅析


Posted in Python onJune 16, 2014

在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器

迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开。

使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。

比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写:

for line in open("test.txt").readlines():
    print line

这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。

利用file的迭代器,我们可以这样写:

for line in open("test.txt"):   #use file iterators
    print line

这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。

二、生成器(constructor)

生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。

不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效

>>> def g(n):
...     for i in range(n):
...             yield i **2
...
>>> for i in g(5):
...     print i,":",
...
0 : 1 : 4 : 9 : 16 :

要了解他的运行原理,我们来用next方法看看:
>>> t = g(5)
>>> t.next()
0
>>> t.next()
1
>>> t.next()
4
>>> t.next()
9
>>> t.next()
16
>>> t.next()
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

在运行完5次next之后,生成器抛出了一个StopIteration异常,迭代终止。
再来看一个yield的例子,用生成器生成一个Fibonacci数列:

def fab(max):
    a,b = 0,1
    while a < max:
        yield a
        a, b = b, a+b
>>> for i in fab(20):
...     print i,",",
...
0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 ,

看到这里应该就能理解生成器那个很抽象的概念了吧~~
Python 相关文章推荐
python类装饰器用法实例
Jun 04 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
Apr 18 Python
详解Numpy中的广播原则/机制
Sep 20 Python
python生成lmdb格式的文件实例
Nov 08 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
如何通过Python实现标签云算法
Jul 02 Python
使用python+whoosh实现全文检索
Dec 09 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
Python实现随机生成任意数量车牌号
Jan 21 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
python中使用enumerate函数遍历元素实例
Jun 16 #Python
Python中字典(dict)和列表(list)的排序方法实例
Jun 16 #Python
Python实现的几个常用排序算法实例
Jun 16 #Python
Python中文件遍历的两种方法
Jun 16 #Python
Python里隐藏的“禅”
Jun 16 #Python
Python程序设计入门(5)类的使用简介
Jun 16 #Python
Python程序设计入门(4)模块和包
Jun 16 #Python
You might like
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php实现图片缩放功能类
2013/12/18 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
无毒社区工作方案
2014/05/23 职场文书
英语系毕业生求职信
2014/07/13 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
新闻通讯稿范文
2015/07/22 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
python获取对象信息的实例详解
2021/07/07 Python
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL
如何利用python实现列表嵌套字典取值
2022/06/10 Python