代码之家  ›  专栏  ›  技术社区  ›  max

了解zip函数

  •  14
  • max  · 技术社区  · 14 年前

    所有讨论都是关于Python3.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 循环在检查时设法继续 ;如果继续,为什么 元组

    我肯定我漏掉了一些很简单的东西。。

    2 回复  |  直到 14 年前
        1
  •  9
  •   kmario23 Mazdak    10 年前

    看起来这是文档中的一个bug。“等价”代码在python2中工作,但在python3中不工作,在python3中它进入无限循环。

    http://docs.python.org/release/3.1.2/library/functions.html

    看起来像变了 61361

    看起来这个问题在主干文档集中不存在,但是您可能应该在 http://bugs.python.org/

        2
  •  7
  •   SilentGhost    14 年前

    看起来这段代码应该被解读为python-2.x代码。它在py3k中甚至不能正常运行。

    在python-2.x中发生的是 map 返回迭代器列表,当 next

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

    iterables是一个由两个迭代器组成的列表,在while循环中的每个迭代中,迭代器的下一个(剩余的第一个)元素被使用(' 'A' 'x' ,等),并作为元组的一个元素产生,然后在产生最后一个元素之后(在第三次迭代中)引发 StopIteration while iterables 始终保持 True .