1. 可迭代对象

from collection import Iterableclass Iterable(metaclass=ABCMeta):...def __iter__(self):  # 只实现了__iter__ 方法while False:yield None

能够在 for ... in obj:中使用的对象(obj)就是一个可迭代对象。

2. 迭代器

from collections import Iteratorclass Iterator(Iterable):  # Iterable的子类
    ...def __next__(self):  # 实现了 __next__raise StopIterationdef __iter__(self):  # 也实现了 __iter__return self

能够使用.next() 或者 .__next__() 方法,在没有下一个元素时,返回 StopIteration 异常的对象,都是迭代器,可迭代对象转换成迭代器的方法是: iter(obj) 返回的就是一个迭代器。

>>> a = []
>>> a
[]
>>> s = iter(a)
>>> s
<list_iterator object at 0x7feac859b048>
>>> s.next() # 这个方法不存在,抛出的是属性错误异常
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'list_iterator' object has no attribute 'next'
>>> s.__next__
<method-wrapper '__next__' of list_iterator object at 0x7feac859b048>
>>> s.__next__()  # 这个方法存在,抛出的是 StopIteration 异常
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
>>>

实现自己的迭代器:

class Reverse:def __init__(self, data):self.data = dataself.index = len(data)def __iter__(self):return selfdef __next__(self):  # py2: next()方法if self.index == 0:raise StopIterationself.index = self.index - 1return self.data[self.index]rev = Reverse('timlinux')
for char in rev:print(char)

3. 生成器yield

生成器(generator)是用来构造迭代器的一种语法工具,通过使用 yield 关键字来代替 return,并自动构建好 __iter__() 和 __next__() 两个方法:

  • yield 关键字的位置将发生 return 操作
  • yield 关键字存在的函数中,将具有 __iter__, __next__ 函数
def reverse(data):max_len = len(data) - 1min_len = -1for index in range(max_len, min_len, -1):yield data[index]x = reverse('timlinux')
dir(x)  # py3: 返回的对象有 __iter__, __next__ 方法# py2: 返回的对象有 __iter__, next 方法

列表生成式中的 [] 换成 (),得到的对象就不再是一个列表,而是一个生成器:

>>> L = [x*x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x*x for x in range(10))
>>> g
<generator object <genexpr> at 0x7f9a8dd48a00>

4. 场景

在使用中分配内存,而不是一次分配所有的内存。

转载于:https://www.cnblogs.com/timlinux/p/9700691.html

[TimLinux] Python 迭代器(iterator)和生成器(generator)相关推荐

  1. ES6中的迭代器(Iterator)和生成器(Generator)

    用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...

  2. 深入解析ES6中的迭代器(Iterator)和生成器(Generator)

    用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...

  3. Python组合数据类型:容器类型总览,(不)可变数据类型immutable、(不)可迭代对象iterable、迭代器iterator、生成器generator、语法糖

    一.组合数据类型container objects 组合数据类型container objects:能够表示多个数据的类型 集合类型:集合类型是一个元素集合,元素无序不重不变 序列类型:序列类型是一个 ...

  4. ES6中的迭代器(Iterator)和生成器(Generator)(一)

    用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...

  5. python迭代器与生成器_Python的迭代器和生成器

    一 概要 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set ...

  6. Python中生成器generator和迭代器Iterator的使用方法

    一.生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间 2. 生成器的创建方式 第一种只要把一个列表生 ...

  7. 简单介绍python迭代器和生成器

    这篇文章主要介绍了Python中的迭代器和生成器,涉及到Python中很多重要的特性,需要的朋友可以参考下,希望能够给你带来帮助 python迭代器和生成器 1.迭代器 这里用字典示例 while T ...

  8. python迭代器两个基本方法可供参考_浅析python迭代器和生成器

    可迭代对象 概念 一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么这个对象就是可迭代对象 常见的可迭代对象 集合或序列类型(如list.tuple.set. ...

  9. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

最新文章

  1. 前后端分离后的前端时代
  2. 优酷土豆:财报不是问题!
  3. leetcode算法题--Word Search
  4. 树莓派python教程_两个简易的树莓派初学者Python程序
  5. luogu p3515 Lightning Conductor
  6. linux下find命令之-exec ll -sh {} \;
  7. eShopOnContainers 知多少[9]:Ocelot gateways
  8. php 0补全,PHP给数字或字符串补零0或自动补全其他符号
  9. 洛谷——P1614 爱与愁的心痛
  10. Linux虚拟机连不上网克隆虚拟机网卡无法启动
  11. 小米4C关闭html查看器,小米4C解锁教程_小米4C一键解锁Bootloader的方法
  12. 200行代码实现N子棋(以五子棋为例)
  13. Matlab——sym和syms
  14. MaximalRectangle
  15. 示波器测量红外遥控器晶振
  16. Node.js 获取本机Mac地址
  17. 用户名不在sudoers文件中,此事将被报告
  18. 组件导致背景图片断层
  19. 《吴思文集》的网址如下:
  20. (二)FirePower-FTD初始化设置并加入到FMC管理

热门文章

  1. 指令引用了 内存 该内存不能为read 一直弹窗_【翻译】使用Rust测试ARM和X86内存模型
  2. eclipse java工程目录_转载:Eclipse下的java工程目录
  3. mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束
  4. java内存模型按照线程隔离性_深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性...
  5. saml java实现_java-saml
  6. android json 解析图片,JSON解析并获取android中的图像
  7. moment格式换时间_不一样的日期、时间转换(moment.js)
  8. 努比亚z17s刷原生安卓_电脑运行手机APP,不会没关系,我推荐你使用显卡服务器运行安卓模拟器...
  9. 异常:com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。
  10. 剑指 Offer 10- I. 斐波那契数列 (从重叠子问题到备忘录到dp数组迭代解法)