python - 在 xrange 对象上调用多个迭代器

标签 python iterator generator

为什么

zip(*[xrange(5)]*2)

给出 [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] 但是

zip(*[iter(xrange(5))]*2)

给出 [(0, 1), (2, 3)]?

我一直认为生成器是迭代器,所以生成器上的 iter 是空操作。

例如,

list(iter(xrange(5)))
[0, 1, 2, 3, 4]

相同
list(xrange(5))
[0, 1, 2, 3, 4]

(对于 Python 3 也是如此,但是使用 list(zip(range。)

最佳答案

iterableiterator 之间是有区别的。您可以使用 iter(x) 为任何给定的可迭代 x 构建迭代器。迭代器封装了迭代的状态,而可迭代对象是您可以从中创建新迭代器的东西。

xrange() 是可迭代对象,但不是迭代器。您可以为单个 xrange() 对象创建多个迭代器,每个迭代器都有自己的位置。

zip() 函数在其每个参数上隐式调用 iter()。对于 zip(*[xrange(5)]*2),这将为相同的 xrange() 对象创建两个迭代器,每个迭代器都有自己的迭代状态。对于 zip(*[iter(xrange(5))]*2),您已经两次传入同一个迭代器。在迭代器上调用 iter() 只会返回迭代器本身,因此在这种情况下您最终只会得到一个迭代器。

关于python - 在 xrange 对象上调用多个迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20670525/

相关文章:

javascript - 特定字符串的 HTML 偶数异常

php - 如何在通过 foreach 迭代对象时调用 Iterator 方法

java - 集合上的线程安全迭代

c++ - 迭代器两个**的含义

python - 从文件中读取行的生成器

Python Pandas 在一行中插入行数据

Python:具有多索引的 dataframe.get()

python - Tensorflow Dataset.from_generator 因 pyfunc 异常而失败

ecmascript-6 - eslint无法识别Flow Generator类型

python - 更改 Jupyter QtConsole 设置