内置容器的迭代器

Iterators for built-in containers

根据我目前的理解,您可以通过简单地定义 both user-defined 对象轻松地创建迭代器 __iter__ 方法和它的 __next__ 方法。这是非常直观的理解。

我还了解到,您可以为任何 内置 容器手动构建迭代器,只需在该容器上调用 iter() 方法即可。

以基本上任何容器为例,我不明白的是为什么他们不为自己定义一个 __next__ 方法。相反,当在容器上调用 iter 方法时(因此,<container>.__iter__)它 returns 一个类型为 <container_type>_iterator 的新对象,而不是容器本身。


最后,问题是,为什么容器对象委托它们的 iterator 功能来分离 <type>_iterator 对象而不是自己定义它?

如果容器是它自己的迭代器(例如提供了一个 __next__ 方法),您只能在一个地方迭代它。你不能有独立的迭代器。每次调用 __next__ 都会给出容器中的下一个值,您将无法返回到第一个值;你实际上有一个生成器,它只能在容器中生成一次值。

通过为给定容器创建单独的迭代器,您可以独立迭代:

>>> lst = ['foo', 'bar', 'baz']
>>> it1 = iter(lst)
>>> it2 = iter(lst)
>>> next(it1)
'foo'
>>> next(it2)
'foo'
>>> list(it1)
['bar', 'baz']
>>> next(it2)
'bar'