Python迭代器和生成器介绍

 更新时间:2015年03月06日 09:40:23   投稿:junjie  
这篇文章主要介绍了Python迭代器和生成器介绍,本文分别用代码实例讲解了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吧,除非你是要返回一个列表。

相关文章

  • Python中如何生成GeoJSON数据

    Python中如何生成GeoJSON数据

    这篇文章主要介绍了Python中生成GeoJSON数据,无论使用geojson库还是geopandas库,都可以生成包含地理空间数据的GeoJSON文件,文中介绍了使用这些库生成GeoJSON数据的简单示例,需要的朋友可以参考下
    2023-10-10
  • pytorch实现从本地加载 .pth 格式模型

    pytorch实现从本地加载 .pth 格式模型

    今天小编就为大家分享一篇pytorch实现从本地加载 .pth 格式模型,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python区块链实现简版工作量证明

    python区块链实现简版工作量证明

    这篇文章主要为大家介绍了python区块链实现简版工作量证明详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python六大开源框架对比

    Python六大开源框架对比

    在这篇文章里,我们将为Python Web开发者回顾基于Python的6大Web应用框架。无论你是出于爱好还是需求,这六大框架都可能会成为你工作上不错的得力助手。
    2015-10-10
  • Python实现高斯函数的三维显示方法

    Python实现高斯函数的三维显示方法

    今天小编就为大家分享一篇Python实现高斯函数的三维显示方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python读取相对路径和绝对路径的方法

    python读取相对路径和绝对路径的方法

    这篇文章主要介绍了python读取相对路径和绝对路径,下面的路径介绍针对windows,在编写的py文件中打开文件的时候经常见到下面其中路径的表达方式,需要的朋友可以参考下
    2023-02-02
  • Python常用扩展插件使用教程解析

    Python常用扩展插件使用教程解析

    这篇文章主要介绍了Python常用扩展插件使用教程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 在python3.5中使用OpenCV的实例讲解

    在python3.5中使用OpenCV的实例讲解

    下面小编就为大家分享一篇在python3.5中使用OpenCV的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python办公自动化处理的10大场景应用示例

    Python办公自动化处理的10大场景应用示例

    这篇文章主要为大家介绍了Python办公自动化处理的10大场景应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • python利用有道翻译实现

    python利用有道翻译实现"语言翻译器"的功能实例

    小编就为大家分享一篇python利用有道翻译实现"语言翻译器"的功能实例。具有比较好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论