1、数学运算符号
在作为数学运算符号时,*表示乘号,**表示乘方
a = 2
b = 3
>>> a * b
6
>>> a ** b
8
2、函数形参可以接收多个参数
(1)Python允许在函数的形参前面添加一个(*)号,这样就意味着这个形参可以接收多个参数值,而这多个参数值被当作元组传给该形参。同时python只允许一个函数中只能有一个带(*)号的形参,同时这个形参可以在形参列表中的任意位置,不一定非得要在最后一个位置。但处于该形参前面的形参必须使用位置参数,处于该形参后面的形参必须使用关键字参数。
def function(x, *y, z):
print('x = ', x)
print('y = ', y)
print('z = ', z)
>>> function(1, 2, 3, 4, z=5)
x = 1
y = (2, 3, 4)
z = 5
>>> function(x=1, 2, 3, 4, z=5)
报错!
>>> function(1, 2, 3, 4, 5)
报错!
#如果某形参前面加了*号,那么该形参就不能再使用关键字参数进行传值
>>> function(1, y=2, z=3)
报错!
(2)函数形参前使用了两个星号(**)表示该形参可以收集多个关键字参数,这些关键字参数作为一个字典传给该形参。
def function(x, *y, m, **z):
print('x = ', x)
print('y = ', y)
print('m = ', m)
print('z = ', z)
>>> function(1, 2, 3, 4, m=7, a=5, b=6)
x = 1
y = (2, 3, 4)
m = 7
z = {'a':5, 'b':6}
>>> function(1, m=7, a=5, b=6) #没有给参数y传值
x = 1
y = ()
m = 7
z = {'a':5, 'b':6}
#前面说到*号形参可以在任意位置,但**号形参只能在最后一个位置,所以*号形参必须要在**号形参之前
(3)星号分隔符,当一个函数中需要指定哪些是位置参数,哪些是关键字参数时,可以使用星号分隔符,星号分隔符前面的是位置参数,后面的是关键字参数。位置参数只能使用位置传递,关键字参数只能使用关键字传递。带星号的形参也相当于一个星号分隔符。
def function(x, y, *, z):
print('x = ', x)
print('y = ', y)
print('z = ', z)
def fun(x, *y, z):
print('x = ', x)
print('y = ', y)
print('z = ', z)
>>> function(1, 2, z=3)
x = 1
y = 2
z = 3
>>> function(x=1, 2, z=3)
报错!
>>> fun(1, 2, 3, z=4)
x = 1
y = (2, 3)
z = 4
>>> fun(x=1, 2, 3, z=4)
报错!
3、序列解包
在进行序列解包时,可以只解出右边变量的部分元素,其余元素依旧采用列表储存。在左边被赋值的变量前添加(*)号,那么该变量代表一个列表,可以保存多个元素。但一个表达式里面只能有一个带(*)号的变量。
t = tuple(range(6))
a, *b = t
c, *d, e = t
>>> t
(0, 1, 2, 3, 4, 5)
>>> a
0
>>> b
[1, 2, 3, 4, 5]
>>> c
0
>>> d
[1, 2, 3, 4]
>>> e
5
#根据自己想解出哪些元素可任意组合:
*a , b = t
a, b, *c = t
....
4、函数实参解出多个元素
前面说到函数的形参可以使用带星号和双星号的,那么当函数的实参为带星号和双星号的又代表什么意思呢?
(1)星号实参,星号实参将该一个可迭代变量(如列表,元组)中的各个元素解出,以位置参数的方式分别传给函数中的各个参数,但要保证可迭代变量解出的元素与函数中的形参数目相等。如果星号实参作用于字典,则将字典中的key解出以位置参数的方式赋给函数的形参。
def add(x, y):
print(x + y)
param1 = [1, 2]
param2 = (1, 2)
param3 = [1, 2, 3]
>>> add(*param1) # x = 1, y = 2
3
>>> add(*param2) # x = 1, y = 2
3
>> add(*param3)
报错!
-----------------------------------------------------------------------------------
def fun(x, *y):
print('x = ', x)
print('y = ', y)
def fun2(x, *y, z):
print('x = ', x)
print('y = ', y)
print('z = ', z)
a = list(range(6))
>>> a
[0, 1, 2, 3, 4, 5]
>>> fun(*a)
x = 0
y = (1, 2, 3, 4, 5)
>>> fun2(*a)
报错!
# fun2中的形参z为关键字参数,不能通过*号实参传值。
----------------------------------------------------------------------------------
def fun(x, y):
print('x = ', x)
print('y = ', y)
param = {'a':1, 'b':2}
>>> fun(*param) # == fun(x='a', y='b')
x = a
y = b
(2)双星号实参,双星号实参作用于字典,将字典中的key-value的形式转为关键字参数key=value传给函数中的形参,但要保证函数中的形参命名要与字典中的key保持一致,同时也要保持个数相等。
def fun(x, y):
print('x = ', x)
print('y = ', y)
def fun2(a, b):
print('a = ', a)
print('b = ', b)
param = {'x':1, 'y':2}
>>> fun(**param) # == fun(x=1, y=2)
x = 1
y = 2
>>> fun2(**param) # == fun2(x=1, y=2)
报错!
# 字典key与函数中的形参不对应