Python 参数装包(Packing)与解包(Unpacking)
在 Python 中,参数装包和解包是处理可变数量参数的强大特性,主要包括 *args
和 **kwargs
两种形式。
参数装包(Packing)
1. 位置参数装包 (*args
)
def func(*args):
print(type(args)) # <class 'tuple'>
print(args)
func(1, 2, 3) # 输出: (1, 2, 3)
func('a', 'b') # 输出: ('a', 'b')
*args
将所有传入的位置参数收集到一个元组中。
2. 关键字参数装包 (**kwargs
)
def func(**kwargs):
print(type(kwargs)) # <class 'dict'>
print(kwargs)
func(a=1, b=2) # 输出: {'a': 1, 'b': 2}
func(name='Alice', age=25) # 输出: {'name': 'Alice', 'age': 25}
**kwargs
将所有传入的关键字参数收集到一个字典中。
3. 混合使用
def func(*args, **kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
func(1, 2, 3, a=4, b=5)
# 输出:
# 位置参数: (1, 2, 3)
# 关键字参数: {'a': 4, 'b': 5}
参数解包(Unpacking)
1. 列表/元组解包 (*
)
def func(a, b, c):
print(a, b, c)
args = [1, 2, 3]
func(*args) # 等价于 func(1, 2, 3)
tuple_args = (4, 5, 6)
func(*tuple_args) # 等价于 func(4, 5, 6)
2. 字典解包 (**
)
def func(a, b, c):
print(a, b, c)
kwargs = {'a': 1, 'b': 2, 'c': 3}
func(**kwargs) # 等价于 func(a=1, b=2, c=3)
3. 混合解包
def func(a, b, c, d):
print(a, b, c, d)
args = [1, 2]
kwargs = {'c': 3, 'd': 4}
func(*args, **kwargs) # 等价于 func(1, 2, c=3, d=4)
实际应用示例
1. 传递参数给其他函数
def wrapper_func(*args, **kwargs):
print("包装函数开始")
other_func(*args, **kwargs)
print("包装函数结束")
def other_func(a, b, c=0):
print(f"a={a}, b={b}, c={c}")
wrapper_func(1, 2, c=3)
# 输出:
# 包装函数开始
# a=1, b=2, c=3
# 包装函数结束
2. 合并字典
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged_dict = {**dict1, **dict2}
print(merged_dict) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
3. 字符串格式化
data = {'name': 'Alice', 'age': 25}
message = "Name: {name}, Age: {age}".format(**data)
print(message) # Name: Alice, Age: 25
注意事项
-
参数顺序很重要:
def func(a, b, *args, c=0, **kwargs)
- 先是位置参数
- 然后是
*args
- 然后是关键字参数
- 最后是
**kwargs
解包时字典的键必须与函数参数名匹配
不能多次解包同一个参数
这些特性使得 Python 函数能够非常灵活地处理各种参数传递场景。