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中open函数的使用
Mar 01 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
浅谈python写入大量文件的问题
Nov 09 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
python设置环境变量的原因和方法
Jun 24 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
python 3.6.7实现端口扫描器
Sep 04 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
django正续或者倒序查库实例
May 19 Python
正确的理解和使用Django信号(Signals)
Apr 14 Python
Python实现列表拼接和去重的三种方式
Jul 02 Python
Python作用域和名称空间的详细介绍
Apr 13 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 XML备份Mysql数据库
2009/05/27 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
Javascript 作用域使用说明
2009/08/13 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
javascript实现动态标签云
2015/10/16 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
Python实现购物车购物小程序
2018/04/18 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
python3判断url链接是否为404的方法
2018/08/10 Python
Python中extend和append的区别讲解
2019/01/24 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
股权转让意向书
2014/04/01 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
小学社会实践活动总结
2014/07/03 职场文书