Python学习之迭代器协议
文章目录
- 迭代(iteration)
- 可迭代(iterable)
- 迭代器(iterator)
- 迭代器协议(iterator protocol)
- 迭代器协议与 for 循环
迭代(iteration)
逐个获取元素的过程,就是「迭代」。
例如:
# iteration
# 用 for 循环迭代序列
a_list = [1, 2, 3]
for i in a_list:print(i)
可迭代(iterable)
实现了方法 __iter__
的对象是可迭代的。
如果你暂时听不懂,那可以简单地理解为:如果我们可以从一个对象中逐个地获取元素,那么我们就说这个对象是「可迭代」的。
Python 中的顺序类型,都是可迭代的,例如 list
、 tuple
,、string
;另外 dict
、set
、 file
也是可迭代的。
迭代器(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学习之迭代器协议相关推荐
- python学习-38迭代器和生成器
迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...
- Python学习:迭代器与生成器
1.生成器 如果创建一个有很多元素的列表,但是只需要访问前几个元素,后面的元素占着的空间就白白浪费了 在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间. 在Pyt ...
- [转载] Python 学习笔记 迭代器和生成器
参考链接: Python中的迭代器函数2(islice(),starmap(),tee()..) 本文链接地址 http://quqiuzhu.com/2016/python-iterator-and ...
- 九、python学习之HTTP协议
今天学习了HTTP协议,说实话,我并不想做今天的学习笔记,虽然学习的东西不多,但是对于HTTP协议要是往深层去说,所有的名词和用法都解释出来,写他个5篇都算是少的.但是,既然是学习笔记,还是本着总结今 ...
- python学习笔记--迭代器
转载自理解Python的迭代器 首先,廖雪峰老师的教程中解释了迭代器和生成器,这篇文章只是补充和我个人的总结. 什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被 ...
- python学习day-8 迭代器 生成器 装饰器
http://www.cnblogs.com/linhaifeng/articles/7580428.html 迭代器#迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代, ...
- Python学习day12(生成器,列表/生成器推导式)
Python学习day12(生成器,列表/生成器推导式) 生成器 初始生成器 我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存 ...
- python之路---迭代器和生成器
阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...
- python之路——迭代器和生成器
楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思 ...
最新文章
- 学习计算机视觉你需要知道这关键的八点
- 探寻用户自定义定时任务的实践方案
- spark 笔记 16: BlockManager
- Gitee 如何自动部署博客 Pages?推荐用这个GitHub Actions!
- 调用mysql1045解决_MySQL 1045错误的解决方法
- Mybatis Configuration.xml中properties属性定义
- SpaceEmacs Rock Day2 学习笔记
- 《AutoCAD 2013中文版从入门到精通》—— 导读
- 常见的国内外Linux服务器运维面板汇总
- 用STVP擦除芯片写保护
- win10计算机管理找不到用户,win10重装系统后管理账户不见了,win10怎么找到管理账户?...
- Android中Vitamio视频框架学习
- VC++调用IcmpSendEcho函数实现对远端地址的ping检测(附源码)
- 基于C++的Qt(三)Qt类库概述
- 数据研发工程师面试全过程(个人面试)
- 科技巨头竞速无人车落地:Waymo One 向左,百度Robotaxi向右
- 订单可视化(智能制造、流程再造、企业信息化) 第七篇 经营班子掌舵,业务与开发分离,走向成功必备条件
- OKR教练:OKRs-E如何帮你落地OKR
- 关于高德地图崩溃的问题
- 少壮不努力,老大徒伤悲