python - 内置 iter() 函数和 for 语句
问题描述
我试图了解该for x in y
语句在 python 中是如何工作的。我在这里找到了文档:https ://docs.python.org/3/reference/compound_stmts.html#for 。它说表达式y
被评估一次并且必须产生一个可迭代的对象。
即使我的类没有实现__iter__
(这是我对可迭代的理解),以下代码也会打印数字 1、2、3、4、5。
class myclass:
def __init__(self):
self.x = [1,2,3,4,5]
def __getitem__(self,index):
return self.x[index]
m = myclass()
for i in m:
print(i)
我知道有一个内置方法,它使用它的函数和一个从 0 开始的计数器iter()
返回一个序列对象的迭代器。.__getitem__()
我的猜测是 python在语句中iter()
的表达式上调用函数。所以它将我实现的对象转换为迭代器,当我的对象在调用过程中引发异常时,迭代器将其转换为异常,并且 for 循环结束。y
for x in y
.__getitem__
IndexError
.__getitem__
StopIteration
这个对吗?对还是错,这是在文档中的某个地方进行了解释,还是我需要查看实现的源代码?
解决方案
根据 PEP 234,在上面的评论中有帮助,
iter(obj)
来电PyObject_GetIter(obj)
。
关于 for 循环,它有以下说法:
为 for 循环生成的 Python 字节码被更改为使用新的操作码,
GET_ITER
并且FOR_ITER
使用迭代器协议而不是序列协议来获取循环变量的下一个值。这使得可以使用 for 循环来循环支持 tp_iter 槽的非序列对象。解释器在序列值上循环的其他地方也应该更改为使用迭代器。
最后,https://docs.python.org/3/library/dis.html#opcode-GET_ITER解释说GET_ITER
相当于调用iter
.
综上所述,for 循环的行为似乎与内置iter
函数相同。
推荐阅读
- ios - 使用核心数据时冻结的 UI .mainQueueConcurrencyType
- git - Git:git log 中显示的提交的 SHA 与 PR 中的不同吗?
- c - 在 NASM 中无法正确计算平方根函数
- jenkins - 通过詹金斯作业运行时,如何使 JUnit 测试访问远程服务器文件夹?
- hive - Hive 有睡眠功能吗?
- android - 在 Android 项目中使用 Kotlin + progurad 时出现 ClassCastException
- python - 了解 pandas 合并中的“left_index”和“right_index”参数
- javascript - Laravel ajax 无法正常运行
- python - 合并列具有默认值和覆盖的数据框
- python - 如何格式化 scikit-learn 输出数据?