前言
python参数类型和参数传递形式多样,相对于其他语言python使用会更加灵活。它传参形式一般分为两种:位置传参,关键字传参。传参形式是相对于实参而言,在函数调用时使用。参数类型一般也分为两种:默认参数,不定长参数。参数类型是相对形参而言,在函数创建时定义。
位置传参
位置传参,我们经常使用的一种函数传参形式,它根据实参的位置传递给对应位置的形式参数。在与其他传参形式混合使用时,必须优先输入位置参数。
1
2
3
4
5
6
7
8
9
10
|
def func(a, b, c):
print (a, b, c)
# 位置参数
if __name__ = = '__main__' :
func( 1 , 6 , 7 ) # 打印结果是1 6 7 位置一一对应
func( 6 , 1 , 7 ) # 打印结果是6 1 7
# func(6, 1) # 实参与形参数量必须一致
# func(6, 1, 7, 9) # 不能多也不能少
|
关键字传参
关键字传参,根据形式参数的名字来进行对应的赋值。
1
2
3
4
5
6
7
8
9
10
11
12
|
def func(a, b, c):
print (a, b, c)
# 关键字参数
if __name__ = = '__main__' :
func( 1 , b = 6 , c = 7 ) # 打印结果是1 6 7
func(c = 3 , b = 1 , a = 7 ) # 打印结果是7 1 3
# func(c=2, b=3) # 不能少赋值
# func(c=2, b=3,a=6,c=5) # 不能多赋值
# func(c=2, b=3,a=5,qq=3) # 也不能无关赋值
# func(1, b=6, 7) # 与位置传参混合使用时,必须位置参数在前,而且不能交替使用
|
默认参数
默认参数,就是形参会有个默认值,如果有新值传入就使用新值,否则使用默认值。形参使用默认参数时同样需要注意位置,必须写在位置参数后面(其实不能叫位置参数,但是为了理解就把没有赋值的普通形参叫做位置参数),否则会报错。如下方ab必须写在c后面。
1
2
3
4
5
6
7
8
9
10
11
|
# 默认参数必须要写在右侧
def func(a, b = 5 , c = 3 ):
print (a, b, c)
# 默认参数
if __name__ = = '__main__' :
func( 1 ) # 打印的结果是 1 5 3
func( 1 , 6 ) # 打印的结果是 1 6 3
func( 1 , 2 , 7 ) # 打印结果是1 2 7
func(b = 1 , a = 4 ) # 打印结果是4 1 3
|
不定长参数
不定长参数有两种表现形式。
- 在形参前面加个*(*args),表示不定长元组形参,可以接收所有通过位置传参进来的实参,将其存入元组里面。
- 在形参前面加两个*(**kwargs),表示不定长字典形参,可以接收所有通过关键字传参进来的实参,将其存入字典里面。
1
2
3
4
5
6
7
8
|
# 不定长参数
def func( * args, * * kwargs):
print (args)
print (kwargs)
if __name__ = = '__main__' :
func( 1 , 4 , 8 , 7 , a = 5 , h = 6 , l = 15 ) # 注意实参形参顺序要对应
|
结果
(1, 4, 8, 7) # 元组
{'a': 5, 'h': 6, 'l': 15} # 字典
混合使用问题
创建时
1
2
|
def func1(a, b = 5 , * args, c = 7 , * * kwargs):
print (a, b, args, c, kwargs)
|
我们先给它们一个称呼方便引用。就称a为普通参数,b为默认参数,*args为可变参数(因为它能接收多个实参),**kwargs为可变关键字参数(因为它能接收多个通过关键字传参进来的实参)。
- 普通参数必须写在最前面(写在其他类型参数前面)
- 可变关键字参数必须写在最后面(写在其他参数类型后面)
- 可变参数与可变关键字参数只能出现一次。
引用时
位置传参必须写在关键字参数前面,他们俩不能交替使用。关键字传参什么时候出现合适?出现在可变参数之后,相当于终止条件。
1
2
3
4
5
6
|
def func1(a, b = 5 , * args, c = 7 , * * kwargs):
print (a, b, args, c, kwargs, sep = '\n' )
if __name__ = = '__main__' :
func1( 5 , 6 , 8 , 7 , 1 , 5 , 6 , 8 , c = 4 , r = 2 , s = 3 )
|
结果为
5
6
(8, 7, 1, 5, 6, 8)
4
{'r': 2, 's': 3}
|