文章目录

  • 迭代(iteration)
  • 可迭代(iterable)
  • 迭代器(iterator)
  • 迭代器协议(iterator protocol)
  • 迭代器协议与 for 循环

迭代(iteration)

逐个获取元素的过程,就是「迭代」。

例如:

# iteration
# 用 for 循环迭代序列
a_list = [1, 2, 3]
for i in a_list:print(i)

可迭代(iterable)

实现了方法 __iter__ 的对象是可迭代的。

如果你暂时听不懂,那可以简单地理解为:如果我们可以从一个对象中逐个地获取元素,那么我们就说这个对象是「可迭代」的。

Python 中的顺序类型,都是可迭代的,例如 listtuple,、string;另外 dictsetfile 也是可迭代的。

迭代器(iterator)

实现了方法 __next__ 的对象是迭代器。

当你调用方法 __next__ (可不提供任何参数)时,迭代器应返回下一个值。如果迭代器没有可供返回的值,应引发 StopIteration 异常。

你还可使用内置的便利函数 next,在这种情况下,next(it)it.__next__() 等效。

迭代器协议(iterator protocol)

迭代器协议指的是容器类需要包含一个特殊方法,这个特殊方法就是 __iter__() 方法。

如果一个容器类提供了 __iter__() 方法,并且该方法能返回一个能够逐个访问容器内所有元素的迭代器,则我们说该容器类实现了迭代器协议。

迭代器协议与 for 循环

讲这个例子,是为了更好地理解迭代器协议。

# iterator protocol and for loop
for x in something:print(x)

Python 处理 for 循环时,首先会调用 something.__iter__(),返回 something 对应的迭代器(假设叫 it);而后,for 循环会调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,然后执行循环体;执行完后,for 循环会继续调用 it.__next__(),获取迭代器的下一个元素,并赋值给 x,执行循环体 …… 当 for 循环调用 it.__next__()产生 StopIteration 异常时,循环结束。

咱们可以用下面的代码模拟一下:

>>> a_list = [1,2,3,4]
>>> it = a_list.__iter__()  # 获取迭代器
>>> it.__next__()           # 让迭代器返回下一个值
1
>>> it.__next__()
2
>>> it.__next__()
3
>>> it.__next__()
4
>>> it.__next__()    # 迭代器没有可供返回的值,引发 StopIteration 异常
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
>>>

参考资料

【1】《Python基础教程》(人民邮电出版社,第3版)

【2】 Python 中的黑暗角落(一):理解 yield 关键字

Python学习之迭代器协议相关推荐

  1. python学习-38迭代器和生成器

    迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...

  2. Python学习:迭代器与生成器

    1.生成器 如果创建一个有很多元素的列表,但是只需要访问前几个元素,后面的元素占着的空间就白白浪费了 在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间. 在Pyt ...

  3. [转载] Python 学习笔记 迭代器和生成器

    参考链接: Python中的迭代器函数2(islice(),starmap(),tee()..) 本文链接地址 http://quqiuzhu.com/2016/python-iterator-and ...

  4. 九、python学习之HTTP协议

    今天学习了HTTP协议,说实话,我并不想做今天的学习笔记,虽然学习的东西不多,但是对于HTTP协议要是往深层去说,所有的名词和用法都解释出来,写他个5篇都算是少的.但是,既然是学习笔记,还是本着总结今 ...

  5. python学习笔记--迭代器

    转载自理解Python的迭代器 首先,廖雪峰老师的教程中解释了迭代器和生成器,这篇文章只是补充和我个人的总结. 什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被 ...

  6. python学习day-8 迭代器 生成器 装饰器

    http://www.cnblogs.com/linhaifeng/articles/7580428.html 迭代器#迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代, ...

  7. Python学习day12(生成器,列表/生成器推导式)

    Python学习day12(生成器,列表/生成器推导式) 生成器 初始生成器 我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存 ...

  8. python之路---迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  9. python之路——迭代器和生成器

    楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思 ...

最新文章

  1. 学习计算机视觉你需要知道这关键的八点
  2. 探寻用户自定义定时任务的实践方案
  3. spark 笔记 16: BlockManager
  4. Gitee 如何自动部署博客 Pages?推荐用这个GitHub Actions!
  5. 调用mysql1045解决_MySQL 1045错误的解决方法
  6. Mybatis Configuration.xml中properties属性定义
  7. SpaceEmacs Rock Day2 学习笔记
  8. 《AutoCAD 2013中文版从入门到精通》—— 导读
  9. 常见的国内外Linux服务器运维面板汇总
  10. 用STVP擦除芯片写保护
  11. win10计算机管理找不到用户,win10重装系统后管理账户不见了,win10怎么找到管理账户?...
  12. Android中Vitamio视频框架学习
  13. VC++调用IcmpSendEcho函数实现对远端地址的ping检测(附源码)
  14. 基于C++的Qt(三)Qt类库概述
  15. 数据研发工程师面试全过程(个人面试)
  16. 科技巨头竞速无人车落地:Waymo One 向左,百度Robotaxi向右
  17. 订单可视化(智能制造、流程再造、企业信息化) 第七篇 经营班子掌舵,业务与开发分离,走向成功必备条件
  18. OKR教练:OKRs-E如何帮你落地OKR
  19. 关于高德地图崩溃的问题
  20. 少壮不努力,老大徒伤悲

热门文章

  1. NYOJ 752 又见回文串
  2. 10 迭代器与生成器
  3. mysql常用的分组函数
  4. 有关Java中json字符串与map的转换使用
  5. 全球酒店详情查看API接口-基于极核数据
  6. [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  7. matlab 仿照案例-目标检测
  8. learning rate四种改变方式
  9. 【Paddle】Anaconda安装PaddlePaddle和PaddleX教程
  10. 【粉丝福利】今天不谈技术,只送福利!