通俗解释:
打包:将多个物品装到一个盒子里
解包:将盒子里的物品放到不同袋子中
1、python自动实现可迭代对象的打包、解包
打包:多个以逗号分隔的值(可以是不同类型)赋给一个变量时,多个值会被打包成一个元组类型赋值给变量
解包:将可迭代对象中的元素依次赋值给多个变量,左侧变量数==可迭代对象的元素个数,否则会报ValueError
# 打包:python自动将元素打包成元祖
a = 1,2,3 # a为(1,2,3)
# 解包
x, y, z = a # x=1,y=2,z=3
x, y, z = [1, 2, 3] # x=1,y=2,z=3
x, y = {'a':1,'b':2} # x=a,y=b 默认将字典的key赋值给变量
x, y = {'a':1,'b':2}.items() # x=('a', 1) ,y=('b', 2)
x, y = 'hg' # x=h,y=g
# 可迭代对象包含的元素和前面待赋值变量数量不一致,会报错
x, y = a # 报错:ValueError: too many values to unpack (expected 2) 包里解压太多元素
x, y, z, o = a # 报错:ValueError: not enough values to unpack (expected 6, got 5) 包里没有足够元素可以解压
2、*对可迭代对象进行打包/解包
# 打包
x, *y = [1, 'ttt', 66]
print(x,y) # x=1,y=['ttt', 66]
x, *y = {'a':1,'b':2,'c':3}
print(x,y) # x=a,y=['b', 'c']
x, *y = 'tykl'
print(x,y) # x=t,y=['y', 'k', 'l']
x,*y = {1,'ysl','oo'}
print(x,y) # x=ysl,y=[1, 'oo']
# 异常情况
*x = 1, 2 # 报错:SyntaxError: starred assignment target must be in a list or tuple
*x, = 1, 2 # x=[1, 2]
# 解包
# 元祖
a = (1, 2, 3)
print(*a) # 打印1 2 3
# 列表
b = [1, 2, 3]
print(*b) # 打印1 2 3
# 字典
c = {'a':1,'b':2}
print(*c) # 打印 a b
print(*c.values()) # 打印 1 2
print(*c.items()) # 打印 ('a', 1) ('b', 2)
# 集合
d = {1, 2, 2}
print(*d) # 打印 1 2
# 字符串
e = '6yt1'
print(*e) # 打印 6 y t 1
print()函数只支持 *args,不支持 **kwargs
print(**c)
# 报错:TypeError: 'a' is an invalid keyword argument for print()
3、打包、解包在函数中的应用
3.1 在函数定义时:使用 */** 收集元素进行打包,不限制传入参数的个数,分为2种:
- *args:使用元祖获取传入的参数
- ** kwargs:使用字典接收传入的 k=w 形式的关键字参数
def myfunc(*args, **kwargs):
print(type(args),type(kwargs))
print(args)
print(kwargs)
myfunc(1, 2, 3, a=1, b=2)
执行结果:
<class 'tuple'> <class 'dict'>
(1, 2, 3)
{'a': 1, 'b': 2}
注意点:(1)python语法规定:*args参数需要放在 **kwargs参数前;(2)python语法规定:**kwargs关键字参数后不能有其他参数;(3)(参数1,*args,参数2)必须要求函数传递参数2,且参数2必须是关键字参数
def myfunc5(x, *args, y):
print(f'x:{x}\nargs:{args}\ny:{y}')
myfunc5(7, 8, 9, 10, 11, y='aa')
执行结果:
x:7
args:(8, 9, 10, 11)
y:aa
3.2 在函数调用时,使用 */** 对参数进行解包
def myfunc2(x, y, z):
print(x, y, z)
li = [1, 2, 3]
myfunc2(*li)
执行结果:
1 2 3
# 根据key值匹配函数的参数值,依次将value值传入函数中
def myfunc2(a, b, c):
print(a, b, c)
dic = {'c':1, 'a':2, 'b':3}
myfunc2(**dic) # 根据字典key将对应value值传入函数中,顺序不重要,但是key不能多不能少
执行结果:
2 3 1
3.3 组合使用
def myfunc3(x, *args, **kwargs):
print(f'x:{x}\nargs:{args}\nkwargs:{kwargs}')
pass
li = 'ysl', 99, 88
myfunc3(9, *li, a=9, **{'name':'ysl', 'age': 18})
执行结果:
x:9
args:('ysl', 99, 88)
kwargs:{'a': 9, 'name': 'ysl', 'age': 18}
3.4 函数返回:Return a,b,... ---->实际是返回元组(a, b, ...)
def myfunc4(a, b):
a += 2
b += 4
return a,b
tmp = 1, 2
result = myfunc4(*tmp)
print(type(result))
print(result)
执行结果:
<class 'tuple'>
(3, 6)
有问题或补充欢迎留言
538





