python - 内置容器的迭代器

标签 python python-3.x iterator containers

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

我还了解到,您可以通过简单地调用 iter() 为任何内置 容器手动构建迭代器。该容器上的方法。

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


最后,问题是,为什么容器对象委托(delegate)它们的 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'

关于python - 内置容器的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186651/

相关文章:

rust - 为什么允许我对迭代器的可变引用调用 take() ?

python - 如何检查文件内的所有文件夹和文件内的子文件夹是否存在特定字符串

python - 比较,例如 float(1.221) 和 c_float(1.221).value,使用减法和 epsilon 还是最佳方式?

python - 正则表达式捕获引号之间的字符串,尤其是当字符串以引号开头时

python - python 中的简单射箭游戏

python - 每 N 秒在后台线程中重复执行一个函数

c++ - `iterator` 和 `const_iterator` 不是 STL 容器的必需成员吗?

python - 我必须仅使用 min() 和 max() 函数对数字进行排序

python - 如何在 Python/OpenCV 中将图像分割成干净的段落?

c++ - 关于迭代器性能的重点应该放在进步还是元素访问上?