文档章节

Python学习笔记--迭代器&生成器

紫韵
 紫韵
发布于 2016/05/08 20:09
字数 1644
阅读 179
收藏 9

一、Python迭代器

  1. What?(Python迭代器是什么?)

    在使用Python进行编程时,经常会使用for语句对一个对象进行遍历,获取所需数据,如

    li = [1, 2, 3, 4, 5]
    for i in li:
       print i

     像list、dict、string这一类可以使用for语句直接进行遍历的对象,称之为可迭代对象(Iterable),所谓可迭代对象,即为一类实现了__iter__()方法的对象,这类对象通过__iter__()方法返回一个迭代器,从而实现迭代操作;而所谓的迭代器对象(Iterator),即为一类实现了next()方法的对象,这类对象通过next()方法在一定范围内返回用户所期望的数据,超出范围则抛出StopIteration异常,并终止迭代

  2. How?(如何创建并使用迭代器对象?)

    下面这段代码自定义了一个迭代器对象MyIter,通过遍历该对象,可以获得[0, n)范围内的所有自然数

    可以看到,MyIter既实现了__iter__()方法,又实现了next()方法,所以MyIter对象既是可迭代对象,又是迭代器对象

    那么这中兼具双重身份的对象与单纯的可迭代对象又有什么区别呢?

    下面先看如下这个例子,这个例子将MyIter对象与list对象进行了一次比较

    上图中,方框1&2和方框3&4分别为对MyIter和list对象返回的迭代器进行两次迭代操作的结果,由结果可知,MyIter的迭代器只能进行一次迭代操作,而list的迭代器可以进行多次迭代操作。

    原因:这主要是因为兼具双重身份的迭代器对象,每次通过iter()方法返回的都是该对象自身,然后通过该对象自身的next()方法实现遍历操作,所以当执行完一次遍历操作后,该对象的next()函数就到了越界的位置,下次再对该对象进行遍历时,就已经处于越界位置,所以返回结果应该为一个StopIteration异常。而单纯的可迭代对象,每次调用iter()函数时都会返回一个指定的迭代器对象的新实例,所以执行几次iter()方法就会产生几个不同的迭代器实例,每次迭代时,都是调用不同的迭代器实例的next()方法返回相应的数据,所以该类可迭代对象就能实现多次遍历操作。

    验证:自己实现一个单纯的可迭代对象

    可以看到,在上面例子中,两次对MyPureIter对象进行迭代,会得到两次迭代结果,这和上面的list的效果是相同的,从而验证了我们的说法。所以当我们需要多次对同一个可迭代对象进行迭代操作时,需要采用这种方式。

二、Python生成器

  1. What?

    Python生成器是一个能有快速创建迭代器的强有力的工具。生成器看上去和普通函数类似,但是当需要返回数据时,使用yield关键字进行声明,而非return关键字。每次调用生成器的next()函数时,生成器会返回yield关键字后面的内容,并记住这次的返回位置和函数内部变量状态,用于下一次调用时进行恢复。

  2. How?

    1. 创建生成器

      下面的示例演示了通过yield关键字生成一个迭代器的过程

    2. 生成器的特点

      1. 生成器会自动生成迭代器的__iter__()方法和next()方法

      2. 在两次调用间函数的执行状态和局部变量会自动保存

    3. 生成器的执行流程

            第一次调用:i=0, yield i,返回0,保存变量i的值0及这次函数执行的位置

            第二次调用:恢复函数状态i=0,i += 1, 从而i=1,返回1,保存变量i的值1及这次函数执行的位置

            。。。

            第五次调用:恢复函数状态i=3,i += 1, 从而i=4,返回1,保存变量i的值1及这次函数执行的位置

            第六次调用:恢复函数状态i=4,i += 1, 从而i=5,i>=n,函数结束

  3. Why?

    1. 使用生成器能够比较方便快速地获得一个迭代器

    2. 使用生成器时采用的是惰性生成法则,只有需要时才生成相应的值,这样是内存友好的

