如何将基于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
相关产品推荐
相关产品推荐

