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利用rsa库做公钥解密的方法教程
Dec 10 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Python魔法方法 容器部方法详解
Jan 02 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
浅谈python3 构造函数和析构函数
Mar 12 Python
如何理解python中数字列表
May 29 Python
Python devel安装失败问题解决方案
Jun 09 Python
python爬虫调度器用法及实例代码
Nov 30 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 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的pcntl多进程用法实例
2015/03/19 PHP
php实现简单的上传进度条
2015/11/17 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
破解Session cookie的方法
2006/07/28 Javascript
JavaScript 高级语法介绍
2009/06/15 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
python分析网页上所有超链接的方法
2015/05/08 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
python将list转为matrix的方法
2018/12/12 Python
对python判断是否回文数的实例详解
2019/02/08 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
python获取txt文件词向量过程详解
2019/07/05 Python
wxPython实现分隔窗口
2019/11/19 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
中学学校门卫岗位职责
2014/08/15 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
优秀班组申报材料
2014/12/25 职场文书
监考失职检讨书
2015/01/26 职场文书
保研专家推荐信范文
2015/03/25 职场文书
社会实践心得体会范文
2016/01/14 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Nginx源码编译安装过程记录
2021/11/17 Servers