zip函数本质是并行迭代器,按位置组合输入序列元素为元组,任一耗尽即停止;支持*解包还原、需itertools.zip_longest处理不等长序列,并广泛用于字典构建与并行赋值。

zip 函数的本质:不是“压缩”,而是“并行迭代”
面试官常问“zip 是做什么的”,很多人脱口而出“把多个列表打包成元组”,这没错,但不够深入。真正关键的是:zip 返回一个迭代器,每次 yield 一个由各输入可迭代对象对应位置元素组成的元组;当任一输入耗尽时,立即停止(短路行为)。这意味着它不缓存全部数据,内存友好,也决定了它无法“重复遍历”——用完即空。
解包 zip 的逆操作:*zip() 的巧妙还原
这是高频考点。已知 z = zip([1,2,3], ['a','b','c']),如何还原出原始两个列表?答案是:list1, list2 = zip(*z)。原理是:*z 将 zip 迭代器解包为多个元组参数,zip 再把这些元组“转置”:第0个元素聚成新元组,第1个元素聚成新元组……。注意返回的是元组,如需列表得显式转换:list(list1), list(list2)。
处理长度不等的序列:itertools.zip_longest 替代方案
原生 zip 遇到长短不一就截断,但面试可能要求“补默认值填满”。这时不能硬写循环,应自然引出标准库:from itertools import zip_longest;zip_longest(a, b, fillvalue=None)。常见陷阱是误以为 zip 有 fillvalue 参数——它没有。还要注意 zip_longest 的 fillvalue 默认是 None,若需其他值(如 0 或 ''),必须显式传入。
与字典构建、并行赋值的实战结合
zip 常用于快速生成字典或解构赋值,体现代码简洁性:
- dict(zip(keys, values)) 是构造映射最 Pythonic 的方式之一;
- for x, y in zip(list_a, list_b): ... 比用索引 range(len(...)) 更安全、更易读;
- 多变量同时接收: a, b, c = zip(*matrix) 可直接解出二维列表的各列(前提是 matrix 行数一致)。










