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 相关文章推荐
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
python编写微信远程控制电脑的程序
Jan 05 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
python中altair可视化库实例用法
Jan 26 Python
python绘制高斯曲线
Feb 19 Python
Python与C/C++的相互调用案例
Mar 04 Python
Python词云的正确实现方法实例
May 08 Python
Python基于百度AI实现抓取表情包
Jun 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读写文件的方法(生成HTML)
2006/11/27 PHP
PHP strtotime函数详解
2009/12/18 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
简明 Python 基础学习教程
2007/02/08 Python
python实现绘制树枝简单示例
2014/07/24 Python
python引用DLL文件的方法
2015/05/11 Python
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python多线程多进程实例对比解析
2020/03/12 Python
Django通过json格式收集主机信息
2020/05/29 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
日语专业毕业生求职信
2013/12/04 职场文书
护理不良事件检讨书
2014/02/06 职场文书
大学四年个人的自我评价
2014/02/26 职场文书
元旦寄语大全
2014/04/10 职场文书
医德医风自我评价2015
2015/03/03 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
nginx之queue的具体使用
2022/06/28 Servers