Python 基础实战:从零搭建简易点餐系统

39 阅读10分钟

对于 Python 初学者而言,通过实战项目巩固基础语法是最高效的学习方式。

本文将带大家从零开始,用 Python 轻松实现一个功能完整的简易点餐系统,涵盖菜单展示、菜品选择、数量调整、订单结算等核心功能,同时讲解项目中用到的列表、字典、循环、条件判断等基础知识点。

一、需求分析:明确点餐系统要做什么

在写代码前,我们先梳理清楚点餐系统的核心需求,避免盲目开发。一个基础的点餐系统需要满足以下功能:

  1. 菜单展示:清晰列出所有可点菜品、分类(如主食、小吃、饮品)、单价;
  2. 菜品选择:允许用户根据菜品编号选择想吃的食物;
  3. 数量调整:支持用户设置菜品的购买数量(至少 1 份);
  4. 订单管理:实时显示已选菜品、单价、数量、小计,支持删除已选菜品;
  5. 结算功能:计算订单总金额,支持用户确认支付或取消订单;
  6. 流程闭环:支付完成后生成订单号,结束流程;若取消,清空订单并重新开始。

二、技术选型:用 Python 基础语法实现

本项目不依赖任何第三方库,仅使用 Python 内置语法,适合初学者理解:

  • 数据存储:用列表存储菜单分类,字典存储单条菜品信息(编号、名称、单价、分类)和订单信息;
  • 交互逻辑:用while循环实现持续操作(如反复选菜、确认订单);
  • 条件判断:用if-elif-else处理用户的不同选择(如选菜、删菜、结算);
  • 输入验证:用try-except处理用户输入的非法值(如输入字母而非数字)。

三、代码实现:分模块搭建系统

我们将代码分为「初始化数据」「核心功能函数」「主程序流程」三部分,逐步搭建系统,每部分都附带详细注释。

1. 第一步:初始化数据(菜单与订单)

首先定义系统的基础数据 —— 菜单和空订单。菜单按 “主食、小吃、饮品” 分类,每个菜品包含唯一编号(方便用户选择)、名称和单价;订单初始为空,用于存储用户选择的菜品。

# 1. 初始化菜单数据(列表嵌套字典:外层列表按分类分组,内层字典存储单菜品信息)
menu = [
    # 主食分类
    {
        "category": "主食",
        "dishes": [
            {"id": 101, "name": "番茄鸡蛋面", "price": 15},
            {"id": 102, "name": "香辣牛肉饭", "price": 28},
            {"id": 103, "name": "海鲜炒饭", "price": 32}
        ]
    },
    # 小吃分类
    {
        "category": "小吃",
        "dishes": [
            {"id": 201, "name": "炸鸡翅(4个)", "price": 18},
            {"id": 202, "name": "薯条", "price": 12},
            {"id": 203, "name": "上校鸡块(6块)", "price": 15}
        ]
    },
    # 饮品分类
    {
        "category": "饮品",
        "dishes": [
            {"id": 301, "name": "可乐(中杯)", "price": 8},
            {"id": 302, "name": "奶茶(常温)", "price": 16},
            {"id": 303, "name": "橙汁(鲜榨)", "price": 22}
        ]
    }
]

# 2. 初始化空订单(列表嵌套字典:存储用户选择的菜品id、名称、单价、数量、小计)
order = []

2. 第二步:实现核心功能函数

将每个独立功能封装成函数(如展示菜单、添加菜品、删除菜品),让代码结构更清晰,后续便于维护和扩展。

函数 1:展示菜单(show_menu)

遍历菜单列表,按分类打印菜品信息,让用户直观看到可选项。

def show_menu():
    print("\n" + "="*50)
    print("                欢迎使用XX餐厅点餐系统")
    print("="*50)
    # 遍历菜单的每个分类(主食、小吃、饮品)
    for category in menu:
        print(f"\n【{category['category']}】")  # 打印分类名称
        print("-"*40)
        print(f"{'菜品编号':<10}{'菜品名称':<15}{'单价(元)':<10}")  # 表头
        print("-"*40)
        # 遍历当前分类下的所有菜品
        for dish in category['dishes']:
            print(f"{dish['id']:<12}{dish['name']:<17}{dish['price']:<12}")
    print("="*50 + "\n")

函数 2:添加菜品到订单(add_dish)

根据用户输入的菜品编号,查找对应菜品,确认后添加到订单,并计算小计(单价 × 数量)。

