python 迭代器和生成器

简介:

迭代器

迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。

在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作。

常用的几个内建数据结构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]
复制代码

使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。

例如:

复制代码
/* 把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了 */
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返回的值。

需要注意的是,生成器中不需要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吧,除非你是要返回一个列表。


本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/4305935.html,如需转载请自行联系原作者

相关文章
|
2月前
|
传感器 数据库 Python
Python生成器和迭代器
Python生成器和迭代器
|
3月前
|
数据处理 索引 Python
深入理解 Python 的生成器与迭代器
深入理解 Python 的生成器与迭代器
31 0
|
2月前
|
Python
在Python中,如何使用迭代器和生成器?
在Python中,如何使用迭代器和生成器?
16 1
|
2月前
|
大数据 开发者 Python
Python中的迭代器和生成器
在Python编程中,迭代器和生成器是非常重要的概念。本文将深入探讨Python中迭代器和生成器的使用方法,以及它们在提高程序效率和性能方面的作用,帮助读者更好地理解和运用这两个概念。
11 2
|
2月前
|
算法 数据处理 Python
Python中的迭代器与生成器
本文将深入探讨Python中迭代器与生成器的概念、区别和应用。通过具体的示例代码,帮助读者更好地理解和利用这两个重要的概念,提升Python编程技能。
|
8月前
|
存储 算法 安全
3.0 Python 迭代器与生成器
当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出。此时,我们可以采用迭代器`Iterator`和生成器`Generator`的方法,逐个地处理数据,从而避免内存溢出的问题。迭代器是一个可以逐个访问元素的对象,它实现了`python`的迭代协议,即实现了`__iter__()`和`__next__()`方法。通过调用`__next__()`方法,我们可以逐个访问迭代器中的元素,直到所有元素都被访问完毕,此时再次调用`__next__()`方法会引发`StopIteration`异常。
33 0
|
4月前
|
存储 大数据 索引
讲解Python的迭代器和生成器。
讲解Python的迭代器和生成器。
|
存储 Python
python 生成器和迭代器
在Python中,迭代器是遵循迭代协议的对象。 使用iter ()从任何序列对象中得到迭代器(如 list, tuple, dictionary, set 等)。
|
Python 容器
Python中迭代器和生成器的区别?
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
146 0