max*_*max 14 python zip iterator python-3.x
所有讨论都是关于python 3.1.2; 请参阅Python文档以获取我的问题的来源.
我知道什么zip呢; 我只是不明白为什么它可以像这样实现:
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
iterables = map(iter, iterables)
while iterables:
yield tuple(map(next, iterables))
Run Code Online (Sandbox Code Playgroud)
比方说我打电话zip(c1, c2, c3).如果我理解正确,iterables最初是元组(c1,c2,c3).
该行将其iterables = map(iter, iterables)转换为迭代器,如果迭代,它将返回iter(c1),iter(c2),iter(c3).
在循环中,map(next, iterables)是会返回一个迭代器next(iter(c1)),next(iter(c2))以及next(iter(c3))如果通过迭代.的tuple通话将其转换为(next(iter(c1)), next(iter(c2)), next(iter(c3)),用尽其参数(iterables据我可以告诉在第一个调用).我不明白while循环如何继续,因为它检查iterables; 如果它继续,为什么tuple调用不返回空元组(迭代器耗尽).
我确定我错过了很简单的东西..
看起来这是文档中的错误.'等效'代码在python2中工作,但不在python3中,它进入无限循环.
最新版本的文档也存在同样的问题:http://docs.python.org/release/3.1.2/library/functions.html
看起来像更改61361是问题,因为它合并了python 2.6的更改,而没有验证它们对python3是否正确.
看起来主干文档集上不存在该问题,但您可能应该在http://bugs.python.org/上报告有关它的错误.
看起来这个代码应该被读作python-2.x代码.它甚至没有在py3k中正常运行.
python-2.x中发生的是map返回迭代器列表,当next调用它时返回迭代器元素,这些元素组合成元组.所以,给定
>>> zip('ABCD', 'xy')
Run Code Online (Sandbox Code Playgroud)
iterables是2个迭代器的列表,在while循环中的每次迭代中,迭代器的下一个(第一个剩余的)元素被消耗(' 'A'和'x'等),并且作为元组的元素产生,然后在产生最后的元素之后,(在第3次迭代)上升StopIteration停止发电机.while iterables永远都是True.