内置容器的迭代器
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'
根据我目前的理解,您可以通过简单地定义 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'