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

Pau*_*per 7 python iterator generator

为什么

zip(*[xrange(5)]*2)
Run Code Online (Sandbox Code Playgroud)

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

zip(*[iter(xrange(5))]*2)
Run Code Online (Sandbox Code Playgroud)

[(0, 1), (2, 3)]

我总是认为发电机是迭代器,所以iter在发电机上是无操作的.

例如,

list(iter(xrange(5)))
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

是相同的

list(xrange(5))
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

(对于Python 3也是如此,但是list(zip(range.)

Sve*_*ach 8

这是迭代迭代器之间的区别.您可以使用iter(x)为任何给定的iterable构建迭代器x.迭代器封装迭代的状态,而迭代是可以创建新迭代器的东西.

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

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