当前位置: 首页 > news >正文

6个月Python学习计划 Day 19 - 模块与包的实战拆分

🎯 今日目标

  • 理解Python模块和包的概念
  • 学会如何拆分大型程序为多个模块
  • 掌握模块的导入和使用方法
  • 了解包的结构和创建
  • 简单封装工具函数模块

📚 核心概念

模块(Module):一个 .py 文件就是一个模块,里面可以定义函数、类、变量等。

包(Package):一个包含 init.py 文件的文件夹,即一个包,包里可以包含多个模块。

通过模块和包,可以把程序拆分成多个功能清晰、职责单一的部分。


🛠️ 拆分学生管理系统代码示例

  1. 创建文件结构

    student_manager/
    ├── main.py
    ├── student.py
    ├── manager.py
    └── utils.py
    
  2. student.py — 学生类定义

    # student.pyclass Student:def __init__(self, sid, name, score):self.sid = sidself.name = nameself.score = scoredef __str__(self):return f"{self.sid:<6} {self.name:<10} {self.score:<5}"def __eq__(self, other):if isinstance(other, Student):return self.sid == other.sidreturn False
    
  3. manager.py — 管理类

    # manager.pyfrom student import Studentclass StudentManager:def __init__(self):self.students = []def add_student(self, sid, name, score):self.students.append(Student(sid, name, score))def show_all(self):print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")for stu in self.students:print(stu)def find_by_sid(self, sid):for stu in self.students:if stu.sid == sid:print("找到学生:", stu)returnprint("未找到该学号的学生。")def delete_by_sid(self, sid):for stu in self.students:if stu.sid == sid:self.students.remove(stu)print("删除成功!")returnprint("删除失败,未找到该学号。")def sort_by_score(self):self.students.sort(key=lambda x: x.score, reverse=True)print("成绩排序成功!")self.show_all()def search_by_name(self, keyword):result = [stu for stu in self.students if keyword.lower() in stu.name.lower()]if result:print(f"{'学号':<6} {'姓名':<10} {'成绩':<5}")for stu in result:print(stu)else:print("未找到相关学生。")
    
  4. utils.py — 工具函数(示例)

    # utils.pydef input_score(prompt="请输入成绩:"):while True:try:score = float(input(prompt))return scoreexcept ValueError:print("输入无效,请输入数字。")
  5. main.py — 程序入口

    # main.pyfrom manager import StudentManager
    from utils import input_scoredef run():manager = StudentManager()while True:print("\n==== 学生成绩管理系统 ====")print("1. 添加学生")print("2. 显示所有学生")print("3. 查找学生")print("4. 删除学生")print("5. 按成绩排序")print("6. 退出")print("7. 按姓名模糊查找")choice = input("请输入操作编号:")if choice == "1":sid = input("请输入学号:")name = input("请输入姓名:")score = input_score()manager.add_student(sid, name, score)print("添加成功!")elif choice == "2":manager.show_all()elif choice == "3":sid = input("请输入要查找的学号:")manager.find_by_sid(sid)elif choice == "4":sid = input("请输入要删除的学号:")manager.delete_by_sid(sid)elif choice == "5":manager.sort_by_score()elif choice == "6":print("感谢使用,已退出。")breakelif choice == "7":keyword = input("请输入要查找的姓名关键词:")manager.search_by_name(keyword)else:print("输入无效,请重新输入。")if __name__ == "__main__":run()

📝 今日练习任务

  • 将已有的“学生成绩管理系统”代码拆分成上述模块文件,实现模块导入运行。

  • 新增一个工具函数 input_score 来校验成绩输入。

  • 尝试为系统增加新模块,比如添加一个 file_manager.py 模块,来实现后续的文件保存与读取功能。

    • file_manager.py — 文件读写模块示例

      # file_manager.py
      import os
      from student import StudentFILE_PATH = "students_data.txt"def save_students(students):"""将学生列表保存到文件,覆盖写入"""with open(FILE_PATH, "w", encoding="utf-8") as f:for stu in students:# 格式:学号|姓名|成绩line = f"{stu.sid}|{stu.name}|{stu.score}\n"f.write(line)def load_students():"""从文件读取学生数据,返回 Student 对象列表"""students = []if not os.path.exists(FILE_PATH):return studentswith open(FILE_PATH, "r", encoding="utf-8") as f:for line in f:line = line.strip()if not line:continuesid, name, score_str = line.split("|")try:score = float(score_str)except ValueError:score = 0.0students.append(Student(sid, name, score))return students
      
    • 在 StudentManager 类中,可以增加两个方法:

      from file_manager import save_students, load_studentsclass StudentManager:def __init__(self):# 加载时初始化学生列表self.students = load_students()# 其他方法...def save_to_file(self):save_students(self.students)print("数据已保存到文件。")
    • 退出时保存
      在 main.py 退出程序时调用:

      elif choice == "6":manager.save_to_file()print("感谢使用,数据已保存,程序退出。")break
      

🧾 今日总结

知识点说明
Python模块单个 .py 文件即为模块
包(Package)带有 __init__.py 的文件夹
导入语法importfrom ... import ...
拆分代码方便维护、复用和多人协作

相关文章:

  • AI赋能农业
  • 线程分离属性
  • JavaScript BOM 详细介绍
  • C++ 标准模板库(STL)详解文档
  • 2506C++,C++的时间库
  • 2025-03-15-位运算
  • 树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
  • Canfestival的移植思想
  • SpringBoot项目报错汇总
  • 磐维数据库的权限使用
  • 7.6 Finetuning the LLM on instruction data
  • SciencePlots——绘制论文中的图片
  • 软件开发和嵌入式开发岗位的面试题
  • PLC入门【7】基本指令的总结(MC、MCR)
  • threadlocal的实现说明
  • Doris “_stream_load“ 方式批量导入数据
  • 使用Ajax从前端向后端发起请求
  • 算法第12天|继续学习二叉树:翻转二叉树、对称二叉树、二叉树最大深度、二叉树的最小深度
  • 铭豹扩展坞 USB转网口 突然无法识别解决方法
  • 蓝奏云(Lanzou Cloud)一款国内知名的免费网盘和文件分享服务 以及蓝奏云的api
  • 江苏省建设厅网站官网/网络营销比较好的企业
  • 做网站怎么租用服务器吗/手机推广app
  • wordpress 古典/淘宝关键词优化软件
  • 网站落地页如何做/商务软文写作300字
  • 渭南市建设工程有限责任公司/谷歌优化排名公司
  • 哪个市文化和旅游网站做的好/北京seo编辑