1.函数
1.1 基本定义
定义: 将一组语句的集合通过函数进行封装, 简单来说是具有一定功能的代码容器,
想要执行这些语句, 只需要调用函数的名称即可.
特性:
* 1. 可重复使用, 减少代码冗余.
* 2. 组织结构清晰, 可读性增强.
* 3. 可扩展性提高, 便于维护.
1.2 使用规则
函数必须先定义后使用, 将一段代码封装成函数, 在需时直接调用函数名.
定义阶段: 申请内存空间将函数体放进去, 将内存地址绑定给函数名.
调用阶段: 通过函数名得到函数体的地址, 加上括号执行函数体代码.
定义阶段时只检测语法不执行代码, 调用阶段才会执行函数体, 逻辑错误才会被检查到.
1.3 语法定义
需要关键字def声明函数, 函数后面紧跟一个括号, 括号后面紧跟':'冒号.
括号内可以写上参数, 参数是对象的标识符, 参数可以用多个, 参数之间使用逗号隔开.
:冒号下一行跟函数的代码块, 也称为函数体.
缩进, 表示代码块开始, 写代码块... 缩进结束表示代码块结束.
def 函数名(参数1, ···):
"""
函数的说明文档, 可以通过doc函数获取函数的信息.
:param : 参数的说明
:return: 返回值的说明
"""
代码1...
代码2...
return 值
函数名(参数1, ...)
定义函数和类后面需要空两行, 否则会提示PEP8规范:
英: PEP8: E305 expected 2 blank lines after class or function definition, ...
中: PEP8: E305类或函数定义后应有2个空行
1.4 语法检测
def func():
qwe
![2022-12-09_01659](https://img-blog.csdnimg.cn/img_convert/4663a82c67b54df14e5b0cc802cb2b8d.png)
def func():
qwe
func()
![2022-12-09_01660](https://img-blog.csdnimg.cn/img_convert/8a38f91b231c5ec7c7e5b71a94694112.png)
1.5 演变过程
* 1. 需要重复执行某一段代码.
print(1)
print(2)
print(3)
print(1)
print(2)
print(3)
print(1)
print(2)
print(3)
* 2. 将需要重新执行的代码进行缩进, 在代码块上面使用def关键字声明一个函数来存储代码块.
def func():
print(1)
print(2)
print(3)
func()
func()
func()
使用pythontutor查看程序的执行过程.
* 1. 先检测函数体的语法
* 2. 调用函数, 进行参数传递, 这个没有设置参数.
* 3. 执行函数体,.
![GIF 2022-12-11 7-58-49](https://img-blog.csdnimg.cn/img_convert/785f32d3f5858881ec1c0aaab2910f5f.gif)
2. 函数体地址
2.1 函数名与变量名
变量名指向变量值的内存地址, 值是一个字面常量.
函数名指向函数体的内存地址, 函数体体一段代码.
打印变量名, 引用对象本身, 打印的就是值.
print(变量名)------> 被处理 -----> 显示内存地址存放的值, 不能在加().
print(函数名) ------> 没处理 ------> 显示函数体所在内存的地址, 加()执行立刻函数体.
函数可以加括号是语法定义的.
函数名 + ()---> 内存地址 +()----> 找到内存地址执行代码块.
def func():
print(1)
print(func)
print(type(func))
2.2 引用函数体地址
将函数的内存地址引用绑定给其它变量.
其它的变量加上括号可以执行函数体代码.
def func1():
print(1)
func2 = func1
print(func1)
print(func2)
func1()
func2()
![2022-12-09_01661](https://img-blog.csdnimg.cn/img_convert/bb907cceb9ad56344815b2623b6fa5f2.png)
3. 函数的类型
3.1 分类
函数的三种类型:
* 1.无参函数 函数在定义阶段括号内没有参数.
* 2.有参函数 函数在定义阶段括号内有参数, 提供参数后, 参数可以在函数体中使用.
* 3.空函数 函数在定义阶段括号内没有参数, 函数体为空(pass 或 ···).
函数的'参数'与'返回值'取决于是否需要对函数传入值与需要返回值.
'pass'或'···', 表示空语句, 本身没有含义, 使用它是为了符合编码的规则.
3.2 无参函数
def aa():
x = 10
y = 10
print(x + y)
aa()
3.3 有参函数
def bb(x, y):
print(x + y)
bb(10, 10)
![2022-12-09_01662](https://img-blog.csdnimg.cn/img_convert/fc2158a2add14d8d388c9a2d2015b36f.png)
3.4 空函数
def cc():
pass
cc()
def dd():
...
dd()
4. 函数返回值
4.1 返回值
返回值是函数执行结束时返回的结果, 需要使用关键字return,
格式:
return 值1, ...
返回值的情况:
* 1. 没有return语句, 默认为的放回值为None.
* 2. 只有return关键字, 后面没有跟参数等同return None.
* 3. 返回单个值: return 值1
* 4. 返回多个值: return 值1, 值2, ... (多个以元组类型放回)
* 返回的值可以赋值给一个变量.
一个函数中可以没有return也可以有多个return, 只要执行一次return语句,
立刻将return后的值返回, 并结束函数的运行.
4.2 执行return
def aa():
return
print(666)
print(aa())
res = aa()
print(res)
![2022-12-09_01666](https://img-blog.csdnimg.cn/img_convert/1c7009e641caa9b65b5b13971e0a62f2.png)
def bb():
print(123)
return
print(bb())
![2022-12-09_01665](https://img-blog.csdnimg.cn/img_convert/120d20d645032805b1b8f0780dad15f2.png)
4.3 不写return
def aa():
pass
print(aa())
4.4 只写return
def aa():
return
print(aa())
4.5 返回单个值
def aa():
return 1
res = aa()
print(res, type(res))
4.6 返回多个值
def aa():
return 1, 2, 3
res = aa()
print(res, type(res))
num = 1, 2, 3
print(num, type(num))
4.7 返回表达式
return后面可以是一个表达式, 先执行表达式得到结果, 再将结果返回.
def aa():
return 1 + 1
res = aa()
print(res)
4.8 解包赋值
将序列类型的返回值解包赋值给多个变量.
def ee():
return 1, 2, 3
num1, num2, num3 = ee()
print(num1, num2, num3)
5. 函数说明文档
help()函数: 能够打印出指定方法, 函数, 变量, 类的说明信息.
dir()函数: 能够列出对象的所有成员, 帮助你快速查找方法和变量.
.__doc__方法: 能够查看对象可以使用的方法.
def func(x, y):
"""
:param x: 加数
:param y: 被加数
:return: 返回 x+y
"""
return x + y
res = func(1, 2)
print(res)
help(func)
print(func.__doc__)
print(dir(func))
运行工具窗口显示:
3
Help on function func in module __main__:
func(x, y)
:param x: 加数
:param y: 被加数
:return: 返回 x+y
:param x: 加数
:param y: 被加数
:return: 返回 x+y
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
![2022-12-10_01667](https://img-blog.csdnimg.cn/img_convert/dee67ada6ff114f2991d2951806d6aad.png)
6. 函数提示信息
函数的参数可以是任意类型但是, 但传入的值不符合要求, 就会报错.
![2022-12-10_01670](https://img-blog.csdnimg.cn/img_convert/2edac9458daed29e3c23a22d4de2f787.png)
为了防止传参出错, 可以设置参数提示.:
使用方法:
def 函数名(参数1: 参数1的类型, 参数2: 参数2的类型) -> 返回值的类型:
pass
* 将数据类型的字面常量写上即可, 其中any表示所有类型.
def aa(x: int, y: int) -> int:
z = x + y
return z
aa(1, 2)
当提供的参数, 类型不符的时候会高亮提示.
![2022-12-10_01671](https://img-blog.csdnimg.cn/img_convert/a9b16a4d2023520aee4abcd7a752dd9c.png)
查看参数类型方式:
* 1. 输入函数名后, 光闭第一次进入括号后, 会显示参数类型提示.
* 2. 按住Ctrl将鼠标移动到函数名下面, 会显示参数类型提示和返回值类型.
![GIF 2022-12-10 1-17-56](https://img-blog.csdnimg.cn/img_convert/a224c0154d3c9fddc7e1f5d729a7e9e3.gif)