类似于C/C++中的*既是乘号,又有指针声明、解引用等功能,Python中的*和**也具有语法多义性,以Python3.6版本为例:
1.作为算术运算符
print(2*3) #乘法2*3=6
print(2**3) #乘方2^3=2*2*2=8
2.用于函数形参
一个星号(*)表示接收任意个无名参数作为元组(tuple)来处理;
两个星号(**)表示接收任意个关键字参数对作为字典(dict)来处理。
两者都是Python中的可变参数,如果同时使用*和**,*参数必须在**参数之前。
def func(a,*b,**c):
print('a-->',a)
print('b-->',b)
#对tuple迭代
for i in b:
print(i)
print('c-->',c)
#对dict迭代
for k,v in c.items():
print(k,':',v)
func(1,2,3,c1=4,c2=5)
3.解包
在 Python2 中,如果等号左边变量的个数不等于右边可迭代对象中元素的个数,是不允许解包的。但在 Python3 可以这么做了。
a,*b,c=[1,2,3,4]
print(b) #(2,3)
print(*b) #2,3
在函数调用中解包,使用星号 * 解包一个可迭代对象作为函数的参数。字典对象可以使用两个星号**,解包之后将作为关键字参数传递给函数,** 符号作用的对象是字典对象,它会自动解包成关键字参数 key=value 的格式(注意key对应函数的参数名)。
def func(a,b,c):
print(a,b,c)
func(*[1,2,3]) #1,2,3
func(**{'a':1,'b':2,'d':3}) #1,2,3
在 3.5 之前的版本,函数调用时,一个函数中解包操作只允许一个* 和 一个**。从 3.5 开始,在函数调用中,可以有任意多个解包操作。与此同时,解包操作除了用在函数调用,还可以作用在表达式中。
print(*[1,2,3]) #1,2,3
print([*[1],*[2,3]]) #列表拼接合并 [1,2,3]
print(*{'a':1,'b':2,'c':3}) #a,b,c
print({'a':1,**{'b':2},**{'c':3}}) #字典拼接合并