目录一、什么是打包与拆包1.1 打包Packing1.2 拆包Unpacking二、序列拆包Sequence Unpacking2.1 基本拆包2.2 使用 * 进行扩展拆包三、打包与拆包在函数中的应用3.1 函数返回值中的打包3.2 参数打包*args 与 **kwargs3.3 参数拆包* 与 ** 在函数调用时四、字典的打包与拆包4.1 字典打包4.2 字典拆包4.3 字典拆包用于函数调用五、高级技巧与注意事项5.1 嵌套拆包5.2 使用 * 收集时得到的是列表5.3 同时使用多个 * 的限制5.4 空拆包六、实战案例6.1 交换变量值6.2 分割文件路径6.3 动态参数传递6.4 合并多个列表6.5 函数返回多个值后选择性接收七、总结在 Python 编程中打包packing与拆包unpacking非常实用它们能让代码更简洁、可读性更高尤其在处理序列、字典以及函数参数传递时发挥着巨大作用。本文将带你全面理解打包与拆包的概念、语法及应用场景。一、什么是打包与拆包1.1 打包Packing将多个值组合成一个数据结构如元组、列表、字典的过程称为打包。最常见的打包是使用逗号分隔多个值Python 会自动将其打包成元组。python # 打包成元组 a 1, 2, 3 print(a) # (1, 2, 3) print(type(a)) # class tuple1.2 拆包Unpacking从一个数据结构中提取元素并分别赋值给多个变量的过程称为拆包。拆包要求左侧变量数量与右侧元素数量一致或使用扩展拆包。python # 拆包元组 x, y, z (1, 2, 3) print(x, y, z) # 1 2 3二、序列拆包Sequence UnpackingPython 支持对任何可迭代对象元组、列表、字符串、range 等进行拆包。2.1 基本拆包python # 列表拆包 lst [10, 20, 30] a, b, c lst print(a, b, c) # 10 20 30 # 字符串拆包 s ABC x, y, z s print(x, y, z) # A B C2.2 使用 * 进行扩展拆包当左侧变量数量少于右侧元素数量时可以使用 * 收集剩余元素。这在 Python 3 中非常实用。python # * 收集剩余元素为列表 first, *rest [1, 2, 3, 4] print(first) # 1 print(rest) # [2, 3, 4] # 中间收集 first, *middle, last [1, 2, 3, 4, 5] print(first) # 1 print(middle) # [2, 3, 4] print(last) # 5 # 忽略不需要的元素通常用 _ 占位 _, second, _ [10, 20, 30] print(second) # 20三、打包与拆包在函数中的应用3.1 函数返回值中的打包函数可以返回多个值Python 会自动将它们打包成元组。python def get_stats(numbers): return min(numbers), max(numbers), sum(numbers) / len(numbers) result get_stats([1,2,3,4,5]) print(result) # (1, 5, 3.0) # 拆包接收 min_val, max_val, avg get_stats([1,2,3,4,5]) print(min_val, max_val, avg) # 1 5 3.03.2 参数打包*args 与 **kwargs函数定义时使用 *args 将任意多个位置参数打包成元组使用 **kwargs 将任意多个关键字参数打包成字典。python def show_args(*args, **kwargs): print(位置参数打包为元组:, args) print(关键字参数打包为字典:, kwargs) show_args(1, 2, 3, nameAlice, age25) # 位置参数打包为元组: (1, 2, 3) # 关键字参数打包为字典: {name: Alice, age: 25}3.3 参数拆包* 与 ** 在函数调用时调用函数时可以使用 * 将可迭代对象拆包为位置参数使用 ** 将字典拆包为关键字参数。python def add(a, b, c): return a b c # 列表拆包为位置参数 nums [1, 2, 3] print(add(*nums)) # 6 # 字典拆包为关键字参数 kwargs {a: 10, b: 20, c: 30} print(add(**kwargs)) # 60四、字典的打包与拆包4.1 字典打包使用 ** 可以将两个或多个字典合并成一个新字典Python 3.5。python dict1 {a: 1, b: 2} dict2 {c: 3, d: 4} merged {**dict1, **dict2} print(merged) # {a: 1, b: 2, c: 3, d: 4}4.2 字典拆包与函数调用类似也可以在其他字典构建或更新时拆包。python defaults {host: localhost, port: 8080} config {port: 9090, debug: True} final {**defaults, **config} print(final) # {host: localhost, port: 9090, debug: True}4.3 字典拆包用于函数调用python def greet(name, age): print(f{name} is {age} years old.) person {name: Bob, age: 30} greet(**person) # Bob is 30 years old.五、高级技巧与注意事项5.1 嵌套拆包可以拆包嵌套结构但需要保持结构一致。python # 嵌套元组拆包 data (1, (2, 3)) a, (b, c) data print(a, b, c) # 1 2 3 # 嵌套列表拆包 lst [10, [20, 30]] x, [y, z] lst print(x, y, z) # 10 20 305.2 使用 * 收集时得到的是列表即使源是元组* 收集的结果也是列表便于后续修改。python t (1, 2, 3, 4) first, *rest t print(type(rest)) # class list5.3 同时使用多个 * 的限制在同一个赋值语句中只能使用一个 * 表达式除非在嵌套结构中。python # 错误示例 # a, *b, *c [1,2,3,4,5] # SyntaxError5.4 空拆包如果可迭代对象为空* 会得到空列表。python first, *rest [] # ValueError: not enough values to unpack (expected at least 1, got 0) # 需要至少一个变量来匹配因此使用扩展拆包时确保左侧至少有一个变量可以匹配非空部分。六、实战案例6.1 交换变量值利用拆包实现经典交换无需临时变量。python a, b 5, 10 a, b b, a print(a, b) # 10 56.2 分割文件路径python path /home/user/docs/file.txt folders, filename path.rsplit(/, 1) print(folders) # /home/user/docs print(filename) # file.txt但更优雅的方式是用 os.path.split这里仅示意拆包。6.3 动态参数传递在构建通用函数或装饰器时*args, **kwargs 非常有用。python def logger(func): def wrapper(*args, **kwargs): print(f调用 {func.__name__} 参数: args{args}, kwargs{kwargs}) return func(*args, **kwargs) return wrapper logger def add(a, b): return a b add(3, 5) # 调用 add 参数: args(3, 5), kwargs{}6.4 合并多个列表python list1 [1, 2] list2 [3, 4] merged [*list1, *list2] print(merged) # [1, 2, 3, 4]6.5 函数返回多个值后选择性接收python def get_data(): return 1, 2, 3, 4, 5 a, b, *_ get_data() # 只取前两个 print(a, b) # 1 2七、总结打包元组 a 1, 2, 3逗号分隔值自动成元组拆包序列 x, y, z (1,2,3) 元素个数需匹配扩展拆包 a, *b [1,2,3,4]* 收集剩余为列表函数参数打包 def f(*args, **kwargs)接收任意参数函数调用拆包 f(*iterable, **dict) 传递序列、字典作为参数字典合并{**d1, **d2}创建新字典列表、元组合并 [*lst1, *lst2]合并为列表希望本文能帮助你彻底理解并熟练运用打包与拆包。如果觉得有收获欢迎点赞、收藏、关注