一、组包(Packing)
👉 把多个值"打包"成一个整体(通常是元组)
python
a = 1, 2, 3
print(a)
输出:
(1, 2, 3)
注意:
不是括号决定元组,而是逗号。
python
a = (1, 2, 3) # 推荐写法
函数返回多个值(本质是组包)
python
def func():
return 1, 2
实际上等价于:
python
return (1, 2)
二、解包(Unpacking)
👉 把一个整体拆成多个变量
python
a, b = 1, 2
等价于:
python
a, b = (1, 2)
解包列表
python
nums = [10, 20]
x, y = nums
解包字符串
python
a, b, c = "abc"
三、星号解包(重点)
这是进阶用法。
1️⃣ 收集剩余元素
python
a, *b = [1, 2, 3, 4]
结果:
a = 1
b = [2, 3, 4]
python
a, *b, c = [1, 2, 3, 4, 5]
a = 1
b = [2, 3, 4]
c = 5
2️⃣ 函数参数解包
python
def add(a, b, c):
print(a + b + c)
nums = [1, 2, 3]
add(*nums)
* 把列表拆开传入。
3️⃣ 字典解包
python
def greet(name, age):
print(name, age)
d = {"name": "Tom", "age": 18}
greet(**d)
** 解包字典。
四、可变参数(也是组包)
*args
python
def func(*args):
print(args)
调用:
python
func(1, 2, 3)
输出:
(1, 2, 3)
👉 本质:组包成元组
**kwargs
python
def func(**kwargs):
print(kwargs)
调用:
python
func(name="Tom", age=18)
输出:
{'name': 'Tom', 'age': 18}
👉 本质:组包成字典
五、扩展解包(Python 3.5+)
合并列表
python
a = [1, 2]
b = [3, 4]
c = [*a, *b]
合并字典
python
d1 = {"a": 1}
d2 = {"b": 2}
d = {**d1, **d2}
六、还有哪些相关概念?
1️⃣ 交换变量(本质是解包)
python
a, b = b, a
2️⃣ 忽略变量
python
a, _, c = (1, 2, 3)
3️⃣ enumerate 解包
python
for i, value in enumerate([10, 20, 30]):
print(i, value)
4️⃣ zip 解包
python
names = ["a", "b"]
scores = [90, 80]
for name, score in zip(names, scores):
print(name, score)
七、和 match(3.10+)的关系
在 Python 3.10 的 match 语句里,也支持结构解包:
python
match (1, 2):
case (a, b):
print(a, b)
八、总结结构图
组包
├─ 元组自动组包
├─ 函数 return
├─ *args
└─ **kwargs
解包
├─ 变量赋值
├─ for 循环
├─ 函数调用 *
├─ 字典调用 **
├─ 星号收集 *
└─ match 结构匹配