首页 > 解决方案 > 内置 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 循环结束。yfor x in y.__getitem__IndexError.__getitem__StopIteration

这个对吗?对还是错,这是在文档中的某个地方进行了解释,还是我需要查看实现的源代码?

标签: pythonpython-3.x

解决方案


根据 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函数相同。


推荐阅读