Python 内置iter()函数和for语句
我试图理解python中x的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
语句是如何工作的。我在这里找到了文档:。它表示表达式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出现的时候,开发人员就喜欢使用iter和next方法,这对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,则此代码的行为将相同。我对这项工作感到惊讶。我认为这个答案是值得的。