三、Python生成器表达式

     生成器表达式有点类似于列表表达式

    列表表达式:[expr for i in iterable if cond_expr](下面左图)

    生成器表达式:(expr for i in iterable if cond_expr)(下面右图)

        

    列表表达式与生成器表达式:

    1. 两者的写法不同,前者是中括号,后者是小括号

    2. 两者返回的值不同,前者返回一个列表,后者返回一个生成器

    3. 两者的作用不同,前者可以进行重复操作,多次迭代;后者只能进行一次迭代

    4. 后者比前者更加内存友好,所以当每次只需要返回一个值,并且不需要进行重复操作时,应该使用生成器表达式;而当一次需要使用列表中多个值,或者需要对列表元素进行多次操作时,则需要使用列表表达式

四、总结

  1. Python迭代器是一类实现了__iter__()方法和next()方法的对象

  2. 对于一个可迭代对象,for语句可以通过iter()方法获得该对象的迭代器对象,然后通过迭代器对象的next(0方法依次获得想要的元素

  3. 当可迭代对象同时也是迭代器对象时,无法进行独立的迭代操作;而像list这类可迭代对象,其迭代器对象是独立存在的,这时就可以重复进行迭代操作

  4. 生成器是一类特殊的函数,这类函数不通过return语句返回值,而是通过yield关键字返回一次返回一个结果,通过使用生成器,可以比较方便快捷地获得迭代器对象

  5. 生成器表达式与列表表达式非常相似,不过两者的具体使用场景和作用不同,需要根据具体使用场景选择相信的表达式

© 著作权归作者所有

上一篇: Fragment使用实例
下一篇: jdk容器之HashMap
紫韵
粉丝 4
博文 21
码字总数 34323
作品 0
武汉
私信 提问
一起学Python:生成器

生成器 1. 生成器 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据...

祈澈姑娘
2018/01/07
0
0
python 高级特性之迭代器

python学习笔记,特做记录,分享给大家,希望对大家有所帮助。 迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list、tuple、dict、set、str等;...

展菲
06/23
0
0
面试必备|带你彻底搞懂Python生成器

作者 | Rocky0429 转载自 Python空间(ID:Devtogether) 写在之前 Python 的高级语言特性一直是我们学习 Python 的一个难点,大部分人并没有做到熟练的掌握,甚至去学习它都感觉很困难,「生...

AI科技大本营
02/24
0
0
更深入的理解 Python 中的迭代

深入探讨 Python 的 循环来看看它们在底层如何工作,以及为什么它们会按照它们的方式工作。 Python 的 循环不会像其他语言中的 循环那样工作。在这篇文章中,我们将深入探讨 Python 的 循环来...

01%
2018/05/26
0
0
Python3+迭代器与生成器

转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的...

xinet
2017/08/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 磁盘不足异常

linux 报 No space left on device 异常 ,则是磁盘不足 ,导致异常 运行 df -h 命令查询磁盘使用率,如果有100%,则查找目录大日志文件删除 1.磁盘不足导致系统应用写入文件失败,如系统日志...

zaolonglei
20分钟前
2
0
即学即用的 30 段 Python 实用代码

☞ 分享:最全最新的Python学习大礼包 ☜ 点击查看 编译:Pita & AI开发者,作者:Fatos Morina Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许...

Object_Man
20分钟前
3
0
The server time zone value 'EDT' is unrecognized or represents more than one time zone.

2019-10-14 18:07:43.714 ERROR 74363 --- [Druid-ConnectionPool-Create-1855026648] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://10.30......

yizhichao
33分钟前
8
0
html加载顺序以及影响页面二次渲染额的因素

本文转载于:专业的前端网站➱html加载顺序以及影响页面二次渲染额的因素 浏览器请求发往服务器以后,返回HTML页面,页面内容开始渲染,具体的执行顺序为: 1. 浏览器开始载入html代码,发现<...

前端老手
36分钟前
9
0
BeginnersBook JSP、JSTL、Servlet 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
48分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部