python笔记: 解包

"*****"

Posted by NOTNAME on February 9, 2025

1. 基本解包

解包的最基本形式是将一个序列中的元素分别赋值给多个变量。

示例

1
2
3
4
a, b, c = [1, 2, 3]
print(a)  # 输出: 1
print(b)  # 输出: 2
print(c)  # 输出: 3

这里,列表 [1, 2, 3] 被解包,分别赋值给 a、b 和 c。

2. 使用 * 捕获多余元素

当序列中的元素数量多于变量数量时,可以使用 * 来捕获多余的元素,并将它们存储为一个列表。

1
2
3
4
a, *b, c = [1, 2, 3, 4, 5]
print(a)  # 输出: 1
print(b)  # 输出: [2, 3, 4]
print(c)  # 输出: 5

a 匹配第一个元素 1。

c 匹配最后一个元素 5。

*b 捕获中间的所有元素 [2, 3, 4]。

3. 解包的应用场景

解包在 Python 中有很多实际应用场景,以下是一些常见的例子:

(1) 函数参数传递

解包可以用于将列表或元组的元素作为参数传递给函数。

1
2
3
4
5
6
def add(a, b, c):
    return a + b + c

numbers = [1, 2, 3]
result = add(*numbers)  # 等价于 add(1, 2, 3)
print(result)  # 输出: 6

(2) 交换变量值

解包可以轻松交换两个变量的值,而不需要临时变量。

1
2
3
4
x, y = 10, 20
x, y = y, x  # 交换 x 和 y 的值
print(x)  # 输出: 20
print(y)  # 输出: 10

(3) 处理不定长输入

解包非常适合处理长度不确定的输入数据。

1
2
3
4
5
# 输入: "add Alice Bob Charlie done"
oper, *name, vf = input().split()
print(oper)  # 输出: "add"
print(name)  # 输出: ["Alice", "Bob", "Charlie"]
print(vf)    # 输出: "done"

4. 嵌套解包

解包还可以用于嵌套结构,例如嵌套列表或元组。

1
2
3
4
5
6
data = [1, [2, 3], 4]
a, (b, c), d = data
print(a)  # 输出: 1
print(b)  # 输出: 2
print(c)  # 输出: 3
print(d)  # 输出: 4

5. 解包的注意事项

变量数量必须匹配:

如果变量数量少于序列中的元素数量,且没有使用 * 捕获多余元素,会抛出 ValueError。

例如:

1
a, b = [1, 2, 3]  # ValueError: too many values to unpack

*只能使用一次:

在一个解包表达式中,*只能出现一次,否则会引发语法错误。

例如:

1
a, *b, *c = [1, 2, 3, 4]  # SyntaxError: two starred expressions in assignment

*可以捕获空列表:

如果没有多余的元素,* 会捕获一个空列表。

例如:

1
2
a, *b, c = [1, 2]
print(b)  # 输出: []

6. 解包的扩展用法

(1) 解包字典

使用 ** 可以将字典解包为关键字参数。

1
2
3
4
5
def greet(name, age):
    print(f"Hello {name}, you are {age} years old.")

person = {"name": "Alice", "age": 25}
greet(**person)  # 输出: Hello Alice, you are 25 years old.

(2) 合并列表或字典

解包可以用于合并列表或字典。

1
2
3
4
5
6
7
8
9
10
11
# 合并列表
list1 = [1, 2]
list2 = [3, 4]
merged_list = [*list1, *list2]
print(merged_list)  # 输出: [1, 2, 3, 4]

# 合并字典
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}
  • 总结 解包是 Python 中非常实用的特性,可以简化代码并提高可读性。

* 用于捕获多余元素,** 用于解包字典。

解包适用于函数参数传递、变量交换、处理不定长输入等场景。