gpt4 book ai didi

python - 内置 iter() 函数和 for 语句

转载 作者:行者123 更新时间:2023-12-03 18:00:40 24 4
gpt4 key购买 nike

我试图了解 for x in y语句在 python 中有效。我在这里找到了文档:https://docs.python.org/3/reference/compound_stmts.html#for .它表示表达式 y被评估一次并且必须产生一个可迭代的对象。
即使我的类(class)没有实现 __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)
我知道有一个内置方法 iter()使用其 .__getitem__() 返回序列对象的迭代器函数和一个从 0 开始的计数器。
我的猜测是 python 正在调用 iter()表达式 y 上的函数在 for x in y陈述。所以它正在转换我实现 .__getitem__ 的对象进入迭代器,当我的对象引发 IndexError .__getitem__ 期间的异常调用,迭代器将其转换为 StopIteration异常,for 循环结束。
它是否正确?对还是错,这是在文档中的某个地方进行了解释,还是我需要查看实现的源代码?

最佳答案

根据 PEP 234,在上面的评论中有帮助,

iter(obj) calls PyObject_GetIter(obj).


关于 for 循环,它有以下说法:

The Python bytecode generated for for loops is changed to use new opcodes, GET_ITER and FOR_ITER, that use the iterator protocol rather than the sequence protocol to get the next value for the loop variable. This makes it possible to use a for loop to loop over non-sequence objects that support the tp_iter slot. Other places where the interpreter loops over the values of a sequence should also be changed to use iterators.


最后, https://docs.python.org/3/library/dis.html#opcode-GET_ITER解释说 GET_ITER相当于调用 iter .
综上所述,for 循环的行为似乎与内置的 iter 相同。功能。

关于python - 内置 iter() 函数和 for 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63222200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com