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读写excel的方法
Nov 18 Python
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
python中异常捕获方法详解
Mar 03 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
django模板结构优化的方法
Feb 28 Python
Python中常用的8种字符串操作方法
May 06 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
python 使用三引号时容易犯的小错误
Oct 21 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 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原创论坛
2006/10/09 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
获取URL文件名后缀
2013/10/24 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
php查看网页源代码的方法
2015/03/13 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
学习Python selenium自动化网页抓取器
2018/01/20 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
tensorflow常用函数API介绍
2020/04/19 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
最新大学职业规划书范文
2013/12/30 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
考研英语复习计划
2015/01/19 职场文书
2015年科室工作总结
2015/04/10 职场文书
婚礼家长致辞
2015/07/27 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
nginx常用配置conf的示例代码详解
2022/03/21 Servers
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android