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 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
理解Python中函数的参数
Apr 27 Python
python中的闭包用法实例详解
May 05 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
python实现批量修改服务器密码的方法
Aug 13 Python
浅谈django 重载str 方法
May 19 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
Python getsizeof()和getsize()区分详解
Nov 20 Python
python爬虫工具例举说明
Nov 30 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
python生成随机数、随机字符、随机字符串
Apr 06 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 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中array_keys和array_unique函数源码的分析
2016/02/26 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
js+xml生成级联下拉框代码
2012/07/24 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
python中实现php的var_dump函数功能
2015/01/21 Python
Python中subprocess的简单使用示例
2015/07/28 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
一些Solaris面试题
2013/03/22 面试题
学生自我鉴定模板
2013/12/30 职场文书
机关搬迁方案
2014/05/18 职场文书
夏季药店促销方案
2014/08/22 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
车间班组长竞聘书
2015/09/15 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
详解python网络进程
2021/06/15 Python
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL
Python中的 Set 与 dict
2022/03/13 Python
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