菜单循环与
学习记录管理器
第二十一天,我没有堆叠更多新语法,而是把循环、条件、函数和文件操作组织成一个完整菜单。程序不再运行一次就结束,而会持续等待我的下一项选择。
先搭建一个最小菜单
while True 让菜单持续运行。input() 返回字符串,所以选项要与 "1"、"2" 比较;只有选择 "4" 时才执行 break。
while True: # 持续运行菜单,直到执行 break
print("1. 添加记录") # 显示添加选项
print("2. 查看记录") # 显示查看选项
print("3. 搜索记录") # 显示搜索选项
print("4. 退出程序") # 显示退出选项
choice = input("请选择功能:") # 获取字符串形式的选择
if choice == "1": # 用户选择添加功能
print("你选择了添加记录") # 暂时显示选择结果
elif choice == "4": # 用户选择退出功能
print("程序已退出") # 输出退出提示
break # 结束当前 while 循环
else: # 处理菜单之外的输入
print("输入错误,请重新选择") # 提示后自动进入下一轮
测试时依次输入 1、9、4:选 1 后菜单再次出现;9 进入错误分支后仍继续;4 才真正结束循环。这也重新区分了 break 与 return:前者结束循环,后者结束函数。
选择 1:把新记录追加进文件
第一项功能调用 save_note()。函数执行结束会回到调用位置,因为这个分支没有 break,所以本轮结束后菜单会再次出现。
def save_note(note): # 定义追加保存函数
with open("learning_note.txt", "a", encoding="utf-8") as file: # 保留原内容并追加
file.write(note + "\n") # 写入一条记录并换行
if choice == "1": # 进入添加记录分支
new_note = input("请输入新的学习记录:") # 获取新记录字符串
save_note(new_note) # 把字符串追加进文件
print("学习记录已保存") # 显示保存成功提示
输入“今天学习了菜单循环”后,learning_note.txt 从三行增加到四行。追加模式 "a" 保留旧记录;如果改成 "w",原文件内容会被重写。
选择 2:读取并编号显示最新记录
查看功能不是使用程序启动时保存的旧列表,而是每次重新调用 load_notes()。它先读取并清理文件,再把返回列表交给 show_notes()。
elif choice == "2": # 用户选择查看记录
notes_result = load_notes() # 读取文件并接住最新列表
print("全部学习记录:") # 输出内容标题
show_notes(notes_result) # 把列表交给显示函数
选择 2 后,程序正确编号显示四条记录。若文件不存在,load_notes() 返回空列表,show_notes() 检查到长度为 0 后输出“暂时没有学习记录”,两个函数仍然能够安全配合。
选择 3:搜索文件中的最新内容
搜索前也要重新读取文件。否则用户刚通过菜单添加了记录,旧列表却还不知道文件已经改变,新内容就可能搜索不到。
def search_notes(notes, keyword): # 定义关键词搜索函数
found_notes = [] # 准备保存匹配记录
for note in notes: # 遍历最新记录列表
if keyword in note: # 判断记录是否包含关键词
found_notes.append(note) # 收集匹配的记录
return found_notes # 返回搜索结果列表
elif choice == "3": # 用户选择搜索记录
keyword = input("请输入搜索关键词:") # 获取搜索关键词
notes_result = load_notes() # 重新读取文件中的最新内容
search_result = search_notes(notes_result, keyword) # 搜索并接住结果列表
print("搜索结果:") # 输出搜索标题
show_notes(search_result) # 显示结果或空列表提示
搜索“菜单”时找到“今天学习了菜单循环”这一条;搜索“不存在”时得到空列表,显示函数输出“暂时没有学习记录”。
四个选项组成完整执行路线
菜单本身只负责接收选择和安排工作,真正的数据处理仍由函数完成。每项功能结束后,控制权回到循环顶部,再次显示菜单。
while True: # 持续等待用户选择
choice = input("请选择功能:") # 获取字符串选项
if choice == "1": # 添加记录
new_note = input("请输入新的学习记录:") # 获取新记录
save_note(new_note) # 保存到文件
elif choice == "2": # 查看记录
notes_result = load_notes() # 获取最新列表
show_notes(notes_result) # 编号显示全部内容
elif choice == "3": # 搜索记录
keyword = input("请输入搜索关键词:") # 获取关键词
notes_result = load_notes() # 获取最新列表
search_result = search_notes(notes_result, keyword) # 得到搜索结果
show_notes(search_result) # 显示搜索结果
elif choice == "4": # 退出程序
break # 结束菜单循环
else: # 处理无效选项
print("输入错误,请重新选择") # 提示后继续下一轮
今天真正掌握的内容
while True可以让菜单持续等待用户操作input()返回字符串,因此菜单选项用字符串比较break结束循环,普通函数执行完则返回调用位置- 菜单分支可以分别调用保存、加载、显示与搜索函数
- 文件改变后应重新读取,避免一直使用内存中的旧列表
- 返回列表的函数负责提供数据,显示函数负责直接输出
今天没有靠更多语法增加复杂度,而是让已经学过的知识各司其职。程序开始有了清晰的入口、持续的操作过程和明确的退出方式。