参考视频和资料:第一阶段-第五章-01-函数的初体验_哔哩哔哩_bilibili
Day05
对应视频:第一阶段第五章
第五章 函数
目录
一、函数
1.定义
组织好的,可重复利用的,用来实现特定功能的代码段。
也就是将重复性的内容封装起来,供人使用
之前接触的input()、str()、int()等都是Python的内置函数
比如:要求输出三个字符串的长度,未使用函数时类似功能的语句要写三遍。若采用函数,当函数写好后就可以直接调用,减少了代码量
str1 = "itheima"
str2 = "itcast"
str3 = "Python"
sum = 0
for x in str1:
sum += 1
print(f"字符串{str1}的长度是:{sum}")
sum = 0
for x in str2:
sum += 1
print(f"字符串{str2}的长度是:{sum}")
sum = 0
for x in str3:
sum += 1
print(f"字符串{str3}的长度是:{sum}")
使用函数后:
str1 = "itheima"
str2 = "itcast"
str3 = "Python"
def length(data):
sum = 0
for x in data:
sum += 1
print(f"字符串{data}的长度是:{sum}")
length(str1)
length(str2)
length(str1)
2.优点
(1)将功能封装在函数内,可以随时随地重复使用
(2)提高了程序的复用性,减少重复性代码,提高了开发效率
3.语法
def 函数名(传入参数):
函数体
return 返回值
函数的调用:
函数名(参数)
补充:
(1)传入参数和返回值不是必须的,可以省略
(2)函数在定义后,只有被调用才回执行
【注意】:函数必须先定义后再调用
def say():
print("你好,Python!")
say()
4.执行顺序
代码一般是从上往下执行的
当扫描到函数定义的时候,并不会直接执行里面的函数体,只有再次扫描到该函数的调用的时候,会返回到函数的函数体中去执行
二、函数的参数
1.基本知识点
传入参数:在函数进行计算的时候,接受外部(调用时)提供的数据
传入参数的数量不受限制
(1)不使用参数
(2)使用任意N个参数,使用逗号分隔开,并且注意传入参数时,要与形式参数一一对应
def add(x,y):
print(f"{x}+{y}的结果是:{x+y}")
add(5,10)
代码解析:
(1)函数定义中提供的x和y,称为形式参数(形参),表示函数声明将要使用2个参数
参数之间使用逗号分隔
(2)函数调用中,提供的5和10,称为实际参数(实参),表示函数执行时真正使用的参数值
传入的时候,按照顺序传入数据,使用逗号分隔
2.自动查核酸小练习
def check(data):
if data > 37.5:
print(f"您的体温是:{data}度,需要隔离")
else:
print(f"您的体温是:{data}度,体温正常,请进!")
print("请出示您的健康码以及72小时核酸证明,并配合工作人员检查体温!\n体温测量中...")
num = float(input("请工作人员输入您的体温:"))
check(num)
三、函数的返回值
1.定义
函数在执行完成后,返回给调用者的结果
2.语法
def 函数(参数...)
函数体
return 返回值
变量 = 函数(参数)
也就是通过return关键字,就能向调用者返回数据,函数以外的变量就可以接收到函数的返回值
3.补充
函数体执行时,只要遇到return关键字,就表明函数已经执行完了——函数体中return以后的代码都不会被执行
如下面的代码,相加之后的值通过return语句返回给调用处,并将返回值赋给了count
return之后的print语句并不会被执行
def add(x,y):
sum = x + y
return sum
print("Python")
count = add(5,10)
print(count)
四、None类型
1.定义
字面量None,类型:<class 'NoneType'>,表示“空”
补充:
(1)如果函数没有使用return语句返回数据,函数仍有返回值
(2)无返回值的函数实际上就是返回了None这个字面量,即:这个函数没有返回什么有意义的内容。也就是返回了空
def say():
print("你好!")
num = say()
print(f"函数say返回值的字面量是:{num}")
print(f"函数say返回值的类型是:{type(num)}")
2.应用场景
(1)用在函数无返回值上
不使用return语句直接返回None
也可以主动return None
def say():
print("你好!")
return None
num = say()
print(f"函数say返回值的字面量是:{num}")
print(f"函数say返回值的类型是:{type(num)}")
(2)用在if判断中
在if判断中,None等同于Flase
一般用于在函数中主动返回None,配合if判断做相关处理
def check(age):
if age >= 18:
return "SUCCESS"
else:
return None
result = check(15)
# 如果if后面跟的是字符串,则只要这个字符串不为空串,python就把它看作True
# if后面的条件是数字,只要这个数字不是0,python都会把它当做True处理
if not result:
print("未成年不可以进入!")
(3)用于声明无内容的变量上
定义变量,但是暂时不需要变量有具体值,可以用None来代替
name = None
小提示:
(1)如果if后面跟的是字符串,则只要这个字符串不为空串,python就把它看作True
(2)if后面的条件是数字,只要这个数字不是0,python都会把它当做True处理
五、函数的说明文档
添加说明文档可以帮助快速理解函数的作用
1.方法
多行注释
注释内容应该写在函数体之前
2.格式规范
def func(x,y):
"""
函数说明
:param x:形参x的说明
:return:返回值的说明
"""
函数体
return 返回值
:param用于解释参数
:return用于解释返回值
def add(x,y):
"""
add函数可以接收两个参数,进行两个参数相加的功能
:param x:形参x是相加的其中一个值
:param y:形参y是相加的另外一个值
:return:返回值是2数相加的结果
"""
result = x + y
print(f"{x}+{y}的结果是:{result}")
return result
add(5,10)
小技巧:
(1)在pycharm的函数内直接输入"""+回车就会出来
(2)如果没有,可以如果回车没用请进入设置:工具——Python集成工具》Docstring格式 原先的Plain格式改为reStructuredText即可
(3)当调用所定义好的函数时,将鼠标悬停在调用语句上可以查看写好的说明文档
六、函数的嵌套调用
一个函数里面又调用了另外一个函数
如果函数A中调用了另外一个函数B,那么当顺序执行到函数B时,会先把函数B中的任务都执行完之后才会回到上次函数A执行的位置
def fun2():
print("---2---")
def fun1():
print("---1---")
#嵌套调用函数fun2
fun2()
print("---3---")
fun1()
七、函数中变量的作用域
变量的作用域指的是变量的作用范围。即:变量在哪可用,在哪不可用
1.局部变量
(1)定义:定义在函数体内部的变量,只在函数体内部生效
(2)特点:在函数体内部,临时保存数据。
即:当函数调用执行完成之后,会销毁局部变量
一旦出了函数体,局部变量就无法使用了
def test():
num = 100
print(num)
test()
# 下面这句会报错,显示:未解析的引用 'num'
# 原因:调用test函数执行完毕之后,内部的局部变量会被销毁,也就找不到num变量了
# print(num)
2.全局变量
在函数体内、外都能生效的变量
当已经存在全局变量了,如果再在某个函数体内定义一个与全局变量同名的变量,对其进行赋值是不会影响全局变量的,因为此时赋值的变量是局部变量。而当在该函数中用到该变量的时候,以局部变量为准
# 全局变量演示
num = 100
def test1():
print(f"test1:{num}")
def test2():
print(f"test2:{num}")
test1()
test2()
print(num)
由于num是全局变量,在函数体内外都会生效,所以三个地方都输出的是100
全局变量与局部变量 :
num = 100
def test1():
print(f"test1:{num}")
def test2():
# 该num变成了局部变量
num = 200
print(f"test2:{num}")
test1()
test2()
print(num)
由于test2中的num是局部变量,只对test2起作用,并且改变的num字面量是局部变量的,对外部全局变量的num不起作用,所以只有通过函数test2输出的值是200
3.global关键字
可以将函数体内定义的变量声明为全局变量
相当于在某个函数体内部声明与全局变量同名的变量时,如果加上global关键字,就将它与全局变量关联起来了(相当于同一个变量),可以进行修改
num = 100
def test1():
print(f"test1:{num}")
def test2():
# 将该num设置为了全局变量
global num
num = 200
print(f"test2:{num}")
test1()
test2()
print(num)
由于test2中的num用关键字global声明了,与函数外部的全局变量num联系起来了,所以改变test2中num的值也相当于修改了全局变量num的值。即后两个输出的都是200
八、ATM小练习
# 定义全局变量
money = 5000000
name = None
num = None
# 定义查询余额函数
def check(show_header):
if show_header:
print("-----------查询余额-----------")
print(f"{name}您好,你的账户余额为:{money}元")
# 定义存款函数
def putin():
global money
print("-----------存款-----------")
num = int(input("请输入您的存款金额:"))
money += num
print(f"{name}您好,您存款{num}元成功!")
check(False)
# 定义取款函数
def putout():
global money
print("-----------取款-----------")
num = int(input("请输入您的取款金额:"))
money -= num
print(f"{name}您好,您取款{num}元成功!")
check(False)
# 定义主菜单函数
def menu():
print("-----------主菜单-----------")
print(f"{name}您好,欢迎来到XXX银行ATM,请选择操作:")
print("查询余额\t【输入1】")
print("存款\t\t【输入2】")
print("取款\t\t【输入3】")
print("退出\t\t【输入4】")
global num
num = int(input("请输入您的选择:"))
name = input("请输入您的名字:")
menu()
flag = True
while flag:
if num == 1:
check(True)
menu()
elif num == 2:
putin()
menu()
elif num == 3:
putout()
menu()
else:
flag = False
# 或者循环条件直接设置为True,这里直接用break