【发布时间】:2011-04-21 09:46:12
【问题描述】:
所有讨论都是关于 python 3.1.2;请参阅Python docs 了解我的问题来源。
我知道zip 做了什么;我只是不明白为什么可以这样实现:
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
iterables = map(iter, iterables)
while iterables:
yield tuple(map(next, iterables))
假设我打电话给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 调用不返回空元组(迭代器被耗尽)。
我确定我错过了一些非常简单的东西..
【问题讨论】:
-
很奇怪,它对我来说无休止地循环,即使它看起来非常好......而且我自己的尝试也不起作用o.O我很震惊。
-
我认为这只是伪代码,不应该从字面上理解。
-
@Radomir Dopieralski 这是直接从文档复制的 Python 代码,而不是伪代码。如果我不能依赖它,我会非常难过,而是不得不对这个函数的真正作用做出最好的猜测。每当我不能 100% 确定函数的语义时,我都会参考这样的代码。
-
我想你可以从中学到没有人是完美的。
标签: python iterator zip python-3.x