为什么Python Iterator需要一个只返回self的iter方法?

时间:2014-01-24 22:04:06

标签: python iterator

我理解标准说它确实存在,但我试图找到其潜在原因。

如果只是总是返回self需要什么呢?

您显然始终可以访问该对象,因为您在该对象上调用了iter,那么需要它有什么需要?

4 个答案:

答案 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,当然。