因为我觉得解包是 Python 的一大特性,大大提升了编程的效率,而且适用性很广
a, b, c = [1, 2, 3]
print(a, b, c)
# 输出结果
1 2 3
列表有 3 个元素,此时也需要 3 个变量去接,否则会报错
a, b = [1, 2, 3]
# 输出结果
a, b = [1, 2, 3]
ValueError: too many values to unpack (expected 2)
太多值无法解包
https://cloud.tencent.com/developer/article/1814243
>>> a,b,c = (1,2,3)
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c = "abc"
>>> a
'a'
>>> b
'b'
>>> c
'c'
>>> a,b,c = {1,2,3}
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c = {"a":1, "b":2, "c":3}
>>> a
'a'
>>> b
'b'
>>> c
'c'
字典解包后,只会把字典的 key 取出来
>>> a, b = 1, 2
>>> a
1
>>> b
2
# 生成器
a, b, c = (x + 1 for x in range(3))
print(a, b, c)
# 输出结果
1 2 3
https://cloud.tencent.com/developer/article/1815053
上面提到了这个报错问题
a, b = [1, 2, 3]
# 输出结果
a, b = [1, 2, 3]
ValueError: too many values to unpack (expected 2)
# 多变量
a, b, *c = [1, 2, 3, 4, 5]
print(a, b, c)
# 输出结果
1 2 [3, 4, 5]
# 多变量
a, b, *c, d = [1, 2, 3, 4, 5]
print(a, b, c, d)
# 输出结果
1 2 [3, 4] 5
主要是可变参数、关键字参数
详解文章:https://cloud.tencent.com/developer/article/1640717
函数详解文章:https://cloud.tencent.com/developer/article/1857029
# 函数
def test(a, b, c):
print(a, b, c)
# 正常逐个传参
test(1, 2, 3)
# 只传一个可迭代对象,就需要解包
test(*[1, 2, 3])
test(*{1, 2, 3})
test(*(1, 2, 3))
# 输出结果
1 2 3
1 2 3
1 2 3
1 2 3
# 函数
def test(a, b, c):
print(a, b, c)
# 关键字传参
test(a=1, b=2, c=3)
# 只传一个可迭代对象,就需要解包,和上面写法是等价的
test(**{"a": 1, "b": 2, "c": 3})
# 输出结果
1 2 3
1 2 3
# 函数
def test(a, b, c, d, e, f):
print(a, b, c, d, e, f)
test(*[1, 2, ], *[3, 4, ], **{"e": 5}, **{"f": 6})
# 输出结果
1 2 3 4 5 6
# 表达式解包
print(range(3), 3)
print(*range(3), 3)
print([*range(3), 3])
print({"a": 1, **{"b": 2, "c": 3}})
# 输出结果
range(0, 3) 3
0 1 2 3
[0, 1, 2, 3]
{'a': 1, 'b': 2, 'c': 3}
# 解包拼接列表
list1 = [1, 2]
list2 = range(3, 5)
list3 = [*list1, *list2]
print(list3)
# 输出结果
[1, 2, 3, 4]
list1 可以直接和 list2 做 + 操作吗?
不行,因为 list 无法与 range() 对象相加
# 解包拼接字典
dict1 = {"a": 1, "b": 2}
dict2 = {"name": "yy", "age": 22}
dict3 = {**dict1, **dict2}
print(dict3)
# 输出结果
{'a': 1, 'b': 2, 'name': 'yy', 'age': 22}