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 collections模块实例讲解
Apr 07 Python
Python脚本暴力破解栅栏密码
Oct 19 Python
Python读写及备份oracle数据库操作示例
May 17 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
python画图的函数用法以及技巧
Jun 28 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
Python手动或自动协程操作方法解析
Jun 22 Python
python3代码输出嵌套式对象实例详解
Dec 03 Python
Python编写万花尺图案实例
Jan 03 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
python 遍历磁盘目录的三种方法
Apr 02 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
cmd下运行php脚本
2008/11/25 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
JavaScript函数详解
2015/02/27 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
python实现多线程抓取知乎用户
2016/12/12 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
物流仓管员岗位职责
2013/12/04 职场文书
售后主管岗位职责
2013/12/08 职场文书
买房子个人收入证明
2014/01/16 职场文书
大二自我鉴定
2014/01/31 职场文书
党员违纪检讨书
2014/02/18 职场文书
发展部经理职责规定
2014/02/22 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript