类似于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)

 

python 乘法运算 python的乘法运算_函数调用

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}})  #字典拼接合并