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
.)
这是迭代和迭代器之间的区别.您可以使用iter(x)
为任何给定的iterable构建迭代器x
.迭代器封装迭代的状态,而迭代是可以创建新迭代器的东西.
xrange()
是一个可迭代的,但不是迭代器.您可以为单个xrange()
对象创建多个迭代器,并且每个对象都有自己的位置.
该zip()
函数隐式调用iter()
其每个参数.因为zip(*[xrange(5)]*2)
,这将为相同的xrange()
对象创建两个迭代器,每个迭代器都有自己的迭代状态.因为zip(*[iter(xrange(5))]*2)
,您已经两次传入相同的迭代器.调用iter()
迭代器只是返回迭代器本身,因此在这种情况下最终只有一个迭代器.