Python中的压缩和解包: '*'、'**'和zip()
python中*用途广泛,除了在数学运算中作为相乘还可以在其它方便扮演者对数据的解包之用途。
*
数学运算中的相乘
对元组/列表的解包
1. 星号*
可以用于在解包过程中收集多余的值。例如:
numbers = (1, 2, 3, 4, 5) # 解包时使用*收集多余的值 a, b, *rest = numbers print(a) # 输出: 1 print(b) # 输出: 2 print(rest) # 输出: [3, 4, 5]
2. 在函数定义时,结合函数参数表示*args可以传入任意个数的位置参数,例如:
def example(*args): print(args) example(1, 2, 3) # 输出: (1, 2, 3)
*args
会将传入的多个位置参数打包成一个元组。
3. 在使用/调用函数时,*把序列/集合解包(unpack)成位置参数
def add(x, y, z): return x + y + z numbers = (1, 2, 3) result = add(*numbers) print(result) # 输出: 6
*
不仅可以用于函数参数解包,还可以用于解包列表或元组,将其元素作为单独的参数传递给函数。
**
数学运算中的幂
对字典的解包
1. 在函数定义中,**kwargs
表示可变数量的关键字参数。**kwargs
会将传入的多个关键字参数打包成一个字典。
def example(**kwargs): print(kwargs) example(a=1, b=2, c=3) # 输出: {'a': 1, 'b': 2, 'c': 3}
2. 在函数调用时,**
可以用于解包一个字典,将其键值对作为独立的关键字参数传递给函数。
def display(a, b, c): print(a, b, c) data = {'a': 1, 'b': 2, 'c': 3} display(**data) # 输出: 1 2 3
zip()
zip()是python中的内置函数,函数可以将多个可迭代对象(如列表、元组等)组合成一个迭代器,生成包含每个输入可迭代对象对应元素的元组。
语法
zip([iterable, ...])
-
iterable -- 一个或多个迭代器;
例子:
list1 = [1, 2, 3] list2 = ['a', 'b', 'c'] zipped = zip(list1, list2) print(list(zipped)) # 输出: [(1, 'a'), (2, 'b'), (3, 'c')]
可以使用*
操作符来解压缩zip
对象。例如,将组合后的元组拆分回原始列表:
zipped = [(1, 'a'), (2, 'b'), (3, 'c')] unzipped = zip(*zipped) list1, list2 = map(list, unzipped) print(list1) # 输出: [1, 2, 3] print(list2) # 输出: ['a', 'b', 'c']
在这个例子中,*zipped
将[(1, 'a'), (2, 'b'), (3, 'c')]
解包成[(1, 2, 3), ('a', 'b', 'c')]
,然后通过map
将结果转换回列表。