函数 function
定义
用于封装一个特定的功能,表示一个功能或者行为。函数是可以重复执行的语句块, 可以重复调用。
作用
提高代码的可重用性和可维护性(代码层次结构更清晰)。
定义函数
语法:
def 函数名(形式参数):
函数体
说明:
- def 关键字:全称是define,意为”定义”。
- 函数名:对函数体中语句的描述,规则与变量名相同。
- 形式参数:方法定义者要求调用者提供的信息。
- 函数体:完成该功能的语句。
函数的第一行语句可以选择性地使用文档字符串存放函数与参数的说明。
调用函数
语法:函数名(实际参数)
说明:根据形参传递内容。
返回值
定义:方法定义者告诉调用者的结果。
语法:return [表达式]
说明:
- 表达式就是需要返回的结果。
- 不带表达式的return相当于返回 None。
- 不带return语句,函数执行完后返回None(相当于在最后加了一条return None语句)
可变/不可变类型在传参时的区别
不可变类型参数有:
- 数值型(整数,浮点数,复数)
- 布尔值bool
- None 空值
- 字符串str
- 元组tuple
- 固定集合frozenset
不可变类型传参的内存操作:
调用方法,在内存中开辟空间(栈帧),栈帧中定义该方法内部创建的变量,方法执行完毕后,栈帧立即释放.
可变类型参数有:
- 列表 list
- 字典 dict
- 集合 set
- 字节数组 bytearray
传参说明:
- 不可变类型的数据传参时,函数内部不会改变原数据的值。
- 可变类型的数据传参时,函数内部可以改变原数据。
不可变类型传参内存图
可变类型传参内存图
传参练习内存图
函数参数
定义一个函数
def fun01(a, b, c):
print(a)
print(b)
print(c)
实参传递方式argument
位置传参
定义:实参与形参的位置依次对应。fun01(1, 2, 3)
序列传参
定义:实参用*将序列拆解后与形参的位置依次对应。fun01(*[4, 5, 6])
关键字传参
定义:实参根据形参的名字进行对应。fun01(b=2, a=1, c=3)
字典关键字传参
- 定义:实参用
**
将字典拆解后与形参的名字进行对应。fun01(**{"b":20,"c":"cc","a":1.5})
- 作用:配合形参的缺省参数,可以使调用者随意传参。
形参定义方式parameter
缺省参数
- 语法:
def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ...):
函数体
- 说明:
– 缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。
– 缺省参数可以有0个或多个,甚至全部都有缺省参数。
位置形参
- 语法:
def 函数名(形参名1, 形参名2, ...):
函数体
def fun01(a, b, c):
pass
星号元组形参
1. 语法:
def 函数名(*元组形参名):
函数体
def fun02(*args):
# 对于方法内部而言,就是元组
# 对于调用者而言,可以传递数量无限的位置实参.
print(args)
- 作用:收集多余的位置传参。
- 说明:
– 一般命名为args
– 形参列表中最多只能有一个
命名关键字形参
- 语法:
def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):
函数体
def fun03(*, a, b):
print(a)
print(b)
def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ...):
函数体
def fun04(*args, b):
print(args)
print(b)
- 作用:强制实参使用关键字传参
双星号字典形参
- 语法:
def 函数名(**字典形参名): 函数体 def fun05(**kwargs): # 对于方法内部而言,就是字典, # 对于调用者而言,可以传递数量无限的关键字实参. print(kwargs)
- 作用:收集多余的关键字传参
- 说明:
- 一般命名为
kwargs
- 形参列表中最多只能有一个