在 Python 编程中,函数是实现代码模块化、复用性的关键工具。今天我们通过一个简易 ATM 系统的实战案例,深入理解函数的定义、调用、全局变量处理等核心知识点。

一、案例背景:ATM 系统的功能需求

我们要实现的 ATM 系统包含以下功能:
用户身份识别(输入姓名)
余额查询
存款操作
取款操作
主菜单交互与循环执行

二、代码拆解:从全局变量到函数设计

  1. 全局变量初始化
    首先定义系统的全局变量,用于存储用户余额和姓名:
money = 131400  # 初始余额
name = None     # 初始姓名为None,后续由用户输入
  1. 用户身份输入
    通过input函数获取用户姓名,完成身份初始化:
name = input("请输入您的姓名:")
  1. 余额查询函数 query()
    定义query函数实现余额查询,通过参数show_header控制是否显示模块标题,提升代码复用性:
def query(show_header):
    if show_header:
        print("--------查询余额--------")
    print(f"{name},您好,您的余额剩余:{money}元")
  1. 存款函数 saving()
def saving(num):
    global money  # 声明修改全局变量money
    money += num
    print("--------存款余额--------")
    print(f"{name},您好,您存款{num}元成功")
    # 存款后查询余额
    query(False)
  1. 取款函数 get_money()
    定义get_money函数处理取款逻辑,同样通过global关键字修改全局变量money:
def get_money(num):
    global money  # 声明修改全局变量money
    money -= num
    print("--------取款余额--------")
    print(f"{name},您好,您取款{num}元成功")
    # 取款后查询余额
    query(False)
  1. 主菜单函数 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("请输入您的选择:")
  1. 循环执行与功能分发
    通过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)")

以下是运行结果图:
在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