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
def func(): qwe
func()
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. 执行函数体,.
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()
3. 函数的类型
3.1 分类
函数的三种类型:
* 1.无参函数 函数在定义阶段括号内没有参数.
* 2.有参函数 函数在定义阶段括号内有参数, 提供参数后, 参数可以在函数体中使用.
* 3.空函数 函数在定义阶段括号内没有参数, 函数体为空(pass 或 ···).函数的'参数'与'返回值'取决于是否需要对函数传入值与需要返回值.
'pass'或'···', 表示空语句, 本身没有含义, 使用它是为了符合编码的规则.
3.2 无参函数
def aa():x = 10y = 10print(x + y)
aa()
3.3 有参函数
def bb(x, y):print(x + y)
bb(10, 10)
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)
def bb():print(123) return print(bb())
4.3 不写return
def aa():pass print(aa())
4.4 只写return
def aa():return
print(aa())
4.5 返回单个值
def aa():return 1res = aa()
print(res, type(res))
4.6 返回多个值
def aa():return 1, 2, 3res = aa()
print(res, type(res))
num = 1, 2, 3
print(num, type(num))
4.7 返回表达式
return后面可以是一个表达式, 先执行表达式得到结果, 再将结果返回.
def aa():return 1 + 1res = 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 + yres = 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__']
6. 函数提示信息
函数的参数可以是任意类型但是, 但传入的值不符合要求, 就会报错.
为了防止传参出错, 可以设置参数提示.:
使用方法:
def 函数名(参数1: 参数1的类型, 参数2: 参数2的类型) -> 返回值的类型:pass* 将数据类型的字面常量写上即可, 其中any表示所有类型.
def aa(x: int, y: int) -> int:z = x + yreturn zaa(1, 2)
当提供的参数, 类型不符的时候会高亮提示.
查看参数类型方式:
* 1. 输入函数名后, 光闭第一次进入括号后, 会显示参数类型提示.
* 2. 按住Ctrl将鼠标移动到函数名下面, 会显示参数类型提示和返回值类型.