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和opencv实现抠图
Jul 18 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
简单分析python的类变量、实例变量
Aug 23 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
python读取mysql数据绘制条形图
Mar 25 Python
python实现暗通道去雾算法的示例
Sep 27 Python
python 实现的车牌识别项目
Jan 25 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
python 如何做一个识别率百分百的OCR
May 29 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获取地址栏信息的代码
2008/10/08 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
js 文件引入实现代码
2010/04/23 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
Python短信轰炸的代码
2020/03/25 Python
C面试题
2015/10/08 面试题
中学运动会广播稿
2014/01/19 职场文书
西式结婚主持词
2014/03/14 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
软件测试专业推荐信
2014/09/18 职场文书
安全主题班会教案
2015/08/12 职场文书
JS的深浅复制详细
2021/10/16 Javascript
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
优化Mysql查询的示例
2022/04/26 MySQL