zip()
函数将来自多个可迭代对象或者序列的数据交叉组合在一起,将带有 n 个元素的可迭代对象或者序列转换为 n 元组。前面的例子用zip()
函数将两个样本集的数据组合在一起,生成了一个二元组序列。
zip()
函数返回一个生成器,而不会将返回结果实例化。
zip()
函数的作用如下:
zip()
函数需要处理一些特殊情况,比如我们需要知道下列情形中它的运行方式。
- 如果没有输入参数会怎样?
-
如果只有一个输入参数会怎样?
-
如果作为输入参数的序列长度不一致会怎样?
对于其他函数(例如any()
、all()
、len()
和sum()
等),我们需要知道归约空序列时的单位元是什么。例如sum(())
返回0,借助这个概念可以求得zip()
函数的单位元。
显然,每种特殊情况都会生成某种可迭代对象,下面的代码演示了这些情况下zip()
函数的行为。空输入参数的情况如下:
可见没有输入参数的zip()
函数返回一个生成器函数,但里面不含任何数据项,这符合输出为可迭代对象的要求。
单个输入参数的情况如下:
这种情况下,zip()
函数返回单元组序列,也是符合要求的。
输入序列的长度不同时zip()
函数的行为如下:
对于这个结果,Python社区内部存在争议,为什么要截断?为什么不用None
值填充较短的列表?作为zip()
函数的替代,itertools
模块的zip_longest()
函数满足上面的要求。