
我们在 Python 中使用 for 循环迭代时到底做了什么
发布日期:2021-05-07 17:48:53
浏览次数:18
分类:技术文章
本文共 1158 字,大约阅读时间需要 3 分钟。
我们在 Python 中使用 for 循环迭代时到底做了什么
转载请注明出处:https://blog.csdn.net/jpch89/article/details/85532979
-
使用
for
循环迭代一般写成:for i in x: ...
-
首先看
x
是否实现了__iter__
方法,这个方法的返回值是一个迭代器。- 如果
x
实现了x.__iter__()
方法,那么使用iter(x)
得到x
的迭代器it_x
。 - 然后对迭代器
it_x
不断地调用next(it_x)
,把每次返回的元素给i
。 - 最终迭代器元素耗尽,捕获到
StopIteration
异常,终止迭代。
- 如果
-
如果
(序列类型x
没有实现__iter__
方法,那么看它是否实现了__getitem__
方法。Sequence
都实现了__len__
和__getitem__
方法,所以序列类型的对象都是可以用于for
循环的。)- 如果实现了
__getitem__
方法,那么开始把x[0]
、x[1]
、x[2]
一直到x[len(x) - 1]
不断地赋值给i
。 - 这里实际上执行的是
x.__getitem__(0)
、x.__getitem__(1)
、x.__getitem__(2)
一直到x.__getitem__(len(x) - 1)
。 - 最后执行到
x.__getitem__(len(x))
时,在__getitem__
方法内部要抛出一个IndexError
异常(StopIteration
也可以),从而终止迭代。
- 如果实现了
-
举个例子,该类实现了
__getitem__
方法,就可以用于for
循环迭代:
class Test: def __init__(self): self.val = [1, 2, 3] def __getitem__(self, i): if i < len(self.val): return self.val[i] else: raise IndexErrorx = Test()for i in x: print(i)"""123"""
- 如果
__iter__
和__getitem__
两个方法都实现了,会优先调用x.__iter__()
方法。 - 如果两个方法都没有实现,会抛出
TypeError
异常,提示:TypeError: '类名' object is not iterable
补充说明
从技术上讲,
for
循环内部的调用情况等价于it_x.__next__
,而不是next(it_x)
,尽管二者非常相似。
完成于 2019.1.1
发表评论
最新留言
很好
[***.229.124.182]2025年03月31日 18时10分00秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
一致性哈希算法
2019-03-05
HDFS源码分析(一)-----INode文件节点
2019-03-05
HDFS源码分析(六)-----租约
2019-03-05
自定义Hive Sql Job分析工具
2019-03-05
作为一名非Commiter,如何向开源社区提交自己的代码
2019-03-05
聊聊HDFS RBF第二阶段的主要改进
2019-03-05
公司如何使用开源软件
2019-03-05
流处理系统中的“Exactly Once”语义保证
2019-03-05
论分布式系统中单一锁控制的优化
2019-03-05
【MySQL】(四)SQL 基础操作之 DQL 数据查询语言
2019-03-05
【MySQL】(八)视图
2019-03-05
【MySQL】(九)触发器
2019-03-05
关于Altium Designer 09导出BOM表不能正确分类问题
2019-03-05
Oracle 11G环境配置
2019-03-05
【Spark】(六)Spark 运行流程
2019-03-05
你还不会在CentOS7上安装Docker嘛?
2019-03-05
Docker命令锦集
2019-03-05
【Python】(十二)IO 文件处理
2019-03-05
【Hive】(二十)详解 Hive 四种排序的区别
2019-03-05
【Hive】函数 instr 的用法
2019-03-05