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网络编程实例简析
Sep 26 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
python3实现基于用户的协同过滤
May 31 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
pytorch 输出中间层特征的实例
Aug 17 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 Python
Python任务调度模块APScheduler使用
Apr 15 Python
基于pandas向csv添加新的行和列
May 25 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
继续学习javascript闭包
2015/12/03 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
详解python之配置日志的几种方式
2017/05/22 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
基于python绘制科赫雪花
2018/06/22 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
股份合作协议书
2014/04/12 职场文书
工作收入住址证明
2014/10/28 职场文书
初中中等生评语
2014/12/29 职场文书
校本培训个人总结
2015/02/28 职场文书
行政经理岗位职责
2015/04/15 职场文书
单位病假条范文
2015/08/17 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python