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清除字符串里非数字字符的方法
Jul 02 Python
Python 多进程和数据传递的理解
Oct 09 Python
PyQt5 pyqt多线程操作入门
May 05 Python
python3 property装饰器实现原理与用法示例
May 15 Python
python文件选择对话框的操作方法
Jun 27 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
python对常见数据类型的遍历解析
Aug 27 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
python之生成多层json结构的实现
Feb 27 Python
配置python的编程环境之Anaconda + VSCode的教程
Mar 29 Python
基于python和flask实现http接口过程解析
Jun 15 Python
如何清空python的变量
Jul 05 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
微信小程序使用自定义组件导航实现当前页面高亮
2020/01/02 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
基层工作经历证明
2014/01/13 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
建议书怎么写
2014/03/12 职场文书
竞聘书模板
2014/03/31 职场文书
捐助倡议书范文
2014/04/15 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA