Python 参数装包(Packing)与解包(Unpacking)

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

注意事项

  1. 参数顺序很重要:def func(a, b, *args, c=0, **kwargs)

    • 先是位置参数
    • 然后是 *args
    • 然后是关键字参数
    • 最后是 **kwargs
  2. 解包时字典的键必须与函数参数名匹配

  3. 不能多次解包同一个参数

这些特性使得 Python 函数能够非常灵活地处理各种参数传递场景。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容