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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
python 矩阵增加一行或一列的实例
Apr 04 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
python argparser的具体使用
Nov 10 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
python异常处理之try finally不报错的原因
May 18 Python
初学者学习Python好还是Java好
May 26 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
Python如何对齐字符串
Jul 30 Python
python中如何对多变量连续赋值
Jun 03 Python
python运算符之与用户交互
Apr 13 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
orm获取关联表里的属性值
2016/04/17 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python Socket传输文件示例
2017/01/16 Python
python生成excel的实例代码
2017/11/08 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
破解安装Pycharm的方法
2018/10/19 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
EJB的基本架构
2016/09/22 面试题
生产经理的自我评价分享
2013/11/07 职场文书
导游实习生自荐书
2014/01/28 职场文书
社区健康教育实施方案
2014/03/18 职场文书
企业法人授权委托书
2014/04/03 职场文书
教师考核评语
2014/04/28 职场文书
查摆剖析材料范文
2014/09/30 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技
mysql sock 文件解析及作用讲解
2022/07/15 MySQL