【问题标题】:understanding zip function了解 zip 功能
【发布时间】: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


【解决方案1】:

看起来这是文档中的错误。 “等效”代码在 python2 中有效,但在 python3 中无效,进入无限循环。

而最新版本的文档也有同样的问题:http://docs.python.org/release/3.1.2/library/functions.html

看起来更改 61361 是问题所在,因为它合并了来自 python 2.6 的更改,而没有验证它们对于 python3 是否正确。

在主干文档集中似乎不存在该问题,但您可能应该在 http://bugs.python.org/ 报告有关它的错误。

【讨论】:

  • 好的,报告了。澄清一下:while 将评估为 true,因为 iterables 是一个迭代器;并且迭代器总是评估为真,无论其内容如何。此外,iterables 将在循环的第一次运行时耗尽,因此此后它将继续产生空元组。对吗?
  • @max:它将评估为True,因为iterables 是一个非空列表。你甚至读过我发布的内容吗?
  • 抱歉错过了你的答案 :( 所以如果在 Python 2 中运行,那将是真的,因为可迭代列表不为空;但如果在 Python 3 中运行(我在评论中假设),它会是真的,因为 iterables 是一个迭代器,而迭代器总是计算为真,对吗?
  • @max:感谢您提出这个错误。
【解决方案2】:

似乎这段代码应该被读取为 python-2.x 代码。它甚至无法在 py3k 中正常运行。

在 python-2.x 中发生的事情是 map 返回一个迭代器列表,当调用 next 时它返回一个迭代器元素,这些元素组合成元组。所以,给定

>>> zip('ABCD', 'xy')

iterables 是 2 个迭代器的列表,在 while 循环内的每次迭代中,迭代器的下一个(第一个剩余的)元素被消耗(''A''x' 等),并作为元组的元素产生,然后在产生最后一个元素之后,(在第 3 次迭代中)引发 StopIteration 停止生成器。 while iterables 始终保持为True

【讨论】:

  • @max 它被标记为 python-3。第一句话说这只是关于python 3。为什么要在答案是python-2的基础上投票呢? Ditto Ruby,或者其他不是 python-3 的东西?
  • @RobertGrant 因为引用 python 2 是解释官方 python 文档显然完全错误的唯一方法。
猜你喜欢
  • 2015-04-17
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2018-12-17
  • 2020-02-16
  • 1970-01-01
相关资源
最近更新 更多