欢迎访问宙启技术站
智能推送

Python中的zip()函数的使用以及其内部逻辑

发布时间:2023-06-12 12:23:10

Python中的zip()函数是一种用于将两个可迭代对象当做参数,将其对应位置上的元素打包成一个个元组,然后返回一个包含这些元组的迭代器。简单来说就是“拉链式”的合并两个可迭代对象。

其函数签名如下:

zip(*iterables)

其中,iterables为至少一个可迭代对象,*iterables表示可以传入多个参数,并且参数数量可以不确定。

下面以示例进行说明:

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]

zipped = zip(a, b, c)

print(list(zipped))

输出结果为:

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

从输出结果可以看出,zip()函数将a、b、c三个列表中对应的元素组合成了一个元组,并将这个元组封装到一个新的列表中返回。这样,我们就可以通过迭代器的方式同时遍历多个列表,非常方便。

同时,当输入的可迭代对象不等长时,zip()函数只会迭代一个列表中最短的可迭代对象,这就是所谓的“截断”特性。例如:

a = [1, 2, 3]
b = ['a', 'b']
c = [7, 8, 9]

zipped = zip(a, b, c)

print(list(zipped))

输出结果为:

[(1, 'a', 7), (2, 'b', 8)]

从输出结果中可以看出,zip()函数只会迭代到b列表的第二个元素,因此最终只组合了两个元素。

在理解了zip()函数的基本使用方式后,我们来看看其内部逻辑。

zip()函数是一个高阶函数,其返回值为一个迭代器对象。当我们调用zip()函数时,函数会返回一个zip对象,这个对象会迭代输入序列中对应位置的元素,并将其返回。具体流程如下:

1. 首先创建一个zip实例,zip()函数创建了一个新的迭代器对象。这个迭代器可以通过迭代访问原序列中所有的元素。

2. 在内部执行过程中,zip()函数会创建一个tuple对象,这个对象用来临时存储要返回的元组。

3. 然后执行zip()函数的核心逻辑,对于每个可迭代对象的当前元素,都添加到新的tuple对象中。如果有多个可迭代对象,则tuple对象包含的元素个数取决于输入序列中元素最少的可迭代对象的元素个数。

4. 当临时tuple对象组建完毕后,zip对象会将其返回。

5. 当zip对象被迭代完后,zip对象不会留下任何痕迹。

总之,zip()函数的作用,就是将多个序列“拉起来”,返回一个新的序列。在使用过程中,要注意可迭代对象元素个数的不同情况。