函数:是组织好的,可重复使用的,用来实现特定功能的代码段。
将功能封装在函数内,可供随时随地重复利用
提高代码的复用性,减少重复代码,提高开发效率
## 函数的声明
def 函数名():
函数体
return 返回值
## 函数的调用
函数名(参数)
函数使用步骤:
先定义函数
后调用函数
注意:① 参数如不需要,可以省略 ② 返回值如不需要,可以省略 ③ 函数必须先定义后使用
在函数运行的时候,接受外部传入的数据
传入参数的数量是不受限制的。
可以不使用参数
也可以仅使用任意N个参数
注意事项
函数定义中的参数,称之为形式参数
函数调用中的参数,称之为实际参数
函数的参数数量不限,使用逗号分隔开
传入参数的时候,要和形式参数一一对应,逗号隔开
返回值none:
案例:
定义一个函数,名称任意,并接受一个参数传入(数字类型,表示体温)
在函数内进行体温判断(正常范围:37-38度)
def check(num):
if num < 37:
print(f"体温为{num},体温不正常,需要隔离")
elif num > 38:
print(f"体温为{num},体温不正常,需要隔离")
else:
print(f"体温为{num},体温正常")
check(int(input("请输入你的体温:")))
变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用)
主要分为两类:局部变量和全局变量
局部变量:
所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量
全局变量:
所谓全局变量,指的是在函数体内、外都能生效的变量
global关键字
使用 global关键字 可以在函数内部声明变量为全局变量
定义一个全局变量:money,用来记录银行卡余额(默认5000000)
定义一个全局变量:name,用来记录客户姓名(启动程序时输入)
定义如下的函数:
查询余额函数
存款函数
取款函数
主菜单函数
要求:
程序启动后要求输入客户姓名
查询余额、存款、取款后都会返回主菜单
存款、取款后,都应显示一下当前余额
注意存取款数>0
取款应当判断是否大于余额
客户选择退出,程序会退出,否则一直运行
## ATM银行模拟操作
money = 5000000 # 初始金额
name = input("请输入你的名字:") # 键盘输入姓名
# 查询函数
def chax(caoz):
if caoz == True:
print("-------查询余额---------")
print(f"{name}您好!,你当前的余额为:{money}")
# 存款函数
def ck(num):
if num > 0:
global money # 设置money为全局变量
money += num
print(f"成功存入{num}元")
chax(False)
# 取款函数
def qk(num):
global money # 设置money为全局变量
if num <= money: # 不能超过余额
money -= num
print(f"成功取出{num}元")
chax(False)
# 主函数界面
def main():
print("-------------主菜单------------")
print(f"{name},您好,欢迎来到ATM。请选择操作:")
print("查询余额\t[输入1]")
print("存款\t\t[输入2]")
print("取款\t\t[输入3]") # 通过\t制表符对齐输出
print("退出\t\t[输入4]")
return input("请输入您的选择:")
# 设置无限循环,确保程序不退出
while True:
choose_input = main() # 调用main界面
if choose_input == "1":
chax(True)
continue # 通过continue继续下一次循环,一进来就是回到了主菜单
elif choose_input == "2":
num = int(input("您想要存多少钱?请输入:"))
if num < 0:
print("输入错误")
continue
ck(num)
continue
elif choose_input == "3":
num = int(input("您想要取多少钱?请输入:"))
if num > money:
print("抱歉,余额不足")
elif num < 0:
print("输入错误")
continue
qk(num)
continue
else:
print("程序退出啦")
break # 通过break退出循环
函数要有多个返回值
# 定义多返回值
def test_return()
return 1, 2 # 返回两个值
# 使用x,y接收两个值
x, y = test_return()
print(x)
print(y)
按照返回值的顺序,写对应顺序的多个变量接收即可
变量之间用逗号隔开
支持不同类型的数据return
使用方式上的不同, 函数有4中常见参数使用方式:
定义:
位置参数:调用函数时根据函数定义的参数位置来传递参数
语法:
# 位置参数
def user(name, age, gender):
print(f"你的姓名是:{name},你的年龄是:{age},你的性别是:{gender}")
user("小趴菜", 20, "男")
注意:传递的参数和定义的参数的顺序及个数必须一致
定义:
关键字参数:函数调用时通过“键=值”形式传递参数.
作用: 可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求.
语法:
# 关键字传参
def user(name, age, gender):
print(f"你的姓名是:{name},你的年龄是:{age},你的性别是:{gender}")
user(name = "小趴菜", gender = "男", age = 20) # 可变换顺序
user("小趴菜", gender = "男", age = 20) # 也可与位置参数混用
注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序
定义:
缺省参数:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值
(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用).
作用: 当调用函数时没有传递参数, 就会使用默认是用缺省参数对应的值.
语法:
# 缺省参数
def user(name, age, gender = "男"):
print(f"你的姓名是:{name},你的年龄是:{age},你的性别是:{gender}")
user("小趴菜", 20)
user("小趴菜", 20, "女")
注意:函数调用时,如果为缺省参数传值则修改默认参数值, 否则使用这个默认值
定义:
不定长参数:不定长参数也叫可变参数. 用于不确定调用的时候会传递多少个参数(不传参也可以)的场景.
作用: 当调用函数时不确定参数个数时, 可以使用不定长参数
不定长参数的类型:
①位置传递
②关键字传递
①位置传递:
语法:
# 不定长参数
# 位置传递 tuple类型
def user(*args):
print(args)
user("小趴菜", 20)
user("小趴菜", 20, "女")
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递
②关键字传递:
语法:
# 关键字传递 dict类型
def user(**kwargs):
print(kwargs)
user(name = "小趴菜", age = 20)
user(name = "小趴菜", age = 20, gender = "女")
注意:参数是“键=值”形式的形式的情况下, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典.
在前面的函数学习中,我们一直使用的函数,都是接受数据作为参数传入:
数字
字符串
字典、列表、元组等
其实,我们学习的函数本身,也可以作为参数传入另一个函数内。
语法:
# 函数作为参数传递
def func(compute):
result = compute(1, 2)
print(result)
def compute(x, y):
return x + y
func(compute) # 结果为3
函数compute,作为参数,传入了func函数中使用。
func需要一个函数作为参数传入,这个函数需要接收2个数字进行计算,计算逻辑由这个被传入函数决定
compute函数接收2个数字对其进行计算,compute函数作为参数,传递给了func函数使用
最终,在func函数内部,由传入的compute函数,完成了对数字的计算操作、
所以,这是一种,计算逻辑的传递,而非数据的传递。
就像上述代码那样,不仅仅是相加,相见、相除、等任何逻辑都可以自行定义并作为函数传入。
函数的定义中
def关键字,可以定义带有名称的函数
lambda关键字,可以定义匿名函数(无名称)
有名称的函数,可以基于名称重复使用。
无名称的匿名函数,只可临时使用一次。
匿名函数定义语法:
lambda 传入参数:函数体()
lambda 是关键字,表示定义匿名函数
传入参数表示匿名函数的形式参数,如:x, y 表示接收2个形式参数
函数体,就是函数的执行逻辑,要注意:只能写一行,无法写多行代码
def func(compute):
result = compute(1, 2)
print(result)
func(lambda x, y: x+y) # 结果为3
使用def和使用lambda,定义的函数功能完全一致,只是lambda关键字定义的函数是匿名的,无法二次使用