关注【郑大钱呀
】【公】【众】【号】,我们一起交流,一起学习。
什么是函数?
函数就是组织好的、可重复使用的,并实现相关功能的代码段,使用函数能够提高代码的重复使用率、也减少了代码量,提高了代码的可维护性。比如Python中的print()
就是一个函数,只不过print()
函数是Python自带的,我们称之为内置函数
,Python的内置函数很多时候并不能满足我们的功能需求,所以我们需要创建我们自己的函数,我们称之为自定义函数
,下面就开始我们今天的学习。
自定义函数的语法
在Python中我们需要使用关键字def
来定义函数,函数的语法如下:
语法解释:
def
:关键字def开头,表示定义的是一个函数
func_name
:函数名称,由用户自定义,函数的名称需要遵循变量的命名规则,此外函数的名称是严格区分大小写的
,也就是说my()和My()是两个不同的函数
parameters
:传递给函数的参数,可以有多个,如果不需要则可以不填,值得注意的是,parameters中的变量为局部变量只能在其被声明的函数内部访问
,和全局变量不同,全局变量可以在整个程序范围内访问。
comment
:函数的注释,可以用来描述函数的功能、参数、返回值等信息,如果不需要也可以不写
statements
:函数中执行的操作
return[value]
:函数的返回值,若无返回值可以不写
函数的用法
[1]定义一个最简单的函数,输出一句话,示例代码如下:
代码解释:我们定义了一个名为myfunc
的函数,用来输出一句话,当函数定义完成后,我们需要使用函数名()
的方式来调用我们定义的函数。但是现在的myfunc()
函数,只能输出"基础的自定义函数"这一句话,不具有通用性,现在我们有一个需求,我们想让myfunc()函数输出任意一句话,此时我们就需要向函数中传递参数了。
[2]定义一个有参数的函数,示例代码如下:
代码解释:我们在函数中添加了参数,并输出我们的参数,所以此时myfunc()函数输出的内容完全由我们传入的参数决定,我们将函数中的"word"即括号内的变量,称之为形式参数
,在我们调用函数的时候,我们传入的值称之为实际参数
。如果你定义了一个需要传参的函数,但是你调用它的时候却没有传入参数或者没有传入所有必传的参数,那么就会报错,报错示例如下:
在上面我们定义了一个参数的函数,下面我们定义一个有多个参数的函数。
[3]定义一个有多个参数的函数,示例代码如下:
此时运行结果都正常,但是如果传入的参数是这样的func_args('Gibran',23)
,运行结果如下:
我们发现报错了,这是因为上面调用函数传入参数的时候,是以位置参数的形式传入的,也就是第一个实际参数(“Girban”)对应第一个形式参数(“age”),第二个实际参数(“23”)对应第二个形式参数(“name”),当我们把"Gibran"传给函数中的age后,由于字符串是不能强制转换成整型,所以就报错了,那么Python中有没有一种方法可以在调用函数的时候不关注参数的位置呢?当然有,我们可以通过关键字参数的方式向函数中传递值。
[4]以关键字参数形式向函数中传值,示例代码如下:
代码解释:从上面的代码我们虽然我们没有按照函数参数的位置传递参数,但是函数依然能正常运行,这就是因为我们对参数指定了关键字,明确了值传递给函数中的那个参数,所以不会报错。值得注意的是关键字参数必须放在位置参数的后面
,这是由于python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数.如果关键字参数在位置参数的前面,那么就会报错
,报错示例如下:
上面我们定义的需要传递的函数中,在调用的时候,都需要传递所有的参数,如果未传递参数或传递部分参数,函数就会报错,那我们能不能定义一种参数,当我传递值的时候,它就传入我给的值,如果不传递值的时候,使用默认设置的值?当然可以,我们称之为默认值参数。
[5]在函数定义时为参数设置默认值,示例代码如下:
代码解释:从上面的结果我们发现,我们并没有传入sex的值,但是函数没有报错,sex为我们定义函数时默认设置的值,下面我们给sex也传递一个值,运行结果如下:
我们上面定义的函数,参数的个数都是确定的,但是有的时候,用户提供参数的数量是不固定的,比如我们想定义一个函数用来输出学生的名字,但是我们不知道学生的数量,此时我们可以使用收集参数也叫不定长参数.
[6]使用不定长参数定义函数示例代码如下:
代码解释:我们定义函数参数的时候在参数前面加一个*
号,那么此时就表示传递的是一个不定义的参数,并且会把传入的参数放到一个元组中,值得注意的是,语法上不定长参数的位置可以是任意的,但是有些时候我们可能需要根据实际情况做一些其他处理
,示例代码如下:
从上面的报错我们发现,由于不定长参数("*name")位于"sex"之前,将age后的参数全部收集了,导致没有值传递给sex参数,此时我们可以使用关键字传递的方式,将最后一个值传递给"sex",示例代码如下:
从上面的代码我们发现第一个值传给了位置参数(age),最后一个通过关键字方式传递给sex
,其他的值都传给了可变长度的参数列表。在Python中还有一种参数传递形式即按照关键字传值把多余的传值,以字典的方式的保存,示例代码如下:
从上面的学习中,我们知道了,Pyhon 函数的参数有如下几种:位置参数、默认参数、*args、**kwargs,他们可以混合使用,下面我们说下常用的几种组合。
**[7]*args、kwargs参数混合使用,示例代码如下:
值得注意的是:这两个参数混合使用的顺序必须是*args、**kwargs,否则就会报错
[8]位置参数、*args、**kwargs参数混合使用,示例代码如下:
值得注意的是:这三个参数混合使用的顺序必须是位置参数、*args、\**kwargs
,否则就会报错
[9]位置参数、默认参数、**kwargs参数混合使用,示例代码如下:
值得注意的是:这三个参数混合使用的顺序必须是位置参数、默认参数、\**kwargs
,否则就会报错。
从上面的学习我们知道,我们可以使用*args、*kwargs参数将值收集到元组或字典中,我们也可以使用和**执行相反的操作,即以*变量或**变量的形式,向函数传递值,我们也称之为解包
.
[10]*变量或**变量的形式,向函数传递值,示例代码如下:
值得注意的是在使用*或\**向函数传递值的时候,只能传递元组或字典
函数的返回值
上面我们定义的函数都没有返回值,所谓返回值就是函数执行完成后返回的一个结果,比如加法运算后要返回和,减法运算后要返回差,在Python中,你如果定义了返回值那么就会返回你定义的值,如果没有定义返回值,那么函数则返回None
,也就是说Python的所有函数都是返回值的
。
[1]定义一个有返回值的函数,示例代码如下:
[2]不定义返回值,查看返回值是否为None,示例代码如下:
匿名函数(lambda关键字)
所谓匿名函数就是没有名字的函数,有输入也可以返回结果,但是由于lambda表达式比较单一,所以lambda函数不太可能完成复杂的逻辑,只能完成简单的功能。lambda的语法如下:
语法解释:
lambda
:表示定义了一个lambda表示式
argument_list
:入参,参数的作用域仅在lambda中,不能访问作用域外的变量
expression
:表达式
示例代码如下:
函数的不可变对象和可变对象
在Python中我们知道,字符串、元组等数据类型是不可变的,像列表、字典等数据类型是可变的,在Python的函数中,如果传入的参数是不可变的数据类型,在函数修改参数,函数的外部参数是不会改变的,示例代码如下:
如果传入的参数是可变的数据类型,在函数内部修改参数的时候,函数的外部参数是会改变的,示例代码如下:
结尾
本期的内容就到这里了,如有不足之处还请大家多多指正,欢迎大家留言、关注、转发、收藏我们下期见。