Python 函数实战:打造简易 ATM 系统,掌握函数核心应用
·
在 Python 编程中,函数是实现代码模块化、复用性的关键工具。今天我们通过一个简易 ATM 系统的实战案例,深入理解函数的定义、调用、全局变量处理等核心知识点。
一、案例背景:ATM 系统的功能需求
我们要实现的 ATM 系统包含以下功能:
用户身份识别(输入姓名)
余额查询
存款操作
取款操作
主菜单交互与循环执行
二、代码拆解:从全局变量到函数设计
- 全局变量初始化
首先定义系统的全局变量,用于存储用户余额和姓名:
money = 131400 # 初始余额
name = None # 初始姓名为None,后续由用户输入
- 用户身份输入
通过input函数获取用户姓名,完成身份初始化:
name = input("请输入您的姓名:")
- 余额查询函数 query()
定义query函数实现余额查询,通过参数show_header控制是否显示模块标题,提升代码复用性:
def query(show_header):
if show_header:
print("--------查询余额--------")
print(f"{name},您好,您的余额剩余:{money}元")
- 存款函数 saving()
def saving(num):
global money # 声明修改全局变量money
money += num
print("--------存款余额--------")
print(f"{name},您好,您存款{num}元成功")
# 存款后查询余额
query(False)
- 取款函数 get_money()
定义get_money函数处理取款逻辑,同样通过global关键字修改全局变量money:
def get_money(num):
global money # 声明修改全局变量money
money -= num
print("--------取款余额--------")
print(f"{name},您好,您取款{num}元成功")
# 取款后查询余额
query(False)
- 主菜单函数 main()
定义main函数实现交互菜单,返回用户的操作选择:
def main():
print("--------主菜单--------")
print(f"{name},您好,欢迎来到饭饭银行ATM,请选择操作:")
print("查询余额\t[输入1]")
print("存款\t\t[输入2]")
print("取款\t\t[输入3]")
print("退出\t\t[输入4]")
return input("请输入您的选择:")
- 循环执行与功能分发
通过while True循环持续运行系统,根据用户输入分发到不同函数:
while True:
keyboard_input = main()
if keyboard_input == "1":
query(True)
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
三、函数知识点总结
函数的定义与调用:
用def 函数名(参数):定义函数,通过函数名(参数)调用。案例中query()、saving()、get_money()、main()都是自定义函数,实现了各自的独立功能。
全局变量的修改:若要在函数内部修改全局变量,需用global 变量名声明,如saving()和get_money()中对money的修改。
函数的复用性:query()函数通过show_header参数,实现了 “带标题” 和 “不带标题” 两种场景的复用,减少了代码冗余。
循环与分支的结合:通过while True循环和if-elif-else分支,实现了用户操作的持续交互与功能分发。
四、代码优化
针对以上代码存在的问题和风险,此部分基于原 ATM 系统进行扩展,增加了密码验证、交易记录和异常处理功能,完整代码优化如下:
# 全局变量初始化(新增密码和交易记录)
money = 131400 # 初始余额
name = None # 用户名
password = "123456" # 初始密码(实际应用中应加密存储)
transactions = [] # 交易记录列表,存储每笔操作
def verify_password():
"""密码验证函数:最多3次输入机会"""
for _ in range(3):
input_pwd = input("请输入密码:")
if input_pwd == password:
print("密码正确,登录成功!")
return True
print("密码错误,请重新输入(剩余{}次机会)".format(2 - _))
print("密码错误次数过多,系统退出")
return False
def query(show_header):
"""查询余额(新增交易记录标记)"""
if show_header:
print("--------查询余额--------")
balance_info = f"{name},您好,您的余额剩余:{money}元"
print(balance_info)
# 记录查询操作(非资金变动,标记为查询)
transactions.append(f"查询余额:{balance_info}")
def saving():
"""存款函数(新增异常处理和交易记录)"""
global money
try:
num = int(input("请输入存款金额(正整数):"))
if num <= 0:
raise ValueError("存款金额必须为正数")
money += num
print("--------存款成功--------")
result = f"{name},您好,您存款{num}元成功,当前余额:{money}元"
print(result)
# 记录存款交易
transactions.append(f"存款:+{num}元,余额:{money}元")
except ValueError as e:
print(f"存款失败:{e}")
def get_money():
"""取款函数(新增余额不足校验和异常处理)"""
global money
try:
num = int(input("请输入取款金额(正整数):"))
if num <= 0:
raise ValueError("取款金额必须为正数")
if num > money:
raise ValueError(f"余额不足!当前余额仅{money}元")
money -= num
print("--------取款成功--------")
result = f"{name},您好,您取款{num}元成功,当前余额:{money}元"
print(result)
# 记录取款交易
transactions.append(f"取款:-{num}元,余额:{money}元")
except ValueError as e:
print(f"取款失败:{e}")
def show_transactions():
"""新增:显示交易记录"""
print("--------交易记录--------")
if not transactions:
print("暂无交易记录")
return
for i, record in enumerate(transactions, 1):
print(f"{i}. {record}")
def main():
"""主菜单(新增交易记录选项)"""
print("\n--------主菜单--------")
print(f"{name},您好,欢迎来到饭饭银行ATM,请选择操作:")
print("1. 查询余额")
print("2. 存款")
print("3. 取款")
print("4. 查看交易记录")
print("5. 退出")
return input("请输入操作编号:")
# 程序入口
if __name__ == "__main__":
name = input("请输入您的姓名:")
# 先验证密码,验证失败则直接退出
if not verify_password():
exit()
# 主循环
while True:
choice = main()
if choice == "1":
query(True)
elif choice == "2":
saving()
elif choice == "3":
get_money()
elif choice == "4":
show_transactions()
elif choice == "5":
print("感谢使用,程序退出")
break
else:
print("输入错误,请重新选择(1-5)")
以下是运行结果图:

更多推荐


所有评论(0)