我理解标准说它确实存在,但我试图找到其潜在原因。
如果只是总是返回self
需要什么呢?
您显然始终可以访问该对象,因为您在该对象上调用了iter
,那么需要它有什么需要?
答案 0 :(得分:8)
想象一下,你想要编写迭代任何迭代类型的代码。通常情况下,你只需要写一个for
语句或理解,但让我们明确地做for
所做的事情,以使事情变得更加明显:
i = iter(iterable)
while True:
try:
val = next(i)
except StopIteration:
break
else:
do_stuff(val)
如果你不做第一行,你的代码将不能使用列表,字符串,元组或除迭代器之外的任何东西。
但是如果你做第一行,那么iter(iterable)
最好返回一个迭代器,否则你的代码将无法与迭代器一起使用。
你可能想知道为什么iter
如果没有这个就不能做正确的事情?毕竟,当给定一个具有__len__
和__getitem__
但没有__iter__
的对象时, 在其中有魔法来创建迭代器,所以为什么不能'如果它有一个__next__
但没有__iter__
,它还可以返回它的参数吗?这是一个语言设计问题,但一般来说,Python试图尽可能少地使用魔法。使非完全序列可迭代的魔力是必要的,因为在迭代协议被添加到语言之前存在这样的序列(在广泛的第三方代码中),并且为了简化事物的小的好处而去除它太难了。
答案 1 :(得分:1)
for
循环应该与iterables一起使用,因此for i in something:
自动调用iter(something)
来获取迭代器并迭代所述迭代器。现在,如果迭代器也不可迭代(即没有定义__iter__
),则不能将for
循环与迭代器一起使用,即:
items = [1, 2, 3]
# this would work
for item in items: pass
# this wouldn't
it = iter(items)
for item in it: pass
因此,迭代器也应该是迭代的。替代方案,“以某种方式检测”迭代器而不是在它们上面调用iter
,是hacky和脆弱的(你会如何决定?)。
答案 2 :(得分:0)
所以for
循环和需要使用迭代的其他代码可以无条件地调用它们迭代的东西iter
,而不是分别处理迭代器和其他迭代。特别是,非迭代器可能合理地有一个名为next
的方法,我们希望能够将它们与迭代器区分开来。
答案 3 :(得分:0)
__iter__()
旨在返回对象上的迭代器。什么是已经是迭代器的对象的迭代器? self
,当然。