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中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
Python实现备份文件实例
Sep 16 Python
在Python中操作日期和时间之gmtime()方法的使用
May 22 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
利用Python发送邮件或发带附件的邮件
Nov 12 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生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
JavaScript的parseInt 进制问题
2009/05/07 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
Python实现的桶排序算法示例
2017/11/29 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
目标管理责任书
2014/04/15 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
党支部半年考察意见
2015/06/01 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Java 定时任务技术趋势简介
2022/05/04 Java/Android