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中使用item()方法遍历字典的例子
Aug 26 Python
python获取外网ip地址的方法总结
Jul 02 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
python3中的md5加密实例
May 29 Python
对Python中plt的画图函数详解
Nov 07 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
python要安装在哪个盘
Jun 15 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 Python
Python操作CSV格式文件的方法大全
Jul 15 Python
Python保存并浏览用户的历史记录
Apr 29 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中截取字符串支持utf-8
2007/01/18 PHP
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
vue调用高德地图实例代码
2017/04/28 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
PyQt5实现下载进度条效果
2018/04/19 Python
python清除函数占用的内存方法
2018/06/25 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
python制作mysql数据迁移脚本
2019/01/01 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
会计电算化大学生职业规划书
2014/02/05 职场文书
计算机专业职业规划
2014/02/28 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
行政申诉状范文
2015/05/20 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
Python列表的索引与切片
2022/04/07 Python