博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
py - understanding zip function
阅读量:4177 次
发布时间:2019-05-26

本文共 4297 字,大约阅读时间需要 14 分钟。

from: http://stackoverflow.com/questions/3865640/understanding-zip-function
12
6

All discussion is about python 3.1.2; see  for the source of my question.

I know what zip does; I just don't understand why it can be implemented like this:

def zip(*iterables):    # zip('ABCD', 'xy') --> Ax By    iterables = map(iter, iterables)    while iterables:        yield tuple(map(next, iterables))

Let's say I call zip(c1, c2, c3). If I understand correctly, iterables is initially the tuple (c1, c2, c3).

The line iterables = map(iter, iterables) converts it to an iterator that would return iter(c1), iter(c2), iter(c3) if iterated through.

Inside the loop, map(next, iterables) is an iterator that would return next(iter(c1))next(iter(c2)), and next(iter(c3)) if iterated through. The tuple call converts it to (next(iter(c1)), next(iter(c2)), next(iter(c3)), exhausting its argument (iterables) on the very first call as far as I can tell. I don't understand how the while loop manages to continue given that it checks iterables; and if it does continue why the tuple call doesn't return empty tuple (the iterator being exhausted).

I'm sure I'm missing something very simple..

 
 
Weird, it loops endlessly for me even though it looks perfectly fine... and my own attempt doesn't work either o.O I am shocked. –   
Oct 5 '10 at 17:14 
 
I think this is just pseudocode and shouldn't be taken literally. –   
Oct 5 '10 at 17:16
1  
@Radomir Dopieralski It's Python code, not pseudocode, copied directly from the documentation. I would be quite sad if I couldn't rely on it, and instead had to make my best guess about what the function really does. I refer to the code like this whenever I am not 100% sure about the function's semantics. –   
Oct 5 '10 at 17:19 
 
I guess you can learn from this that no-one is perfect. –   
Oct 5 '10 at 18:21

2 Answers

8
accepted

It looks like it's a bug in the documentation. The 'equivalent' code works in python2 but not in python3, where it goes into an infinite loop.

And the latest version of the documentation has the same problem:

Looks like change  was the problem, as it merged changes from python 2.6 without verifying that they were correct for python3.

It looks like the issue doesn't exist on the trunk documentation set, but you probably should report a bug about it at .

 
 
Ok, reported. To clarify: the while will evaluate to true because iterables is an iterator; and iterator always evaluates to true regardless of its contents. Furthermore, the iterables will exhausted on the first run through the loop, so it would keep yielding empty tuple thereafter. Correct? –   
Oct 5 '10 at 18:37
 
@max: it will evaluate to True because iterables is a non-empty list. Did you even read what I've posted? –   
Oct 5 '10 at 18:42 
 
Sorry missed your answer :( So if run in Python 2, it would be true because iterables list isn't empty; but if run in Python 3 (which I assumed in my comment), it would be true because iterables is an iterator, and iterator always evaluates to true, correct? –   
Oct 5 '10 at 18:49
 
@max: that's right. –   
Oct 5 '10 at 18:59
 
@max: Thanks for raising that bug. –   
Oct 6 '10 at 9:02
7

It seems like this code is supposed to be read as python-2.x code. It doesn't even run properly in py3k.

What happens in python-2.x is that map return a list of iterators, when next is called it returns an element of iterator, those elements combined into tuple. So, given

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

iterables is a list of 2 iterators, on each iteration within the while loop, next (first remaining) element of iterator is consumed (''A' and 'x', etc), and yielded as an element of a tuple, then after last elements are yielded, (on 3rd iteration) raised StopIteration stops the generator. while iterablesalways remains True.

 
 
+1 for python-2.x explanation.. –   
Oct 5 '10 at 18:52
 
@max it's tagged python-3. First sentence says it's just about python 3. Why upvote on the basis that the answer is for python-2? Ditto Ruby, or anything else that isn't python-3? –   
Apr 16 '15 at 13:55
 
@RobertGrant because referring to python 2 was the only way to explain how the the official python documentation was apparently completely wrong. –   
Apr 16 '15 at 19:37

转载地址:http://xktai.baihongyu.com/

你可能感兴趣的文章
Qt显示图片,QLabel加载图片两种方法
查看>>
Qt窗体布局管理器 QFormLayout
查看>>
Qt布局里重要的三个概念
查看>>
qtDesigner设计界面中如何往工具栏中添加按钮QAction
查看>>
QDockWidget的属性设置
查看>>
Qt状态栏添加临时消息和永久消息
查看>>
VS2017 VS2019安装最新版本的Qt插件出现error reading VS project settings
查看>>
qt-016 自定义窗体或者控件的办法
查看>>
不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况
查看>>
win10 装SQL Server 2000入门各种坑
查看>>
VC6.0打开老工程一片空白
查看>>
Navicat Premium 12 连接SQL Server 2000提示SQL Server Native Client 11.0 不支持连接到SQL Server 2000或更早的版本
查看>>
Microsoft SQL Server 2008在win10上安装各种坑
查看>>
vc6.0打不开项目解决方案,VC6.0 安装在win10上遇到的各种坑
查看>>
MFC动态库第一章 - MFC动态库导出类
查看>>
MFC添加lib文件、静态库三种方法
查看>>
QT使用MFC编译的库
查看>>
VS自带的dll函数查看器DEPENDS.exe在哪里
查看>>
Visual Studio 官方下载地址
查看>>
Qt常见警告问题:请更新您的工具包(Desktop Qt 5.14.1MSVC2017 64位)或为qmake选择更符合您的目标环境的mkspec
查看>>