def add_dish():
    try:
        # 1. 让用户输入菜品编号
        dish_id = int(input("请输入要添加的菜品编号:"))
        
        # 2. 查找编号对应的菜品(遍历所有分类的菜品)
        target_dish = None  # 用于存储找到的菜品
        for category in menu:
            for dish in category['dishes']:
                if dish['id'] == dish_id:
                    target_dish = dish
                    break  # 找到菜品,跳出内层循环
            if target_dish:
                break  # 找到菜品,跳出外层循环
        
        # 3. 判断是否找到菜品
        if not target_dish:
            print(f"❌ 未找到编号为{dish_id}的菜品,请重新输入!")
            return
        
        # 4. 让用户输入购买数量(至少1份)
        while True:
            quantity = int(input(f"请输入{target_dish['name']}的购买数量(至少1份):"))
            if quantity >= 1:
                break
            print("❌ 数量不能小于1,请重新输入!")
        
        # 5. 计算小计(单价×数量)
        subtotal = target_dish['price'] * quantity
        
        # 6. 检查订单中是否已存在该菜品(若存在,更新数量和小计;若不存在,新增)
        dish_exist = False
        for item in order:
            if item['id'] == dish_id:
                item['quantity'] += quantity  # 更新数量
                item['subtotal'] += subtotal  # 更新小计
                dish_exist = True
                break
        if not dish_exist:
            # 新增菜品到订单
            order.append({
                "id": target_dish['id'],
                "name": target_dish['name'],
                "price": target_dish['price'],
                "quantity": quantity,
                "subtotal": subtotal
            })
        
        print(f"✅ 已成功添加 {target_dish['name']}{quantity}份)到订单!")
    
    # 处理用户输入非数字的情况(如输入字母)
    except ValueError:
        print("❌ 输入错误!请输入数字类型的菜品编号或数量。")

函数 3:展示当前订单(show_order)

打印订单中已选的菜品,包括名称、单价、数量、小计,并计算总金额。

def show_order():
    print("\n" + "="*60)
    print("                          当前订单")
    print("="*60)
    # 判断订单是否为空
    if not order:
        print("📭 您的订单为空,请先添加菜品!")
        print("="*60 + "\n")
        return
    
    # 打印订单表头
    print(f"{'菜品名称':<15}{'单价(元)':<10}{'数量':<10}{'小计(元)':<10}")
    print("-"*60)
    
    # 遍历订单,打印每道菜品信息
    total = 0  # 总金额
    for item in order:
        print(f"{item['name']:<17}{item['price']:<12}{item['quantity']:<12}{item['subtotal']:<12}")
        total += item['subtotal']  # 累加总金额
    
    print("-"*60)
    print(f"{'订单总金额(元):':<42}{total}")
    print("="*60 + "\n")

函数 4:从订单删除菜品(delete_dish)

根据用户输入的菜品编号,删除订单中对应的菜品(若存在)。

def delete_dish():
    # 先检查订单是否为空
    if not order:
        print("📭 您的订单为空,无需删除菜品!")
        return
    
    try:
        # 1. 让用户输入要删除的菜品编号
        dish_id = int(input("请输入要删除的菜品编号:"))
        
        # 2. 查找订单中是否存在该菜品
        for item in order:
            if item['id'] == dish_id:
                # 确认删除
                confirm = input(f"⚠️  确定要删除 {item['name']} 吗?(y/n):").lower()
                if confirm == 'y':
                    order.remove(item)
                    print(f"✅ 已成功删除 {item['name']}!")
                else:
                    print("❌ 已取消删除操作!")
                return
        
        # 若未找到菜品
        print(f"❌ 订单中未找到编号为{dish_id}的菜品,请重新输入!")
    
    # 处理输入非数字的情况
    except ValueError:
        print("❌ 输入错误!请输入数字类型的菜品编号。")

函数 5:结算订单(settle_order)

确认订单总金额,让用户选择 “支付” 或 “取消”,支付成功后生成随机订单号(模拟真实场景)。

import random  # 用于生成随机订单号

def settle_order():
    # 先检查订单是否为空
    if not order:
        print("📭 您的订单为空,无法结算!")
        return
    
    # 1. 展示当前订单和总金额
    show_order()
    
    # 2. 让用户确认是否支付
    while True:
        choice = input("请选择操作:【1】确认支付 【2】取消结算(返回选菜):").strip()
        if choice == '1':
            # 生成随机订单号(格式:ORD + 6位数字)
            order_number = "ORD" + str(random.randint(100000, 999999))
            # 计算总金额
            total = sum(item['subtotal'] for item in order)
            
            print("\n" + "="*60)
            print("                          支付成功!")
            print("="*60)
            print(f"📄 您的订单号:{order_number}")
            print(f"💰 支付金额:{total} 元")
            print(f"⏰ 预计出餐时间:15-20分钟")
            print("😊 感谢您的光临,祝您用餐愉快!")
            print("="*60 + "\n")
            return True  # 支付成功,返回True
        
        elif choice == '2':
            print("❌ 已取消结算,返回选菜界面。\n")
            return False  # 取消支付,返回False
        
        else:
            print("❌ 输入错误!请输入1或2。")

