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

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 ...
拆分代码方便维护、复用和多人协作
http://www.xdnf.cn/news/13440.html

相关文章:

  • 【Java】在 Spring Boot 中集成 Spring Security + JWT 实现基于 Token 的身份认证
  • 使用Spring Boot Actuator构建用户应用
  • 发布一个angular的npm包(包含多个模块)
  • Nuclei PoC 编写详解:从入门到实践
  • PostgreSQL 数据库技术峰会重庆站回顾|IvorySQL 开源实践与社区生态
  • python打卡day50
  • Leetcode 3572. Maximize Y‑Sum by Picking a Triplet of Distinct X‑Values
  • 对3D对象进行形变分析
  • 基于“SpringBoot+uniapp的考研书库微信小程序设计与实现7000字论文
  • 新型DuplexSpy RAT可使攻击者完全控制Windows系统
  • 微信小程序中的计算属性库-miniprogram-computed
  • 23-Oracle 23 ai 区块链表(Blockchain Table)
  • Cursor 工具项目构建指南:MySql 数据库结构设计的 Cursor 规范
  • MongoDB 基础
  • 鸿蒙考试-Ability生命周期篇
  • 到院率最高提升40%,消费医疗用AI营销机器人跑赢增长焦虑
  • 【python深度学习】Day 50 预训练模型+CBAM模块
  • 高效多尺度网络与可学习离散小波变换用于盲运动去模糊
  • 第四章 RAG 知识库基础
  • CanFestival移植到STM32G4
  • HTML实现的2048游戏
  • 从算法到系统架构:AI生成内容连贯性技术深度解析
  • 全网首发!AgentCPM-GUI通过adb操控手机教程
  • pikachu靶场通关笔记23 SQL注入06-delete注入(报错法)
  • RT_Thread——邮箱
  • Monorepo + PNPM 搭建高效多项目管理
  • 基于流形迁移学习的快速动态多目标进化算法(MMTL-MOEA/D)求解FDA1-FDA5和dMOP1-dMOP3,提供完整MATLAB代码
  • ubuntu桌面x11异常修复
  • 《安富莱嵌入式周报》第354期: 开源36通道16bit同步数据采集卡,开源PoE以太网GPIB,分体式键盘DIY,微软WSL开源,USB转车载以太网
  • 第5章 类的基本概念 笔记