首页 > 代码库 > Python基础【day04】:函数介绍、参数调用
Python基础【day04】:函数介绍、参数调用
本节内容
函数介绍
函数参数及调用
函数的非固定参数
函数介绍
一、介绍
在我们以往的学习编程的过程当中,碰到的最多的两张编程方式或者说编程方法:面向过程和面向对象。其实不管是哪一种,其实都是编程的方法论而已。但是现在有一种更古老的编程方式:函数式编程,以它的不保存的状态,不修改变量等特性,重新进入我们的视野。
面向对象 --->类 ---->class
面向过程 --->过程--->def
函数式编程-->函数--->def
二、函数定义
我们上初中那会也学过函数,即:y=2x,说白了,这里面总共就两个变量x和y,x是自变量,y是因变量(因为x变而变),y是x的函数。自变量的取值范围,叫做这个函数的定义域。
说了这么多,我们还是来讲讲,编程中的函数定义吧!!!
1、函数定义:
2、过程定义:
3、两者比较:
小结:不难看出,函数和过程其实在python中没有过多的界限,当有return时,则输出返回值,当没有return,则返回None
三、使用函数原因
至此、我们已经了解了函数,但是我们为啥要用函数啊,我觉的我们以前的那种写法挺好的呀!其实不然,我给使用函数总结 了两点好处:
代码重复利用
可扩展性
保持一致性
1、代码重复利用
我们平时写代码的时候,最讨厌的就是写重复代码,这个无疑是增加我们的工作量,所以代码重用性是非常有必要的。下面我们就举个简单的例子吧,使用函数和不使用函数的区别。
①优化前
那么假设有n个函数,我们是不是也要拷贝n次呐?于是,我们就诞生了下面的方法
②优化后
2、可扩展,代码保持一致性
注:如果遇到代码逻辑变了,用以前拷贝n次的方法,那什么时候拷贝完啊,而且中间有遗漏怎么办,如果用了函数,我们只需要改这个函数的逻辑即可,不用改其他任何地方。
函数参数及调用
一、返回值
之前在day3-函数介绍中提到了return关键字,但是那个只是提到,并没有详细的介绍的return关键字的用法,下面我们就来详细的阐述一下。
1、return作用
return其实有两个作用:
需要用一个变量来接受程序结束后返回的结果
它是作为一个结束符,终止程序运行
注:从上面的代码可以看出,return 0后面的代码就不执行了,只执行return前面的代码;变量x接受了test()函数结束后的返回结果
2、返回多个值
上面我们试了返回一个常量值,或者说一个对象值,下面我们来试试,不返回值,或者说返回多个值得情况
从上面的例子可以看出:
没有定义,返回值数=0,返回:None
只定义了1个返回值,返回值=1 ,返回:定义的那个值,或者说定义的那个object
定义了2个以上,返回值 > 1,返回:1个元组(tuple)
提问:这边我们不经意的要问,为什么要有返回值?
因为我们想要想要这个函数的执行结果,这个执行结果会在后面的程序运行过程中需要用到。
二、有参数函数调用
在此之前,我们演示的函数都是没有带参数的,下面我们就来说说带参数的函数。在讲之前,我们先来说一下,什么是形参,什么是实参吧!
形参:指的是形式参数,是虚拟的,不占用内存空间,形参单元只有被调用的时才分配内存单元
实参:指的是实际参数,是一个变量,占用内存空间,数据传递单向,实参传给形参,形参不能传给实参
代码如下:
1、位置参数
从上面的例子可以看出,实际参数和形式参数是一一对应的,如果调换位置,x和y被调用的时,位置也会互换,代码如下:
那有些同学会说,那我多一个或者少一个参数,总归没事了吧!那我看看行不行呢?
①多一个参数
②少一个参数
2、关键字参数
到这边有些小伙伴不经意的要说,像这种位置参数,有点死,我不想这么干,万一我传错了咋办,对吧!OK,没有问题,下面我们就来讲讲关键字传参。
关键字传参不需要一一对应,只需要你指定你的哪个形参调用哪一个实参即可,代码如下:
但是,这是又有小伙伴要问了,那我可不可以位置参数和关键字参数结合起来用呐?接下来,我们就来探讨一下。
①位置参数在前,关键字参数在后
我擦这样是可以的,那我试试这种情况,我把后面关键字不传给y,我传给x,代码如下:
报错的意思是:给形参x传的值过多。这种报错的原因是:实参1已经传给了形参x,后面的x=2又传了一次,所以报错。
②关键字在前,位置参数在后
我去,看来这样不行。那我位置参数放前面,中间放关键字参数总行了吧!代码如下:
还是一样的错误,我去,那我只能把关键字参数放最后试试!
那我最后两个用关键字参数呐?
总结:
既有关键字,又有位置参数时,是按位置参数的顺序来
关键字参数是不能写在位置参数的前面的
函数的非固定参数
一、概述
在上一篇博客中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组
二、默认参数
默认参数指的是,我们在传参之前,先给参数制定一个默认的值。当我们调用函数时,默认参数是非必须传递的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def test(x,y = 2 ): print (x) print (y) print ( "-----data1----" ) test( 1 ) #没有给默认参数传值 print ( "-----data2----" ) test( 1 , 3 ) #给默认参数传位置参数 print ( "-----data3----" ) test( 1 ,y = 3 ) #给默认参数传关键字参数 #输出 - - - - - data1 - - - - 1 2 - - - - - data2 - - - - 1 3 - - - - - data3 - - - - 1 3 |
默认参数用途:
- 安装默认软件(def test(x,soft=True))
- 传递一下默认的值(定义mysql的默认端口号:def count(host,port=3306))
三、参数组
之前我们传参数,都是传一个固定参数,不能多也不能少,但是如果说我们需要非固定参数怎么办呢?好吧,于是就衍生出了,以下两种传参方式:
- 非固定位置参数传参(*args)
- 非固定关键字传参(**kwargs)
下面我们就来说说这两种方式传参:
1、非固定位置参数传参
①功能:接收N个位置参数,转换成元组的形式。
②定义,代码如下:
1
2
3
4
5
6
7
|
def test( * args): #形参必须以*开头,args参数名随便定义,但是最好按规范来,定义成args print (args) test( 1 , 2 , 3 , 4 , 5 ) #输入多个位置参数 #输出 ( 1 , 2 , 3 , 4 , 5 ) #多个参数转换成元组 |
这边不禁的有个疑问,你这是传入的都是N个位置参数,那我要传入一整个列表咋办,我要完全的获取这个列表的值。
③传入列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def test( * args): print (args) print ( "-------data1-----" ) test() #如果什么都不传入的话,则输出空元组 print ( "-------data2-----" ) test( * [ 1 , 2 , 3 , 4 , 5 ]) #如果在传入的列表的前面加*,输出的args = tuple([1,2,3,4,5]) print ( "-------data3-----" ) test([ 1 , 2 , 3 , 4 , 5 ]) #如果再传入的列表前不加*,则列表被当做单个位置参数,所以输出的结果是元组中的一个元素 #输出 - - - - - - - data1 - - - - - () - - - - - - - data2 - - - - - ( 1 , 2 , 3 , 4 , 5 ) - - - - - - - data3 - - - - - ([ 1 , 2 , 3 , 4 , 5 ],) |
④位置参数和非固定位置参数
1
2
3
4
5
6
7
8
9
|
def test(x, * args): print (x) #位置参数 print (args) #非固定参数 test( 1 , 2 , 3 , 4 , 5 , 6 ) #输出 1 ( 2 , 3 , 4 , 5 , 6 ) |
从上面看出,第1个参数,被当做位置参数,剩下的被当做非固定位置参数。
⑤关键字和非固定位置参数
1
2
3
4
5
6
7
8
9
10
11
|
def test(x, * args): print (x) print (args) test(x = 1 , 2 , 3 , 4 , 5 , 6 ) #输出 File "D:/PycharmProjects/pyhomework/day3/非固定参数/非关键字参数.py" , line 21 test(x = 1 , 2 , 3 , 4 , 5 , 6 ) ^ SyntaxError: positional argument follows keyword argument #位置参数在关键字参数后面 |
很显然报错了,因为x=1是关键字参数,*args是位置参数,而关键字参数不能再位置参数前面的,所以报错。
2、非固定关键字传参
①功能:把N个关键字参数,转换成字典形式
②定义,代码如下:
③传入字典
然而,有些小伙伴说,我就不信,难道不加**,就会报错,那为啥非固定位置参数不加*,为啥就不报错呐?下面我们就用事实说话,代码如下:
因为传入的字典被当做位置参数,所以被报类型错误,所以小伙伴们千万要记住:传字典,加**
④配合位置参数使用
⑤位置参数、关键字和非固定关键字参数
提示:参数组一定要往最后放
注:就是说,如果遇到一个关键字传参和非固定关键字传参,前后放的位置是不影响传参的,但是我们一般还是按顺序来。
⑥位置参数、关键字参数、非固定位置参数和非固定关键字参数
那么问题来了,上面的age传参传的是位置参数,那我能不能传关键字参数呐?现在我们就来看看,代码如下:
看来是不可以的,为什么?因为age=19是关键字参数,而后面的*args是非固定位置参数,说白了不管*args传入几个字,它的本质都是位置参数,上面我们提到关键字参数是不能再位置参数的前面,所以报错了。
看来上面的情况是不可以的,那能不能非固定关键字参数在非固定位置参数前面呢?来,我们带着疑问一起来试一下。代码如下:
我擦咧,也是不可以的,经我仔细研究发现,非固定关键字参数,本质也是关键字参数,是不能放在非固定位置参数的前面的。
四、总结
- 参数分为位置参数、关键字参数、默认参数、非固定位置参数和非固定关键字参数
- 位置参数之前传参,位置是不能调换的,多一个或者少一个参数都是不可以的。
- 关键字参数是不能放在位置参数前面的。
- 函数传参的位置一次是,位置参数,默认参数、非固定位置参数、非固定关键字参数(def test(name,age=18,*args,**kwargs))
- 关键字传参,可以不用考虑位置的前后问题
Python基础【day04】:函数介绍、参数调用