所以我一直在寫迭代器,並且我認爲我理解了它們。但是我今晚一直在努力解決一些問題,而我越玩越容易陷入困境。迭代器協議。它是黑魔法嗎?
我認爲迭代器必須實現__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
謝謝。我想在一開始就知道這一切,但我也在一開始就想到了,但也想到了其他一些非常非常錯誤的事情。 –