Python迭代器和生成器介绍


Posted in Python onMarch 06, 2015

迭代器

迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。

Python迭代器和生成器介绍

在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作。

Python迭代器和生成器介绍

常用的几个内建数据结构tuple、list、set、dict都支持迭代器,字符串也可以使用迭代操作。

你也可以自己实现一个迭代器,如上所述,只需要在类的__iter__方法中返回一个对象,这个对象拥有一个next()方法,这个方法能在恰当的时候抛出StopIteration异常即可。但是需要自己实现迭代器的时候不多,即使需要,使用生成器会更轻松。

#!/usr/bin/env python

# coding=utf-8
class test:

    def __init__(self, input_list):

        self.list = input_list

        self.i = 0
    def __iter__(self):

        return self

    

    def next(self):

        if self.i == len(self.list):

            self.i = 0

            raise StopIteration

        self.i += 1

        return  self.list[self.i - 1]

Python迭代器和生成器介绍

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

例如:

/* 把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了 */

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

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

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

    print line

生成器

生成器的编写方法和函数定义类似,只是在return的地方改为yield。

生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。

生成器自身又构成一个迭代器,每次迭代时使用一个yield返回的值。

Python迭代器和生成器介绍

需要注意的是,生成器中不需要return语句,不需要指定返回值,在生成器中已经存在默认的返回语句

生成器表达式

(i for i in range(5))

// 返回迭代器

<generator object <genexpr> at 0x7ff3e8f0d960>

列表解析,返回list
[i for i in range(5)]

// 返回list

[0, 1, 2, 3, 4]

 在这里存在一个问题,那就是range(5)会返回一个长度为5的数据,如果是range(1000)那么就会占用一个1000大小的数组空间;如果我们采用`生成器`,在需要的时候产生一个数字,那么空间的占用情况就会降低,这里我们可以使用xrange()函数来实现。
 

 '''

xrange

    函数说明:用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器。

xrange示例:

''' 

>>> xrange(5)

xrange(5)

>>> list(xrange(5))

[0, 1, 2, 3, 4]

>>> xrange(1,5)

xrange(1, 5)

>>> list(xrange(1,5))

[1, 2, 3, 4]

>>> xrange(0,6,2)

xrange(0, 6, 2)

>>> list(xrange(0,6,2))

[0, 2, 4]

所以xrange做循环的性能比range好,尤其是返回很大的时候,尽量用xrange吧,除非你是要返回一个列表。

Python 相关文章推荐
浅谈Python中的数据类型
May 05 Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
python实现数据图表
Jul 29 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
解决python线程卡死的问题
Feb 18 Python
Python实现FM算法解析
Jun 18 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
Python timer定时器两种常用方法解析
Jan 20 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Python如何合并多个字典或映射
Jul 24 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 #Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 #Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 #Python
python基于windows平台锁定键盘输入的方法
Mar 05 #Python
Python格式化压缩后的JS文件的方法
Mar 05 #Python
Python随机生成彩票号码的方法
Mar 05 #Python
Windows下安装python2.7及科学计算套装
Mar 05 #Python
You might like
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
Python标准库之sqlite3使用实例
2014/11/25 Python
Python 多线程的实例详解
2017/09/07 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
css3实现动画的三种方式
2020/08/24 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
代码中finally中的代码会不会执行
2012/02/06 面试题
设备动力科岗位职责范本
2014/02/23 职场文书
计算机毕业生求职信
2014/06/10 职场文书
先进典型发言材料
2014/12/30 职场文书
慰问信模板
2015/02/14 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
用人单位聘用意向书
2015/05/11 职场文书
国情备忘录观后感
2015/06/04 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript