《编写高质量Python代码的59个有效方法》——第11条:用zip函数同时遍历两个迭代器

简介:

本节书摘来自华章社区《编写高质量Python代码的59个有效方法》一书中的第11条:用zip函数同时遍历两个迭代器,作者[美]布雷特·斯拉特金(Brett Slatkin),更多章节内容可以访问云栖社区“华章社区”公众号查看

第11条:用zip函数同时遍历两个迭代器
在编写Python代码时,我们通常要面对很多列表,而这些列表里的对象,可能也是相互关联的。通过列表推导,很容易就能根据某个表达式从源列表推算出一份派生类表(参见本书第7条)。

对于本例中的派生列表和源列表来说,相同索引处的两个元素之间有着关联。如果想平行地迭代这两份列表,那么可以根据names源列表的长度来执行循环。

上面这段代码的问题在于,整个循环语句看上去很乱。用下标来访问names和letters会使代码不易阅读。用循环下标i来访问数组的写法一共出现了两次。改用enumerate来做(参见本书第10条)可以稍稍缓解这个问题,但仍然不够理想。

使用Python内置的zip函数,能够令上述代码变得更为简洁。在Python 3中的zip函数,可以把两个或两个以上的迭代器封装为生成器,以便稍后求值。这种zip生成器,会从每个迭代器中获取该迭代器的下一个值,然后把这些值汇聚成元组(tuple)。与通过下标来访问多份列表的那种写法相比,这种用zip写出来的代码更加明晰。

内置的zip函数有两个问题。
第一个问题是,Python 2中的zip并不是生成器,而是会把开发者所提供的那些迭代器,都平行地遍历一次,在此过程中,它都会把那些迭代器所产生的值汇聚成元组,并把那些元组所构成的列表完整地返回给调用者。这可能会占用大量内存并导致程序崩溃。如果要在Python 2里用zip来遍历数据量非常大的迭代器,那么应该使用itertools内置模块中的izip函数(参见本书第46条)。
第二个问题是,如果输入的迭代器长度不同,那么zip会表现出奇怪的行为。例如,我们又给names里添加了一个名字,但却忘了把这个名字的字母数量更新到letters之中。现在,如果用zip同时遍历这两份列表,那就会产生意外的结果。

新元素'Rosalind'并没有出现在遍历结果中。这正是zip的运作方式。受封装的那些迭代器中,只要有一个耗尽,zip就不再产生元组了。如果待遍历的迭代器长度都相同,那么这种运作方式不会出问题,由列表推导所推算出的派生列表一般都和源列表等长。如果待遍历的迭代器长度不同,那么zip会提前终止,这将会导致意外的结果。若不能确定zip所封装的列表是否等长,则可考虑改用itertools内置模块中的zip_longest函数(此函数在Python 2里叫做izip_longest)。
要点
内置的zip函数可以平行地遍历多个迭代器。
Python 3中的zip相当于生成器,会在遍历过程中逐次产生元组,而Python 2中的zip则是直接把这些元组完全生成好,并一次性地返回整份列表。
如果提供的迭代器长度不等,那么zip就会自动提前终止。
itertools内置模块中的zip_longest函数可以平行地遍历多个迭代器,而不用在乎它们的长度是否相等(参见本书第46条)。

相关文章
|
5月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
347 1
|
5月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
683 1
|
5月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
297 0
|
5月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
322 100
|
5月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
498 95
|
6月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
319 101
|
6月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
575 99
|
5月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
274 88
|
5月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
968 68
|
6月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
873 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡

推荐镜像

更多