定义语法

def 函数名(传入参数):

函数体

return 返回值

使用步骤

先定义函数

后调用函数

注意事项

参数不需要,可以省略

返回值不需要,可省略

函数的定义

一个程序可以按不同功能实现拆分成不同模块,而函数就是能实现某一部分功能的代码块。

python 中定义一个函数要使用 def 语句,依次写出函数名,括号,括号内参数和冒号,然后在缩进块中编写函数体,函数的返回值用 return 语句返回

注意:python 是靠缩进块来标明函数的作用域范围的,缩进块内是函数体,这和其他高级编程语言是有区别的,比如:C/C++/java/R 语言大括号{ }内的是函数体

函数中传入参数

传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据

使用方式

1
2
3
def add(x,y)
result = x + y
print("f{x} + {y}的结果是:{result}")

注意事项

函数定义中的参数称之为形式参数

函数调用中的参数称之为实际参数

函数的参数数量不限,使用逗号分隔开

传入参数的时候,要和形式参数一 一对应,逗号隔开

函数的返回值

如图代码,定义两数相加的函数功能,完成功能后,会将相加的结果返回给函数调用者,所以,变量 r 接收到了函数的执行结果

综上所述,返回值就是程序中函数完成事情后,最后给调用者的结果

返回值的语法

1
2
3
4
def 函数(参数):
函数体
return返回值
变量=函数(参数)

变量就能接收到函数的返回值

语法就是:通过 return 关键字,就能向调用者返回数据

应用语法

使用关键字:return 来返回结果

注意:

函数体在遇到 return 后就结束了,所以写在 return 后的代码不会执行

None 类型

其类型是:<class ‘NoneType’>

无返回值的函数,实际上就是返回了:None 这个字面量

None 表示:空的,无实际意义的意思

函数返回的 None 就表示这个函数没有返回什么有意义的内容

也就是返回了空的意思

应用场景

1,用于函数无返回值上

2,用在 if 判断上

(1),在 if 判断上,None 等同于 False

(2),一般用于在函数中主动返回 None,配合 if 判断做相关处理

3,用于声明无内容的变量上

定义变量,但暂时不需要变量有具体值,可以用 None 来代替

1
2
#暂不赋予变量具体值
name = None

函数如何返回 None

1,不使用 return 语句即返回 None

2,主动 return None

说明文档

函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低

我们可以给函数添加说明文档,辅助理解函数的作用

1
2
3
4
5
6
7
8
9
def func(x,y):
"""
函数说明
:param x:形参x的说明
:param y:形参y的说明
return:返回值的说明
"""
函数体
return返回值

通过多行注释的形式,对函数进行说明解释

内容应写在函数体之前

:param 用于解释参数

:return 用于解释返回值

函数的嵌套

函数嵌套指的是一个函数里面又调用了另外一个函数

·

执行流程:

函数 A 中执行到调用函数 B 的语句,会将函数 B 全部执行完成后,继续执行函数 A 的剩余内容

变量

局部变量

变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用)

主要分为两类:局部变量和全局变量

所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效

变量 A 是定义在“testA”函数内部的 变量,在函数外部访问则立即报错

局部变量的作用:在函数内部,临时保存数据,即当函数调用完成后,则销毁局部变量

全局变量

指的是在函数体内,外都能生效的变量

使用 global 关键字将函数内定义的变量声明为全局变量

位置参数和关键字参数

位置参数调用参数时,传入参数值按照位置顺序依次赋给参数,这样的参数称为位置参数,如下所示代码 :

关键字参数函数调用时,通过参数名指定需要赋值的参数。通常我们在调用一个函数的时候,如果参数有多个,我们常常会混洗一个参数的顺序,达不到我们希望的效果。在 python 中引入关键字参数就可解决这个潜在的问题,如下所示代码:

例题

主菜单效果

查询余额效果

存,取款效果

1.定义一个全局变量:money,用来记录银行卡余额(默认 5000000)

2,定义一个全局变量:name ,用来记录客户姓名(启动程序时输入)

3.定义如下的函数:

  • 查询余额函数
  • 存款函数
  • 取款函数
  • 主菜单函数

要求:

  • 程序启动后要求输入客户姓名
  • 查询余额,存款,取款后都会返回主菜单
  • 存款,取款后,都应显示一下当前余额
  • 客户选择退出或输入错误,程序会退出,否则程序会一直运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""
演示函数综合案例开发
"""
#定义全局变量money name
money = 5000000
name = None

#要求客户输入姓名
name = input("请输入您的姓名:")
#定义查询函数
def query(show_header):
if show_header:
print("----------------查询余额-----------------------")
print(f"{name},您好,您的余额剩余:{money}元")


#定义存款函数
def saving(num):
global money #money在函数内部定义为全局变量
money += num
print("----------------存款-----------------------")
print(f"{name},您好,您存款{num}元成功")

#调用query函数查询余额
query(False)

#定义取款函数
def get_money(num):
global money
money -= num
print("----------------取款-----------------------")
print(f"{name},您好,您取款{num}元成功")

#调用query函数查询余额
query(False)
#定义主菜单函数
def main():
print("----------------主菜单-----------------------")
print(f"{name},您好,欢迎来到黑马银行AMT。请选择操作:")
print("查询余额\t[输入1]")
print("存款\t\t[输入2]")
print("取款\t\t[输入3]") #通过\t制表符对齐输出
print("退出\t\t[输入4]")
return input("请输入您的选择:")


#设置无限循环,确保程序不退出
while True:
keyboard_input = main()
if keyboard_input == "1":
query(True)
continue #通过continue继续下一次循环,一进来就是回到了主菜单
elif keyboard_input == "2":
num = int(input("您想要存多少钱?请输入:"))
saving(num)
continue
elif keyboard_input == "3":
num = int(input("您想要取多少钱?请输入:"))
get_money(num)
continue
else:
print("程序退出啦")
break #通过break退出循环

递归函数

递归可以把一个大问题分解成更小的同类型问题,直到问题小到可以被直接解决,继而层层解决掉原本的大问题

递归函数需要一个终止条件,当满足某个终止条件时,函数就不再递归调用了

为什么无限调用会导致程序崩溃呢?

因为每次调用函数都会在内存新增一个栈帧,用来保存函数内部的状态,比如函数局部变量的值等等,因为函数各个都是相互独立的,但栈空间是有限的,如果我们只是一味调用函数而不返回,一旦栈被填满后,就会导致栈溢出。程序会直接中止运行

基本情况(Base case):用来决定递归的终止条件

LEGB 规则

python 在查找“名称”时,是按照 LEGB 规则查找的:

Local 指的是函数或者类的方法内部

Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)

Global 指的是模块中的全局变量

Built in 指的是 python 为自己保留的特殊名称