定义
- 用于封装一个特定的功能,表示一个功能或者行为
- 函数是可以重复执行的语句块,可以重复调用
作用
提高代码的可重用性和可维护性(代码层次结构更清晰)
定义函数
-
语法:
def 函数名(形式参数): 函数体
-
说明:
def关键字:全称是define,意为”定义”
函数名:对函数体中语句的描述,规则与变量名相同
形式参数:方法定义者要求调用者提供的信息
函数体:完成该功能的语句 -
函数的第一行语句建议使用文档字符串描述函数的功能与参数
def fun(args): """ 函数实现功能描述 :param args: 参数含义 :return: 返回值描述 """ 函数体
调用函数
- 语法:函数名(实际参数)
- 说明:根据形参传递内容
返回值
- 定义:方法定义者告诉调用者的结果
- 语法:return 数据
- 说明:
return后没有语句,相当于返回 None
函数体没有return,相当于返回None
传入可变对象+修改可变对象 --> 无需return
可变/不可变类型在传参时的区别
- 不可变类型参数有:
数值型(整数,浮点数,复数) 布尔值bool None 空值 字符串str 元组tuple 固定集合frozenset
- 可变类型参数有:
列表 list 字典 dict 集合 set
- 传参说明:
不可变类型的数据传参时,函数内部不会改变原数据的值
可变类型的数据传参时,函数内部可以改变原数据
函数内存分配
# 1. 将函数代码存储到内存代码区
def fun01():
a = 10
# 2. 调用函数时,在内存中开辟一块空间(栈帧),存储在函数中定义的变量
fun01()
# 3. 调用结束,栈帧释放
函数参数
实参传递方式argument
- 位置实参:实参与形参的位置依次对应,函数名称(数据1,数据2)
- 序列实参:实参用*将序列拆解后与形参的位置依次对应,函数名称(*序列)[拆]
作用:当参数过多时,可以通过容器传递信息 - 关键字实参:实参根据形参的名字进行对应,函数名称(形参名1=数据1,形参名2=数据2)
作用:代码可读性相对较高,配合默认参数可以随意传参 - 字典关键字实参:实参用**将字典拆解后与形参的名字进行对应,函数名称(**字典)[拆]
作用:配合形参的缺省参数,可以使调用者随意传参def fun01(p1, p2, p3): 函数体 #位置传参 fun01(1, 2, 3) # 序列传参 list01 = [4, 5, 6] fun01(*list01) dict01 = {"a": 1, "b": 2, "c": 3} fun01(*dict01) # 键值 # 关键字传参 fun01(p2=2, p1=1, p3=3) # 字典关键字传参 dict01 = {"p2": 2, "p1": 1, "p3": 3} fun01(**dict01)
形参定义方式parameter
- 缺省参数(默认参数):实参可以不传递,函数名称(形参名1=默认值,形参名2=默认值)
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数
缺省参数可以有0个或多个,甚至全部都有缺省参数 - 位置形参:实参必须传递
- 星号元组形参:使用星号将实参合并为一个元组,函数名称(*args) [合]
作用: 位置实参数量无限
说明:一般命名为’args’,形参列表中最多只能有一个 - 命名关键字形参:星号元组形参后面的参数,要求实参必须是关键字实参
函数名称(*args,a,b)
函数名称(a,*,b = “”,c = “”)
作用:强制实参使用关键字传参 - 双星号字典形参,函数名称(**kwargs) [合]
作用:关键字实参数量无限
说明:一般命名为’kwargs’, 形参列表中最多只能有一个# 默认参数 def fun01(p1="", p2=0, p3=0.0): 函数体 fun01() fun01("张三", 10, 5.6) # 关键字实参 + 默认参数:实参可以随意传递 fun01(p2=100) # 位置形参 def fun02(p1, p2, p3): 函数体 # 星号元组形参 def fun03(*args): 函数体 fun03() fun03(4, 54, 5, 65, 6) # 命名关键字形参 def fun04(*args, a, b=0): 函数体 fun04(34, 45, 54, 56, 67, 87, a=1, b=2) fun04(34, 45, 54, 56, 67, 87, a=1) # 命名关键字形参:星号后面的参数 # 要求实参必须是关键字实参. def fun05(a, *, b=0, c=""): 函数体 fun05(5, b=6, c=7) fun05(5, c=7) # 双星号字典形参: def fun05(**kwargs): 函数体 fun05(a=1, b=2, c=3)
参数自左至右的顺序
位置形参 --> 星号元组形参 --> 命名关键字形参 --> 双星号字典形参