所以我一直在写迭代器,并且我认为我理解了它们。但是我今晚一直在努力解决一些问题,而我越玩越容易陷入困境。迭代器协议。它是黑魔法吗?
我认为迭代器必须实现__iter__
和next
(或__next__
)。而且,当您第一次尝试迭代迭代器时,将调用__iter__
方法,然后next
将被调用,直到StopIteration
被引发。
当我运行这段代码虽然
class Iter(object):
def __iter__(self):
return iter([2, 4, 6])
def next(self):
for y in [1, 2, 3]:
return y
iterable = Iter()
for x in iterable:
print(x)
输出为2 4 6
。因此正在调用__iter__
,但不是next
。这似乎与我找到的文档相匹配here。但是那样会在我的脑海里提出更多的问题。
具体来说,什么是容器类型和迭代器之间的区别,如果它不是next
执行?我怎么知道我的班级将会得到怎样的待遇?最重要的是,如果我想编写一个在使用for x in Iter()
时调用next
方法的课程,我该怎么做?
我想我回来了。所以所有迭代器都是迭代器,但并非所有迭代器都是迭代器。当我遍历一个迭代器时,我真的在遍历它的'iter'方法返回。哪一个可以通过一个迭代器或一个生成器? –
正确。所有迭代器都是可迭代的。并不是所有的迭代器都是迭代器(例如,列表是可迭代的,但它们不是迭代器,因为它们不实现“next”)。通过在对象上调用'iter()'返回任何对象上的对象的迭代。 *必须*返回一个迭代器(生成器是一种迭代器)。 – wim
谢谢。我想在一开始就知道这一切,但我也在一开始就想到了,但也想到了其他一些非常非常错误的事情。 –