3. 第三步:主程序流程(控制整体逻辑)

通过while循环让系统持续运行,直到用户完成支付或主动退出,核心逻辑是 “展示菜单→用户选择操作→执行对应功能→循环 / 结束”。

def main():
    print("🎉 欢迎进入XX餐厅点餐系统!")
    while True:
        # 1. 展示菜单
        show_menu()
        
        # 2. 提示用户选择操作
        print("请选择以下操作:")
        print("1. 添加菜品到订单")
        print("2. 查看当前订单")
        print("3. 删除订单中的菜品")
        print("4. 结算订单")
        print("5. 退出系统")
        
        # 3. 获取用户操作选择
        choice = input("\n请输入操作编号(1-5):").strip()
        
        # 4. 根据选择执行对应功能
        if choice == '1':
            add_dish()  # 添加菜品
        elif choice == '2':
            show_order()  # 查看订单
        elif choice == '3':
            delete_dish()  # 删除菜品
        elif choice == '4':
            # 结算订单:若支付成功,结束循环(退出系统)
            if settle_order():
                break
        elif choice == '5':
            # 退出系统前确认
            confirm = input("⚠️  确定要退出系统吗?(y/n):").lower()
            if confirm == 'y':
                print("\n👋 感谢使用,再见!")
                break
            else:
                print("\n❌ 已取消退出,返回选菜界面。")
        else:
            print("❌ 输入错误!请输入1-5之间的数字。")

# 5. 启动程序(当脚本直接运行时执行main函数)
if __name__ == "__main__":
    main()

四、功能测试:运行代码体验流程

将上述代码复制到 Python 编辑器(如 PyCharm、VS Code)中,运行后按以下流程测试功能:

  1. 程序启动后,会先展示菜单,输入 “1” 选择 “添加菜品”;
  2. 输入菜品编号(如 102),再输入数量(如 2),提示 “添加成功”;
  3. 输入 “2” 查看订单,确认已添加的菜品和小计;
  4. 若想删除菜品,输入 “3”,输入要删除的菜品编号(如 102),确认后删除;
  5. 选好菜品后,输入 “4” 结算,选择 “1” 确认支付,生成订单号,流程结束;
  6. 若不想结算,输入 “5” 可退出系统。

五、知识点总结:回顾项目中的 Python 基础

通过这个点餐系统,我们用到了多个 Python 核心基础语法,这些也是后续学习复杂项目的关键:

  1. 数据结构

    • 列表(list):用于存储菜单分类、订单菜品(有序、可修改);
    • 字典(dict):用于存储单条菜品信息(键值对形式,便于通过键获取值,如dish['name'])。
  2. 循环结构

    • for循环:遍历菜单分类、菜品、订单;
    • while循环:实现 “输入数量直到合法”“持续选择操作” 等逻辑。
  3. 条件判断if-elif-else处理用户的不同操作选择、判断菜品是否存在、订单是否为空。

  4. 异常处理try-except捕获用户输入非数字的错误,提升程序稳定性。

  5. 函数封装:将重复功能(如展示菜单、添加菜品)封装成函数,减少代码冗余,提高可读性。

六、扩展思路:让系统更完善

如果想进一步提升这个点餐系统,可以尝试以下扩展方向:

  1. 添加会员功能:存储会员信息,会员下单享受 9 折优惠;
  2. 增加库存限制:给每个菜品设置库存,下单时检查库存,库存不足提示无法购买;
  3. 支持多规格选择:如饮品可选择 “冰 / 常温 / 热”,主食可选择 “微辣 / 中辣 / 特辣”;
  4. 数据持久化:用jsoncsv文件保存菜单和订单数据,程序关闭后数据不丢失;
  5. 图形化界面:用tkinterPyQt制作可视化界面,替代命令行交互,更贴近真实点餐软件。

通过这个项目,相信大家对 Python 基础语法的应用有了更直观的理解。实战是学习编程的核心,试着基于上述代码进行扩展,逐步提升自己的编程能力吧!