对于 Python 初学者而言,通过实战项目巩固基础语法是最高效的学习方式。
本文将带大家从零开始,用 Python 轻松实现一个功能完整的简易点餐系统,涵盖菜单展示、菜品选择、数量调整、订单结算等核心功能,同时讲解项目中用到的列表、字典、循环、条件判断等基础知识点。
一、需求分析:明确点餐系统要做什么
在写代码前,我们先梳理清楚点餐系统的核心需求,避免盲目开发。一个基础的点餐系统需要满足以下功能:
- 菜单展示:清晰列出所有可点菜品、分类(如主食、小吃、饮品)、单价;
- 菜品选择:允许用户根据菜品编号选择想吃的食物;
- 数量调整:支持用户设置菜品的购买数量(至少 1 份);
- 订单管理:实时显示已选菜品、单价、数量、小计,支持删除已选菜品;
- 结算功能:计算订单总金额,支持用户确认支付或取消订单;
- 流程闭环:支付完成后生成订单号,结束流程;若取消,清空订单并重新开始。
二、技术选型:用 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” 选择 “添加菜品”;
- 输入菜品编号(如 102),再输入数量(如 2),提示 “添加成功”;
- 输入 “2” 查看订单,确认已添加的菜品和小计;
- 若想删除菜品,输入 “3”,输入要删除的菜品编号(如 102),确认后删除;
- 选好菜品后,输入 “4” 结算,选择 “1” 确认支付,生成订单号,流程结束;
- 若不想结算,输入 “5” 可退出系统。
五、知识点总结:回顾项目中的 Python 基础
通过这个点餐系统,我们用到了多个 Python 核心基础语法,这些也是后续学习复杂项目的关键:
-
数据结构:
- 列表(
list):用于存储菜单分类、订单菜品(有序、可修改); - 字典(
dict):用于存储单条菜品信息(键值对形式,便于通过键获取值,如dish['name'])。
- 列表(
-
循环结构:
for循环:遍历菜单分类、菜品、订单;while循环:实现 “输入数量直到合法”“持续选择操作” 等逻辑。
-
条件判断:
if-elif-else处理用户的不同操作选择、判断菜品是否存在、订单是否为空。 -
异常处理:
try-except捕获用户输入非数字的错误,提升程序稳定性。 -
函数封装:将重复功能(如展示菜单、添加菜品)封装成函数,减少代码冗余,提高可读性。
六、扩展思路:让系统更完善
如果想进一步提升这个点餐系统,可以尝试以下扩展方向:
- 添加会员功能:存储会员信息,会员下单享受 9 折优惠;
- 增加库存限制:给每个菜品设置库存,下单时检查库存,库存不足提示无法购买;
- 支持多规格选择:如饮品可选择 “冰 / 常温 / 热”,主食可选择 “微辣 / 中辣 / 特辣”;
- 数据持久化:用
json或csv文件保存菜单和订单数据,程序关闭后数据不丢失; - 图形化界面:用
tkinter或PyQt制作可视化界面,替代命令行交互,更贴近真实点餐软件。
通过这个项目,相信大家对 Python 基础语法的应用有了更直观的理解。实战是学习编程的核心,试着基于上述代码进行扩展,逐步提升自己的编程能力吧!