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中函数的参数定义和可变参数用法实例分析
Jun 04 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
python elasticsearch环境搭建详解
Sep 02 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
python简单实现最大似然估计&amp;scipy库的使用详解
Apr 15 Python
什么是Python中的匿名函数
Jun 02 Python
Python装饰器如何实现修复过程解析
Sep 05 Python
python 绘制场景热力图的示例
Sep 23 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
用Python提取PDF表格的方法
Apr 11 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
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
python fabric使用笔记
2015/05/09 Python
Python 自动化表单提交实例代码
2017/06/08 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python中partial()基础用法说明
2018/12/30 Python
对python生成业务报表的实例详解
2019/02/03 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
python将图片转base64,实现前端显示
2020/01/09 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
python 6行代码制作月历生成器
2020/09/18 Python
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
商场拾金不昧表扬信
2014/01/13 职场文书
小学生环保倡议书
2014/05/15 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
安全温馨提示语大全
2015/07/14 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
Apache POI的基本使用详解
2021/11/07 Servers
Tomcat用户管理的优化配置详解
2022/03/31 Servers