Python · Day 21

菜单循环与
学习记录管理器

第二十一天,我没有堆叠更多新语法,而是把循环、条件、函数和文件操作组织成一个完整菜单。程序不再运行一次就结束,而会持续等待我的下一项选择。

先搭建一个最小菜单

while True 让菜单持续运行。input() 返回字符串,所以选项要与 "1""2" 比较;只有选择 "4" 时才执行 break

day21.py
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 才真正结束循环。这也重新区分了 breakreturn:前者结束循环,后者结束函数。

选择 1:把新记录追加进文件

第一项功能调用 save_note()。函数执行结束会回到调用位置,因为这个分支没有 break,所以本轮结束后菜单会再次出现。

day21.py
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()

day21.py
elif choice == "2":                              # 用户选择查看记录
    notes_result = load_notes()                        # 读取文件并接住最新列表
    print("全部学习记录:")                         # 输出内容标题
    show_notes(notes_result)                           # 把列表交给显示函数

选择 2 后,程序正确编号显示四条记录。若文件不存在,load_notes() 返回空列表,show_notes() 检查到长度为 0 后输出“暂时没有学习记录”,两个函数仍然能够安全配合。

选择 3:搜索文件中的最新内容

搜索前也要重新读取文件。否则用户刚通过菜单添加了记录,旧列表却还不知道文件已经改变,新内容就可能搜索不到。

day21.py
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)                          # 显示结果或空列表提示

搜索“菜单”时找到“今天学习了菜单循环”这一条;搜索“不存在”时得到空列表,显示函数输出“暂时没有学习记录”。

四个选项组成完整执行路线

菜单本身只负责接收选择和安排工作,真正的数据处理仍由函数完成。每项功能结束后,控制权回到循环顶部,再次显示菜单。

day21.py
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 结束循环,普通函数执行完则返回调用位置
  • 菜单分支可以分别调用保存、加载、显示与搜索函数
  • 文件改变后应重新读取,避免一直使用内存中的旧列表
  • 返回列表的函数负责提供数据,显示函数负责直接输出

今天没有靠更多语法增加复杂度,而是让已经学过的知识各司其职。程序开始有了清晰的入口、持续的操作过程和明确的退出方式。