在此之前,我们演示的函数都是没有带参数的,下面我们就来说说带参数的函数。
- 形参:指的是形式参数,是虚拟的,不占用内存空间,形参单元只有被调用的时才分配内存单元
- 实参:指的是实际参数,是一个变量,占用内存空间,数据传递单向,实参传给形参,形参不能传给实参
1 def test(x,y): #x,y是形参 2 print(x) 3 print(y) 4 5 test(1,2) #1和2是实参
#输出
1
2
1、位置参数
从上面的例子可以看出,实际参数和形式参数是一一对应的,如果调换位置,x和y被调用的时,位置也会互换,代码如下:
1 def test(x,y): 2 print(x) 3 print(y) 4 print("--------互换前-----") 5 test(1,2) 6 print("--------互换后-----") 7 test(2,1)
#输出
--------互换前-----
1
2
--------互换后-----
2
1
1)多一个参数
1 def test(x,y): 2 print(x) 3 print(y) 4 print("--------多一个参数----") 5 test(1,2,3)
#输出
--------多一个参数----
Traceback (most recent call last):
File "D:/PycharmProjects/pyhomework/day3/函数_带参数.py", line 8, in <module>
test(1,2,3)
TypeError: test() takes 2 positional arguments but 3 were given #test()函数需要传两个实参,你传了三个实参
2) 少一个参数
1 def test(x,y): 2 print(x) 3 print(y) 4 print("--------少一个参数----") 5 test(1)
#输出
--------少一个参数----
Traceback (most recent call last):
File "D:/PycharmProjects/pyhomework/day3/函数_带参数.py", line 8, in <module>
test(1)
TypeError: test() missing 1 required positional argument: 'y' #没有给y参数传实参
事实证明:多传一个参数或者少传一个参数都是不行的。
2、关键字参数
关键字传参不需要一一对应,只需要你指定你的哪个形参调用哪一个实参即可,代码如下:
1 def test(x,y): 2 print(x) 3 print(y) 4 5 print("--------互换前------") 6 test(x=1,y=2) 7 print("--------互换后------") 8 test(y=2,x=1)
#输出
--------互换前------
1
2
--------互换后------
1
2
1) 位置参数在前,关键字参数在后
1 def test(x,y): 2 print(x) 3 print(y) 4 5 test(1,x=2)
#输出
Traceback (most recent call last):
File "D:/PycharmProjects/pyhomework/day3/函数_带参数.py", line 8, in <module>
test(1,x=2)
TypeError: test() got multiple values for argument 'x' #给x形参传的值过多
报错的意思是:给形参x传的值过多。这种报错的原因是:实参1已经传给了形参x,后面的x=2又传了一次,所以报错
2) 关键字在前,位置参数在后
1 def test(x,y): 2 print(x) 3 print(y) 4 5 test(y=2,1)
#输出
File "D:/PycharmProjects/pyhomework/day3/函数_带参数.py", line 8
test(y=2,1)
^
SyntaxError: positional argument follows keyword argument # 报错:关键字参数在位置参数的前面
3) 位置参数放前面,中间放关键字参数
1 def test(x,y,z): 2 print(x) 3 print(y) 4 5 test(1,y=2,3)
#输出
File "D:/PycharmProjects/pyhomework/day3/函数_带参数.py", line 8
test(1,y=2,3)
^
SyntaxError: positional argument follows keyword argument
4) 关键字参数放最后
1 def test(x,y,z): 2 print(x) 3 print(y) 4 print(z) 5 6 test(1,2,z=3)
#输出
1
2
3
4) 最后两个用关键字参数
1 def test(x,y,z): 2 print(x) 3 print(y) 4 print(z) 5 6 test(1,z=2,y=3)
#输出
1
3
2
得出一个结论:关键字参数是不能写在位置参数前面的。
总结:
1、既有关键字,又有位置参数时,是按位置参数的顺序来
2、关键字参数是不能写在位置参数的前面的