封包
- 将多个值赋值给一个变量时,Python 会自动将这些值封装成元组,这个特性称之为封包
a = 1, 2, 3, 4
print(a)
解包
所有可迭代对象都支持解包
str list tuple dict set reversed range zip enumerate
- 赋值过程中的解包
- 赋值符号左边变量和右边可迭代对象的元素数量一样,则一一对应赋值
# 赋值符号左边变量和右边可迭代对象的元素数量一样,则一一对应赋值
a, b, c, d = (1, 2, 3, 4)
print(a, b, c, d) # 1 2 3 4
# 当左边和右边数量不一样时,会报错
a, b, c, d = (1, 2, 3, 4, 5)
print(a, b, c, d) # 报错
可以在其中一个变量前面加一个星号(*),代表这个变量可接收0个/1个/ 多个元素,并把它们组成列表来赋值,理解起来类似于不定长参数中的 *args。解包过程: 先把其他变量根据位置确定对应要赋值的元素,剩下的元素都归带星号(*)的变量,组成列表来赋值
a, b, *c, d = (1, 2, 3, 4, 5)
print(a, b, c, d) # 1 2 [3, 4] 5
a, b, *c, d, e = (1, 2, 3, 4)
print(a, b, c, d, e) # 1 2 [] 3 4
不允许多个带星号(*)的变量,因为会有歧义
a, *b, *c, d = (1, 2, 3, 4, 5)
print(a, b, c, d)
这种解包的写法是错误的
*a = (1, 2, 3, 4, 5)
正确的写法应该是这样
*a, = (1, 2, 3, 4, 5)
print(a) # [1, 2, 3, 4, 5]
通常约定:当变量不需要使用时, 可以用下划线命名
*a, _, _ = (1, 2, 3, 4, 5)
print(a) # [1, 2, 3]
print(_)
在可迭代对象前面加一个星号( * ),在字典对象前面加双星( ** ), 这种解包方式主要运用在函数传参的过程中
a = (1, 2, 3, 4, 5)
print(*a) # 1 2 3 4 5
print(*(1, 2, 3, 4, 5)) # 同上
在可迭代对象前面加一个星号(*),使其以位置参数的形式传入函数
# 在可迭代对象前面加一个星号(*),使其以位置参数的形式传入函数
def func(a, b, c, d=None):print(a, b, c, d)
tup = (1, 2, 3, 4)
dic = {'name': "Tom", 'age': 18, 'height': 188}
func(*tup) # 等效于 func(1, 2, 3, 4)
func(*dic) # 等效于 func('name', 'age', 'height')
在字典对象前面加双星(**),使其以关键字参数的形式传入函数
def func(a, b, c, d=None):print(a, b, c, d)
dic = {'a': "Tom", 'b': 18, 'c': 188, 'd': True}
func(**dic) # 等效于 func(a="Tom", b=18, c=188, d=True)
def func(**d):print(d)
dic = {'a': "Tom", 'b': 18, 'c': 188, 'd': True}
func(**dic)
def func(**d):print(**d)d = {'sep':'1', 'end':'2'}
func(**d)
函数中解包与封包的使用
list = [1, 2, 3, 4 ]
def func(a, b, c, d):print(a, b, c, d)func(list)
为什么报错?
list = [1, 2, 3, 4 ]
def func(a, b, c, d):print(a, b, c, d)func(*list)
def func(*a):print(*a)a = [1, 2, 3, 4]
func(*a)