函数
定义语法
def 函数名(传入参数):
函数体
return 返回值
使用步骤
先定义函数
后调用函数
注意事项
参数不需要,可以省略
返回值不需要,可省略
函数的定义
一个程序可以按不同功能实现拆分成不同模块,而函数就是能实现某一部分功能的代码块。
python 中定义一个函数要使用 def 语句,依次写出函数名,括号,括号内参数和冒号,然后在缩进块中编写函数体,函数的返回值用 return 语句返回
注意:python 是靠缩进块来标明函数的作用域范围的,缩进块内是函数体,这和其他高级编程语言是有区别的,比如:C/C++/java/R 语言大括号{ }内的是函数体
函数中传入参数
传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据
使用方式
1 | def add(x,y) |
注意事项
函数定义中的参数称之为形式参数
函数调用中的参数称之为实际参数
函数的参数数量不限,使用逗号分隔开
传入参数的时候,要和形式参数一 一对应,逗号隔开
函数的返回值
如图代码,定义两数相加的函数功能,完成功能后,会将相加的结果返回给函数调用者,所以,变量 r 接收到了函数的执行结果
综上所述,返回值就是程序中函数完成事情后,最后给调用者的结果
返回值的语法
1 | def 函数(参数): |
变量就能接收到函数的返回值
语法就是:通过 return 关键字,就能向调用者返回数据
应用语法
使用关键字:return 来返回结果
注意:
函数体在遇到 return 后就结束了,所以写在 return 后的代码不会执行
None 类型
其类型是:<class ‘NoneType’>
无返回值的函数,实际上就是返回了:None 这个字面量
None 表示:空的,无实际意义的意思
函数返回的 None 就表示这个函数没有返回什么有意义的内容
也就是返回了空的意思
应用场景
1,用于函数无返回值上
2,用在 if 判断上
(1),在 if 判断上,None 等同于 False
(2),一般用于在函数中主动返回 None,配合 if 判断做相关处理
3,用于声明无内容的变量上
定义变量,但暂时不需要变量有具体值,可以用 None 来代替
1 | #暂不赋予变量具体值 |
函数如何返回 None
1,不使用 return 语句即返回 None
2,主动 return None
说明文档
函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低
我们可以给函数添加说明文档,辅助理解函数的作用
1 | def func(x,y): |
通过多行注释的形式,对函数进行说明解释
内容应写在函数体之前
:param 用于解释参数
:return 用于解释返回值
函数的嵌套
函数嵌套指的是一个函数里面又调用了另外一个函数
·
执行流程:
函数 A 中执行到调用函数 B 的语句,会将函数 B 全部执行完成后,继续执行函数 A 的剩余内容
变量
局部变量
变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用)
主要分为两类:局部变量和全局变量
所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效
变量 A 是定义在“testA”函数内部的 变量,在函数外部访问则立即报错
局部变量的作用:在函数内部,临时保存数据,即当函数调用完成后,则销毁局部变量
全局变量
指的是在函数体内,外都能生效的变量
使用 global 关键字将函数内定义的变量声明为全局变量
位置参数和关键字参数
位置参数调用参数时,传入参数值按照位置顺序依次赋给参数,这样的参数称为位置参数,如下所示代码 :
关键字参数函数调用时,通过参数名指定需要赋值的参数。通常我们在调用一个函数的时候,如果参数有多个,我们常常会混洗一个参数的顺序,达不到我们希望的效果。在 python 中引入关键字参数就可解决这个潜在的问题,如下所示代码:
例题
主菜单效果
查询余额效果
存,取款效果
1.定义一个全局变量:money,用来记录银行卡余额(默认 5000000)
2,定义一个全局变量:name ,用来记录客户姓名(启动程序时输入)
3.定义如下的函数:
- 查询余额函数
- 存款函数
- 取款函数
- 主菜单函数
要求:
- 程序启动后要求输入客户姓名
- 查询余额,存款,取款后都会返回主菜单
- 存款,取款后,都应显示一下当前余额
- 客户选择退出或输入错误,程序会退出,否则程序会一直运行
1 | """ |
递归函数
递归可以把一个大问题分解成更小的同类型问题,直到问题小到可以被直接解决,继而层层解决掉原本的大问题
递归函数需要一个终止条件,当满足某个终止条件时,函数就不再递归调用了
为什么无限调用会导致程序崩溃呢?
因为每次调用函数都会在内存新增一个栈帧,用来保存函数内部的状态,比如函数局部变量的值等等,因为函数各个都是相互独立的,但栈空间是有限的,如果我们只是一味调用函数而不返回,一旦栈被填满后,就会导致栈溢出。程序会直接中止运行
基本情况(Base case):用来决定递归的终止条件
LEGB 规则
python 在查找“名称”时,是按照 LEGB 规则查找的:
Local 指的是函数或者类的方法内部
Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global 指的是模块中的全局变量
Built in 指的是 python 为自己保留的特殊名称






