上一篇我们学习了定义函数时的形参,及调用函数时的实参,以及实参与形参之间传值的原理。
这一篇开始我们学习函数的几种参数类型。
函数的定义非常简单,但我们的参数类型有以下几种。
- 位置参数(必备参数)
- 关键字参数
- 默认参数
- 不定长参数
这一篇我们将来具体讲解位置参数(必备参数)
一、位置参数(必备参数)
在调用时,实参的个数必须和形参个数一样,并具位置需要对应。我们可以理解为所传的参数必须有的,不能多也不能,否则出错。 比如形参(a,b,c,d)那么我们传入实参(1,2,3,4),那么1将传入形参a,2将传入形参b,3将传入形参c,在将传入形参4.
def sum_num(a,b,c,d): #定义函数,需要传入四个参数
print('实参传给a的值:',a) #调用函数时,第一个实参传给a
print('实参传给b的值:',b)
print('实参传给c的值:',c)
print('实参传给d的值:',d)
num = a + b + c + d
return num
sum1 = sum_num(2, 3, 4, 5) #调用函数,并将返回的值赋给num1
print(sum1)
运行结果:
实参传给a的值: 2
实参传给b的值: 3
实参传给c的值: 4
实参传给d的值: 5
14
我们上面说这种参数是叫位置参数,即形参和实参个数一样,位置相对应传值。那么我们改变实参个数看一下,会出现什么情况:
我们将定义的函数sum_num不变,只改变调用函数时实参的个数
def sum_num(a,b,c,d): #定义函数,需要传入四个参数
print('实参传给a的值:',a) #调用函数时,第一个实参传给a
print('实参传给b的值:',b)
print('实参传给c的值:',c)
print('实参传给d的值:',d)
num = a + b + c + d
return num
sum_num(2, 3, 4) #实参为3个,形参个数为4个
运行报错:
Traceback (most recent call last):
File "g:/老树Python/python38_3VScode/democode/T21.py", line 9, in <module>
sum_num(2, 3, 4) # 实参为3个,形参个数为4个
TypeError: sum_num() missing 1 required positional argument: 'd'
上述错误提示,少了一个必须的位置参数‘d’
我们继续减少一个实参看一下。
sum_num(2, 3) #实参为2个,形参个数为4个
运行报错:
Traceback (most recent call last):
File "g:/老树Python/python38_3VScode/democode/T21.py", line 9, in <module>
sum_num(2, 3) # 实参为3个,形参个数为4个
TypeError: sum_num() missing 2 required positional arguments: 'c' and 'd'
由上两个运行报错的例子,我们的实参和形参,是从左到右对应的。
那么我们实参个数多余形参个数将会出现什么情况呢
def sum_num(a,b,c,d): #定义函数,需要传入四个参数
print('实参传给a的值:',a)
print('实参传给b的值:',b)
print('实参传给c的值:',c)
print('实参传给d的值:',d)
num = a + b + c + d
return num
sum_num(2,3,5,6,7) # 实参为5个,形参个数为4个
运行报错:
Traceback (most recent call last):
File "g:/老树Python/python38_3VScode/democode/T21.py", line 9, in <module>
sum_num(2,3,5,6,7) # 实参为5个,形参个数为4个
TypeError: sum_num() takes 4 positional arguments but 5 were given
上述错误类形,是函数需要4个位置参数,但我们给了5个。
二、关键字参数
在调用函数时,我们通过"键-值"的形式加上指定,即在调用函数时,把形参作为键,实参作为值,可以使函数传参更加清晰、容易理解,也清除了位置参数的位置要求。
def say_hello(name,age): #两个形参name和age
print('hello',name,'你',age,'岁了') #print实参传入的name和age
按位置参数调用:
say_hello('LiMing',18)
运行结果:
hello LiMing 你 18 岁了
关键字参数正确调用:
say_hello(name='LiMing',age = 18)
say_hello(age=18,name='LiMing')
say_hello('LiMing',age=18)
运行的结果都是:
hello LiMing 你 18 岁了
下面我们看下关键字参数错误的方法:
def say_hello(name,age):
print('hello',name,'你',age,'岁了')
say_hello(name='LiMing',18)
运行结果:
say_hello(name='LiMing',18)
^
SyntaxError: positional argument follows keyword argument
def say_hello(name,age):
print('hello',name,'你',age,'岁了')
say_hello(18,name='LiMing')
运行结果:
Traceback (most recent call last):
File "g:/老树Python/python38_3VScode/democode/T21.py", line 8, in <module>
say_hello(18,name='LiMing')
TypeError: say_hello() got multiple values for argument 'name'
通过上面的代码,我们可以发现:
- 调用函数时,全部都关键字参数时,参数顺序可以打乱。
- 位置参数和关键字参数同时使用时,位置参数必须在关键字参数前面。否则会报错。
- 在前面的位置参数将会实参与形参,从左到右,一 一对应。
结束语:
这篇内容主要讲了当我们定义函数后,调用函数时传入参数的两种方法,位置参数和关键字参数,及他们的混合调用。下一篇我们将继续讲默认参数和可变参数。