day3-函数参数及调用
一、返回值
之前在day3-函数介绍中提到了return关键字,但是那个只是提到,并没有详细的介绍的return关键字的用法,下面我们就来详细的阐述一下。
1、return作用
return其实有两个作用:
- 需要用一个变量来接受程序结束后返回的结果
- 它是作为一个结束符,终止程序运行
def test(): print("in the test_1") return 0 print("the end") #结果中没有打印 x = test() print(x) #输出 in the test_1 #第一次打印 0 #结果返回值
注:从上面的代码可以看出,return 0后面的代码就不执行了,只执行return前面的代码;变量x接受了test()函数结束后的返回结果
2、返回多个值
上面我们试了返回一个常量值,或者说一个对象值,下面我们来试试,不返回值,或者说返回多个值得情况
# __auther__ == zhangqigao def test_1(): print("in the test_1") def test_2(): print("in the test_2") return 0 def test_3(): print("in the test_3") return 1,"hello",["qigao","shuaigao"],{"name":"qigao"} x = test_1() y = test_2() z =test_3() print(x) print(y) print(z) #输出 in the test_1 in the test_2 in the test_3 None #x的值 0 #y的值 (1, 'hello', ['qigao', 'shuaigao'], {'name': 'qigao'}) #z的值
从上面的例子可以看出:
- 没有定义,返回值数=0,返回:None
- 只定义了1个返回值,返回值=1 ,返回:定义的那个值,或者说定义的那个object
- 定义了2个以上,返回值 > 1,返回:1个元组(tuple)
提问:这边我们不经意的要问,为什么要有返回值?
因为我们想要想要这个函数的执行结果,这个执行结果会在后面的程序运行过程中需要用到。
二、有参数函数调用
在此之前,我们演示的函数都是没有带参数的,下面我们就来说说带参数的函数。在讲之前,我们先来说一下,什么是形参,什么是实参吧!
- 形参:指的是形式参数,是虚拟的,不占用内存空间,形参单元只有被调用的时才分配内存单元
- 实参:指的是实际参数,是一个变量,占用内存空间,数据传递单向,实参传给形参,形参不能传给实参
代码如下:
def test(x,y): #x,y是形参 print(x) print(y) test(1,2) #1和2是实参 #输出 1 2
1、位置参数
从上面的例子可以看出,实际参数和形式参数是一一对应的,如果调换位置,x和y被调用的时,位置也会互换,代码如下:
def test(x,y): print(x) print(y) print("--------互换前-----") test(1,2) print("--------互换后-----") test(2,1) #输出 --------互换前----- 1 2 --------互换后----- 2 1
那有些同学会说,那我多一个或者少一个参数,总归没事了吧!那我看看行不行呢?
①多一个参数
def test(x,y): print(x) print(y) print("--------多一个参数----") 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()函数需要传两个实参,你传了三个实参
②少一个参数
def test(x,y): print(x) print(y) print("--------少一个参数----") 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、关键字参数
到这边有些小伙伴不经意的要说,像这种位置参数,有点死,我不想这么干,万一我传错了咋办,对吧!OK,没有问题,下面我们就来讲讲关键字传参。
关键字传参不需要一一对应,只需要你指定你的哪个形参调用哪一个实参即可,代码如下:
def test(x,y): print(x) print(y) print("--------互换前------") test(x=1,y=2) print("--------互换后------") test(y=2,x=1) #输出 --------互换前------ 1 2 --------互换后------ 1 2
但是,这是又有小伙伴要问了,那我可不可以位置参数和关键字参数结合起来用呐?接下来,我们就来探讨一下。
①位置参数在前,关键字参数在后
def test(x,y): print(x) print(y) test(1,y=2) #输出 1 2
我擦这样是可以的,那我试试这种情况,我把后面关键字不传给y,我传给x,代码如下:
def test(x,y): print(x) print(y) 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又传了一次,所以报错。
②关键字在前,位置参数在后
def test(x,y): print(x) print(y) test(y=2,1) #输出 File "D:/PycharmProjects/pyhomework/day3/函数_带参数.py", line 8 test(y=2,1) ^ SyntaxError: positional argument follows keyword argument # 关键字参数在位置参数的前面
我去,看来这样不行。那我位置参数放前面,中间放关键字参数总行了吧!代码如下:
def test(x,y,z): print(x) print(y) test(1,y=2,3) #输出 File "D:/PycharmProjects/pyhomework/day3/函数_带参数.py", line 8 test(1,y=2,3) ^ SyntaxError: positional argument follows keyword argument
还是一样的错误,我去,那我只能把关键字参数放最后试试!
def test(x,y,z): print(x) print(y) print(z) test(1,2,z=3) #输出 1 2 3
那我最后两个用关键字参数呐?
def test(x,y,z): print(x) print(y) print(z) test(1,z=2,y=3) #输出 1 3 2
这样也是可以的,所以,得出一个结论:关键字参数是不能写在位置参数前面的。
总结:
- 既有关键字,又有位置参数时,是按位置参数的顺序来
- 关键字参数是不能写在位置参数的前面的