Python 内置iter()函数和for语句

Python 内置iter()函数和for语句,python,python-3.x,Python,Python 3.x,我试图理解python中x的语句是如何工作的。我在这里找到了文档:。它表示表达式y只计算一次,并且必须生成一个iterable对象 下面的代码打印数字1,2,3,4,5,即使我的类没有实现\uuuu iter\uuuu(这是我对iterable的理解) class-myclass: 定义初始化(自): self.x=[1,2,3,4,5] 定义uu获取项目uu(自身,索引): 返回self.x[索引] m=myclass() 对于我在m: 印刷品(一) 我知道有一个内置方法iter() 我猜p

我试图理解python中x的
语句是如何工作的。我在这里找到了文档:。它表示表达式
y
只计算一次,并且必须生成一个iterable对象

下面的代码打印数字1,2,3,4,5,即使我的类没有实现
\uuuu iter\uuuu
(这是我对iterable的理解)

class-myclass:
定义初始化(自):
self.x=[1,2,3,4,5]
定义uu获取项目uu(自身,索引):
返回self.x[索引]
m=myclass()
对于我在m:
印刷品(一)
我知道有一个内置方法
iter()

我猜python正在调用
for x in y
语句中表达式
y
上的
iter()
函数。因此,它将实现
.getitem\uuuuuuuu
的对象转换为迭代器,当我的对象在
.getitem\uuuuuuu
调用期间引发
索引器
异常时,迭代器将其转换为
停止迭代
异常,for循环结束

这是正确的吗?是对是错,文档中是否解释了这一点,或者我是否需要查看实现的源代码?

快乐Pythoning

getitem是Python 2.2版本之前唯一在迭代器上迭代循环的方法。Pyhton 2.2版本中引入了iter方法。在getitem方法中,索引自动作为0 ie 0索引传递,并在每次循环运行迭代时增加1。一旦索引器引发,我们就退出循环。要实现向后兼容性,getitem方法仍然不受欢迎(直到Python版本3.8.5)。因此,现在首先在iterable中搜索循环搜索iter方法,如果该方法不存在,则搜索getitem方法。早在Python2.2出现的时候,开发人员就喜欢使用iternext方法,这对iterable和iterator有了清晰的理解

您可以在示例中再举一个getitem示例来理解迭代器和iterable,如下所示

class myclass:
    def __init__(self):
        pass
    def __getitem__(self,index):
        return index
m = myclass()
for i in m:
    print(i)
上面的代码将创建一个无限循环,因为第一个索引值将是0,然后是1,然后是2,依此类推,并且不会引发错误

上述代码的输出:

0
1
2
3
4
5
6
7
8
9
10
11
.
.
.
.

感谢您分享这个问题。

根据PEP 234,上面的评论中链接了这个问题

iter(obj)
调用
PyObject\u GetIter(obj)

关于for循环,它有以下内容:

为for循环生成的Python字节码被更改为使用新的操作码,
GET_ITER
for_ITER
,它们使用迭代器协议而不是序列协议来获取循环变量的下一个值。这使得在支持tp_iter插槽的非序列对象上使用for循环成为可能。解释器在序列值上循环的其他位置也应该更改为使用迭代器

最后,解释了
GET\u ITER
等同于调用
ITER


综上所述,for循环的行为似乎与内置的
iter
函数相同。

\uuuu getitem\uuuuu()
带有顺序索引,由
索引器
终止,是Python迭代器协议的原始版本,可以追溯到Python 1.x天。显然,为了向后兼容,它仍然受到支持。但是是的,
iter()
函数与
for
循环对其序列对象的作用完全相同。@RichieV:列表有一个
\iter\uuuuuuuu
方法的事实实际上是完全不相关的。如果列表没有
\uuu iter\uuu
@jasonharper-interest,则此代码的行为将相同。我对这项工作感到惊讶。我认为这个答案是值得的。