You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将基于JSON的迷你在线图书馆Python代码优化得更专业?

代码优化建议与函数拆分方案

一、核心优化:将功能拆分为独立函数

把单一职责的逻辑封装成函数,让主流程更清晰,同时提升代码复用性和可维护性。

1. 数据读写函数

封装重复的JSON文件操作,避免代码冗余:

def load_library(file_path):
    """从JSON文件加载图书馆数据"""
    if not os.path.exists(file_path):
        return []
    with open(file_path, 'r', encoding='utf-8') as f:
        return json.load(f)

def save_library(library, file_path):
    """将图书馆数据保存到JSON文件"""
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(library, f, indent=4, ensure_ascii=False)

2. 书籍操作函数

拆分添加、删除、搜索、查看这些核心功能:

def add_book(library):
    """添加一本新书到图书馆"""
    title = input("请输入书名:")
    author = input("请输入作者:")
    new_book = {"book": title.strip(), "author": author.strip()}
    library.append(new_book)
    print(f"已添加书籍:《{title}》 - {author}")
    return library

def delete_book(library):
    """从图书馆删除指定书籍"""
    title = input("请输入要删除的书名:")
    author = input("请输入对应作者:")
    target_book = {"book": title.strip(), "author": author.strip()}
    if target_book in library:
        library.remove(target_book)
        print(f"已删除书籍:《{title}》 - {author}")
    else:
        print("未找到该书籍,无法删除")
    return library

def search_book(library):
    """搜索图书馆中是否存在指定书籍"""
    title = input("请输入要搜索的书名:")
    author = input("请输入对应作者:")
    target_book = {"book": title.strip(), "author": author.strip()}
    if target_book in library:
        print(f"图书馆中有这本书:《{title}》 - {author}")
    else:
        print("图书馆中没有这本书")

def view_library(library):
    """用GUI窗口展示图书馆所有书籍"""
    window = tk.Tk()
    window.title("我的在线图书馆")
    # 格式化书籍展示文本,提升可读性
    library_text = "\n".join([f"《{book['book']}》 - {book['author']}" for book in library]) or "图书馆暂无书籍"
    label = tk.Label(window, text=library_text, justify=tk.LEFT, padx=10, pady=10)
    quit_btn = tk.Button(window, text="退出", fg="red", command=window.destroy)
    label.pack()
    quit_btn.pack(pady=5)
    window.mainloop()  # 启动GUI主循环,避免窗口一闪而过

二、语法与整洁性优化点

  • 替换多独立if为if-elif-else:减少无效判断,提升代码执行效率:
    while True:
        choice = input("\n欢迎使用在线图书馆,请选择操作:\n(1) 添加书籍 (2) 删除书籍 (3) 查看图书馆 (4) 搜索书籍 (5) 退出\n请输入选项编号:")
        if choice == "1":
            library = add_book(library)
            save_library(library, biblio_path)
        elif choice == "2":
            library = delete_book(library)
            save_library(library, biblio_path)
        elif choice == "3":
            view_library(library)
        elif choice == "4":
            search_book(library)
        elif choice == "5":
            print("感谢使用,再见!")
            break
        else:
            print("输入无效,请重新输入1-5之间的编号")
    
  • 修复拼写错误与统一命名:将tittle修正为title,变量名遵循Python小写加下划线的风格。
  • 增加编码与格式化:JSON读写指定encoding='utf-8'避免中文乱码;json.dump添加indent=4和ensure_ascii=False,让生成的JSON文件更易读。
  • 增加错误处理:加载文件时判断文件是否存在,删除书籍时检查目标书籍是否在列表中,避免抛出异常。
  • 优化GUI体验:格式化书籍展示文本,添加窗口标题,解决原代码窗口一闪而过的问题。

三、完整优化后代码

import json
import os
import tkinter as tk

def load_library(file_path):
    """从JSON文件加载图书馆数据"""
    if not os.path.exists(file_path):
        return []
    with open(file_path, 'r', encoding='utf-8') as f:
        return json.load(f)

def save_library(library, file_path):
    """将图书馆数据保存到JSON文件"""
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(library, f, indent=4, ensure_ascii=False)

def add_book(library):
    """添加一本新书到图书馆"""
    title = input("请输入书名:")
    author = input("请输入作者:")
    new_book = {"book": title.strip(), "author": author.strip()}
    library.append(new_book)
    print(f"已添加书籍:《{title}》 - {author}")
    return library

def delete_book(library):
    """从图书馆删除指定书籍"""
    title = input("请输入要删除的书名:")
    author = input("请输入对应作者:")
    target_book = {"book": title.strip(), "author": author.strip()}
    if target_book in library:
        library.remove(target_book)
        print(f"已删除书籍:《{title}》 - {author}")
    else:
        print("未找到该书籍,无法删除")
    return library

def search_book(library):
    """搜索图书馆中是否存在指定书籍"""
    title = input("请输入要搜索的书名:")
    author = input("请输入对应作者:")
    target_book = {"book": title.strip(), "author": author.strip()}
    if target_book in library:
        print(f"图书馆中有这本书:《{title}》 - {author}")
    else:
        print("图书馆中没有这本书")

def view_library(library):
    """用GUI窗口展示图书馆所有书籍"""
    window = tk.Tk()
    window.title("我的在线图书馆")
    library_text = "\n".join([f"《{book['book']}》 - {book['author']}" for book in library]) or "图书馆暂无书籍"
    label = tk.Label(window, text=library_text, justify=tk.LEFT, padx=10, pady=10)
    quit_btn = tk.Button(window, text="退出", fg="red", command=window.destroy)
    label.pack()
    quit_btn.pack(pady=5)
    window.mainloop()

if __name__ == "__main__":
    file_dir = os.path.dirname(__file__)
    biblio_path = os.path.join(file_dir, "bibliotheque.json")
    library = load_library(biblio_path)

    while True:
        choice = input("\n欢迎使用在线图书馆,请选择操作:\n(1) 添加书籍 (2) 删除书籍 (3) 查看图书馆 (4) 搜索书籍 (5) 退出\n请输入选项编号:")
        if choice == "1":
            library = add_book(library)
            save_library(library, biblio_path)
        elif choice == "2":
            library = delete_book(library)
            save_library(library, biblio_path)
        elif choice == "3":
            view_library(library)
        elif choice == "4":
            search_book(library)
        elif choice == "5":
            print("感谢使用,再见!")
            break
        else:
            print("输入无效,请重新输入1-5之间的编号")

内容的提问来源于stack exchange,提问作者Hugo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:47:31