生成器

在python 中一边循环一边计算的机制,叫做生成器(generator)。

通过列表生成式,我们可以直接创建一个列表。但是,收到内存的限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的内存,如果我们只需要前面几个元素,那么后面却大多数的元素占用的内存就白白浪费掉了。所以,如果列表元素可以按照某种算法推算出来,就可以在循环过程中不断推算出后续的元素。就不用创建完整的list,从而节省大量的空间。

生成器保存的是算法,每次调用 next(G) ,就计算出 G 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常。

资料参考: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

      https://www.zhihu.com/question/20829330

创建生成器的方法

①要把一个列表生成式的 [ ] 改成 ( )

类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

a = (x for x in  range(5))
print(a)next(a)next(a)list(a)

②使用yieId

yieId 与 ruturn 一样会返回一个值,但是这两者是有区别的:

   yieId语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执

def gensquares(N):for i in range(N):yield i ** 2a = gensquares(5)
b = gensquares(6)print(next(a))
print(next(b))
print(next(a))
print(next(b))
print(next(a))
print(next(b))print(list(a))
print(list(b))

总结

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

生成器的特点:

  1. 节约内存
  2. 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

迭代器

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可迭代对象

以直接作用于 for 循环的数据类型有以下几种:

一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

一类是 generator ,包括生成器和带 yield 的generator function。

这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

iter()函数

生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。

把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

总结

  • 凡是可作用于 for 循环的对象都是 Iterable 类型;
  • 凡是可作用于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。

迭代器与生成器的区别

参考资料:http://blog.csdn.net/jinixin/article/details/72232604

生成器是一种特殊的迭代器,但迭代器不一定是生成器。

生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法。

生成器在迭代的过程中可以改变当前迭代值,而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。

转载于:https://www.cnblogs.com/ksunone/p/8572088.html

python生成器与迭代器。相关推荐

  1. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  2. Python生成器与迭代器

    Python生成器与迭代器 前言 首先,来让我们弄清楚可迭代对象 可迭代对象 在python中,可迭代对象并不是指某种具体的数据类型,它是指存储了元素的一个容器对象 也就是说,如果容器里面没有存储数据 ...

  3. 详解 Python 生成器与迭代器 及其区别

    前言 不论是初学python还是python进阶,这都是绕不开的知识点,生成器与迭代器的概念相较于其他基础概念显得晦涩难懂,知识点囊括很多方面,查阅越多的资料,头就越大,现在这加以理解归纳总结. 相关 ...

  4. Python生成器、迭代器

    Python生成器.迭代器 一.生成器(generator) 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的 ...

  5. 彻底理解Python生成器和迭代器

    目录 1.列表生成式 2.生成器 3.迭代器 4.对yield的总结 5.补充:itertools库学习 1.列表生成式 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9] ...

  6. Python生成器与迭代器详细教程

    一.列表生成器 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简单): info = [0, 1, 2, 3, ...

  7. 没有5年测开经验,还真说不清Python生成器、迭代器、装饰器

    一.什么是生成器? 使用了yield函数 就被称之为生成器,生成器是一个返回迭代器的函数,说白了生成器就是迭代器,只能用于迭代操作. 不懂?没关系,下面就一个斐波那契数列为例来进行讲解: 依靠简单循环 ...

  8. python生成器和迭代器

    Python3迭代器和生成器 很多朋友在初次接触 python 的 迭代器 和 生成器 时,总是不理解 生成器 和 迭代器的作用 和它们之间的关系,今天笔者来详细的讲解一下. 知识点目录: 一.迭代器 ...

  9. python生成器与迭代器(配套相关案列解析用法)

    一.python生成器简介 在 Python 中,使用了 yield 的函数被称为生成器(generator).跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就 ...

  10. python生成器和迭代器详解

    文章目录 前言 一.迭代器--从一个简单例子入手 1.1 实现__iter__成为迭代对象 1.2 通过实现__next__方法成为迭代器 二.生成器 -- 更加简单的迭代器 2.1来个简单例子 2. ...

最新文章

  1. MIT对话马斯克:关于自动驾驶、爱和未来世界|厚势汽车
  2. C#面向插件级别的软件开发 - 开源研究系列文章
  3. 办公室自动化系统_大队举办办公自动化系统培训班
  4. 一种数据结构的封装模式
  5. Nginx解决前端调用后端接口跨域问题
  6. http://blog.csdn.net/x86android/article/details/16980967
  7. mapbox 将坐标转换成米
  8. java.io.tmpdir
  9. 贾跃亭发布最新PPT:FF商业计划书
  10. 自学JavaWeb系列-JSP教程!
  11. 锋利的jquery(认识jquery)
  12. 时间序列数据的平稳性检验
  13. 网络设置管理 NetSetMan Pro v4.7.1 Lite 绿色便携版
  14. 飞思卡尔 智能车(山大 Router) 核心源码
  15. 安装yasm(汇编编译器)和 nasm
  16. ws协议绑定服务器域名,Websocket直接域名连接
  17. python炫酷gui界面_如何炫酷的使用Python
  18. afx是什么意思呀,什么时候要include呢,这个头文件的作用是??
  19. linux 查看当前状态_Linux视频编辑的当前状态2018
  20. Ubuntu笔记本折腾记(专治切换显卡死机)

热门文章

  1. 成员变量(全局变量)和局部变量区别
  2. oracle怎么以时间排序,oracle指定数据排序在前面怎么处理
  3. 浅析Linux开发工具之gcc/g++
  4. python文件操作模式是什么,python --文件操作模式详解
  5. python自动化教程_Python 任务自动化工具 tox 教程
  6. java两个长度不同数组_两组数组,长度不一样,如果其中一个数组的值在另一个中不存在,则不符合要求.怎么算?...
  7. linux启动mysql1820_linux 系统下MySQL5.7重置root密码(完整版,含ERROR 1820 (HY000)解决方案)...
  8. 路由器 刷 linux系统版本,在Linux下用tftp刷写路由器固件
  9. 5条件筛选功能_一分钟,彻底学会Excel高级筛选,坐等升职加薪!
  10. Eclipse 答疑:如何使用 Eclipse 进行断点(Breakpoints)调试?