目录
一、函数的定义与调用
1.1. 函数的定义:
1.2. 函数的调用
1.3.函数的嵌套定义
二、函数参数的传递
2.1 位置参数的传递
2.2 关键字参数的传递:
2.3 默认参数的传递
2.4 参数的打包与解包
2.5 混合传递
函数是一段具有特定功能的、可重复的语句组,用函数名来表示并通过函数名来进行功能调用。函数是一段具有名字的子程序,可以在需要的地方调用执行,不需要再每个执行的地方重复编写这些语句。每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理。
python中通常使用def关键字来定义函数,其语法格式如下:
def 函数名 ([参数列表]):
["""文档字符串"""]
函数体
[returm语句]
def关键字:函数开始的标志。
函数名:函数的位移标识,且遵循标识符的命名规则。
参数列表:负责接受传入函数中的数据,可以包括一个或多个参数,也可以为空。
冒号:函数体开始的标志。
文档字符串:由一对三引号包裹而成,用于说明函数功能的字符串,可以省略。
函数体:实现函数功能的具体代码
return语句:返回函数的处理结果给调用方,是函数的结束标志。若函数没有返回值return可以省略。
如下,我们定义一个加法的函数:
def add_modify(a,b):
result = a+b
print(result)
函数再定义完成后不会立即执行,直到被程序调用时才能执行。调用函数的语法各色如下:
函数名([参数列表])
我们调用上述代码如下:
def add_modify(a,b):
result = a+b
print(result)
add_modify(1,2)
可以得到以下结果:
综上,在程序执行”add_modify(1,2)“时经历了以下四个步骤
(1)程序在调用函数的位置停止运行
(2)将数据1、2传递给函数参数
(3)执行函数体中的语句
(4)程序回到暂停处并继续执行
函数在定义时可以在其内部嵌套定义另外一个函数,此时嵌套函数称之为外层函数,骨嵌套的函数称为内层函数。
示例代码:
def add_modify(a,b):
result = a+b
print(result)
def test(): #在函数中定义函数:test()
print("内层函数")
test() #在函数中调用函数:test()
add_modify(1,2)
注意:函数外部无法直接调用内层函数,只能在外层函数中调用内层函数从而执行2个函数的打印语句。
一般来说,将定义函数时设置的参数称为形式参数(形参),将调用时传入的参数称之为实际参数(实参)。函数的参数传递时指将实际参数传递给形式参数的过程。函数参数的传递可以分为位置参数的传递。关键字参数的传递、默认参数的传递、参数的打包与解包以及混合参数的传递。
函数在调用时将参照相应的位置以此传递给形参,即将第一个实参传递给第一个形参,将第二个实参传递给第二个形参。
例如获取两个数之间最大的函数get_max(),并调用get_max()函数。
def get_max(a,b):
if a>b:
print(a,"是最大值")
else:
print(a,"是最大值")
get_max(6,5)
运行结果:
以上函数执行后将第一个实参6传递给第一个形参a,第2个实参5传递给第二个实参b。
若函数参数数量较多,开发者很难记住参数作用,再按照位置传参是难以实现的。一般则会通过关键字传参即”形参=实参“的格式将实参与形参相关联,将实参按照相应的关键字传递给形参。
示例代码:
f connect(name,age):
print(f"名字是{name}:年龄{age}")
connect(name="lili",age=20)
运行结果:
函数在定义时可以指定形参的默认值,故在被调用时可以选择时否给带有默认值的形参传值。若没有给默认的形参传值,则直接使用该形参的默认值
def connect(ip,port=9600):
print(f"设备{ip}:{port}连接")
connect(ip="123.0.0.1")
connect(ip="123.0.0.1",port=4800)
运行结果:
第一次调用connect()函数时,”123.0.0.1“会传递给关联的形参给ip,而形惨port默认为9600,第二次调用connect()函数时”123.0.0.1“会传递给关联的形参ip。4800会传递给形参port。
1.打包:
如果函数在定义时无法确定需要接受多少个数据,那么可以在定义函数时为形参添加”*“或”**“,如果在形参的前面添加”*“,那么它可以接受以元组形式打包的多个值,如果形参前面加上”**“,那么它可以接受以字典形式打包的多个值。
虽然函数中添加”*“或”**“的形惨可以是符合命名规范的任意名称,但一般建议使用*aers和**kwargs、若函数没有接受到任何数据,参数*args和**kwargs为空。即他们为空元组或空字典。
2.解包
如果函数在调用时接受的实际参数时元组类型的数据,那么可以使用”*“将元组拆分成多个值,并将每个值按照位置参数传递的方式赋值给形参,如果函数在调用时接收的实参是字典类型诗句,那么可以使用”**“将字典拆分为多个键值对,并将每个值按照关键字参数传递的方式赋值给与键名对应的形参。
def test(a,b,c,d,e):
print(a,b,c,d,e)
nums=(67,89,78,87,65)
test(*nums)
参数传递方式遵循以下从高到低的优先级:按位置参数传递、按关键字参数传递、按默认参数传递、按打包传递。
在定义函数时,带有默认值的参数必须位于普查参数之后带有”*“标识的参数必须位于带有默认值的参数之后,带有”**“表示的参数必须位于带有”*“参数之后
示例代码:
def test(a,b,c=33,*arge,**kwargs):
print(a,b,c,arge,kwargs)
test(1,2)
test(1,2,3)
test(1,2,3,4)
test(1,2,3,4,e=5)
运行结果:
(1)第一次调用test()函数时,该函数接收到实参1和实参2,这2个实参被普通参数a和b接受,剩余3个形参c、*args、**kwargs没有接受到实参,均使用的时默认值。
(2)第二次调用test()函数时,该函数接受到实参1到实参3,前三个实参被普通参数ab以及待默认值的参数c接受,剩余两个*args、**kwargs没有接受到实参,使用默认值。
(3)第三次调用test()函数时,该函数接受到实参1到实参4,前四个实参被普通参数ab以及待默认值的参数c、*args接收。**kwargs没有接受到实参,使用默认值。
(4)第四次调用test()函数时,该函数接受到实参1到实参4和形参e关联的实参5均被形参接收。