解包运算符 * / **(unpaking)
1.什么是解包?
解包可以把序列或者字典的数据展开成多个语法单位;
*alist
解包可迭代对象;**adict
解包字典;
2.什么时候要用*解包?(答案在“怎么用解包”节)
2.1.
比如:有一个列表,你想把它print出来,但是格式要求没有[ ]和,等
,只要内容,你会怎么办?
lis1=[1,2,3,4,5,6,7,8,9]
lis2=['a','b','c','d','e','f','g']
#直接打印的格式是下面这样
print(lis1) #[1, 2, 3, 4, 5, 6, 7, 8, 9]
print(lis2) #['a', 'b', 'c', 'd', 'e', 'f', 'g']
你可能可以想到用join(str)
- 但是它要求里面的argument是字符型,对于数字的还得遍历然后转换成str
或者对于内容比较少的,你会选择直接print每一个里面很多,
傻瓜式输出
#要求的格式是没有其他符号
print(' '.join(str(x) for x in lis1) )#1 2 3 4 5 6 7 8 9
print(' '.join(lis2))#a b c d e f g
print(lis1[0],lis1[1],lis1[2],lis1[3])#1 2 3 4
2.2.
比如:你要计算两点的距离,坐标是用元组表示的,你用complex计算,但是complex(x,y)有两个argument位,你会怎么把坐标填进去?
你可能会这样写,注意代码的第三行,你可能直接用索引获取值放进去,没问题
pos1=(1,2)
pos2=(4,3)
distance=abs(complex(pos1[0],pos1[1])-complex(pos2[0],pos2[1]))
print(distance)#3.1622776601683795
2.3.
比如:你想获取一个列表的头尾数据,你会怎么办?(这个例子有点为了用解包而用解包)
你可能会像下面这样写,没啥问题其实。就是用同步赋值,然后用一个切片就可以搞定。如果想知道用解包这个方法怎么写可以看3.3
#[学号,平时成绩,期中成绩,期末成绩]
lis=[2022212149,78,56,78,90,55,56,46,97]
#想要获取第一位的学号和和后两位成绩
id,mid,final=lis[0],lis[-2],lis[-1]
#获取平时成绩
ohters=lis[1:-2]
print(id,mid,final)#2022212149 46 97
print(f'{ohters=}')#ohters=[78, 56, 78, 90, 55, 56]
3.怎么用*解包?
python有一个神奇的运算符就是*
解包运算符。
- 解包,顾名思义可以理解成把容器包里的东西光秃秃的拿出来而不拖泥带水(有其他匹配身份特征的符号)
-3.1.
(对应上面一小节的思考题1)直接*列表名(可迭代对象)
就可以实现print内容空一格这样的格式了是不是很好用!
print(*lis1)#1 2 3 4 5 6 7 8 9
print(*lis2)#a b c d e f g
而且类似的,range()也是一个可迭代对象,就可以通过解包直接输出从0-20的偶数和奇数
print(*range(0,21,2))#0 2 4 6 8 10 12 14 16 18 20
print(*range(1,21,2))#1 3 5 7 9 11 13 15 17 19
-3.2.
可以用*元组名
对它坐标元组进行解包,放到参数位,代码看起来就更简洁了
pos1=(1,2)
pos2=(4,3)
distance=abs(complex(*pos1)-complex(*pos2))
print(distance)#3.1622776601683795
-3.3
如果不需要知道平时成绩,可以直接用*_
,占位,然后写上你需要的argument,这里就感觉有点小装逼了
lis=[2022212149,78,56,78,90,55,56,46,97]
id,*others,mid,final=lis
#id,*_,mid,final=lis
print(id,mid,final)
print(f'{others=}')
4.什么时候要用**解包?
**是针对于字典的解包符
4.1
比如,你要用函数,它有几个参数,然后很多函数用到的参数都是这几个,你会怎么办?每次都重新写上去吗?(这里仅以1个函数为例)
print(2022212149,78,56,78,90,55,56,46,97,sep=',',end='#')
#运行如下:2022212149,78,56,78,90,55,56,46,97#
5.怎么用**解包?
-5.1
不过这样用解包,必须argument的参数名称一样,具体情况具体分析,不然也挺鸡肋的
arguments={'sep':",",'end':"#"}
print(2022212149,78,56,78,90,55,56,46,97,**arguments)
6.python中有哪些是可迭代对象?
在Python中,很多对象都是可迭代的,例如:
- 序列类型:列表(list)、元组(tuple)
- 集合类型:集合(set)、不可变集合(frozenset)
- 映射类型:字典(dict)
- 文件对象(file)
- 字符串(str)
- range对象
- enumerate对象
- zip对象
- itertools模块中的各种迭代器
除此之外,Python还提供了许多第三方库的对象也是可迭代的,如pandas中的DataFrame和Series等。
参考
本篇有参考b站up主的知识讲解内容