上篇我们学习了模块的基础知识,本篇将继续深入讲解包的概念与使用、第三方模块的安装与管理,让你全面掌握 Python 模块化开发技能。
1. 包(Package)的概念
1.1 什么是包
包是包含模块的目录,本质上是一个特殊的文件夹,用于组织多个相关的模块。
| 对比项 | 模块 | 包 |
|---|
| 形式 | 单个 .py 文件 | 包含 __init__.py 的目录 |
| 作用 | 存放函数、类、变量 | 组织多个相关模块 |
| 导入方式 | import module_name | import package.module_name |
1.2 包的结构
一个标准的包必须包含 __init__.py 文件:
my_package/ # 包目录├── **init**.py # 包的初始化文件(必须)├── [module1.py] # 模块1├── [module2.py] # 模块2└── subpackage/ # 子包├── **init**.py└── [module3.py]
关键点:
__init__.py 文件标识该目录是一个包
可以为空,也可以包含初始化代码
1.3 创建和使用包
示例:创建一个数学工具包
# math_tools/calculator.pydef add(a, b): return a + bdef subtract(a, b): return a - bdef multiply(a, b): return a * bdef divide(a, b): if b == 0: return "错误:除数不能为0" return a / b
# math_tools/converter.pydefcelsius_to_fahrenheit(c): returnc*9/5+32defkg_to_lb(kg): returnkg*2.20462
# math_tools/__init__.pyfrom .calculatorimportadd, subtract, multiply, dividefrom .converterimportcelsius_to_fahrenheit, kg_to_lbprint("math_tools 包已加载")
在主程序中使用包:
# main.py# 方式1:导入整个模块importmath_tools.calculatorresult=math_tools.calculator.add(10, 20)print(result) # 30# 方式2:导入特定内容frommath_tools.calculatorimportsubtractresult=subtract(50, 20)print(result) # 30# 方式3:导入包中的内容(通过 __init__.py)frommath_toolsimportadd, celsius_to_fahrenheitresult1=add(5, 15)result2=celsius_to_fahrenheit(0)print(result1) # 20print(result2) # 32.0
输出:
math_tools 包已加载30302032.0
1.4 __init__.py 详解
__init__.py 是包的初始化文件,在导入包时自动执行。
作用一:包的初始化
# my_package/__init__.pyprint("包正在初始化...")from .module1importfunc1from .module2importfunc2print("初始化完成")
# main.pyimportmy_package # 自动执行 __init__.py# 输出:包正在初始化... 初始化完成
作用二:控制导入内容(使用 __all__)
# my_package/__init__.pydefpublic_func(): passdef_private_func(): pass# 只有 __all__ 中的内容会被导入__all__= ['public_func']
# main.pyfrommy_packageimport*public_func() # ✓ 可以使用_private_func() # ✗ 报错
1.5 导入方式详解
绝对导入(推荐)
# main.py - 绝对导入fromutils.helperimportsome_functionimportutils.helper
相对导入(仅包内使用)
# utils/helper.py 中的相对导入from . importother_module # . 表示当前包from .. importmain_module # .. 表示上级包from ... importtop_module # 上两级
2. 第三方模块
2.1 什么是第三方模块
第三方模块是别人写好的具有特殊功能的模块,需要通过 pip 安装后才能使用。
| 模块类型 | 说明 | 示例 |
|---|
| 内置模块 | Python 自带,无需安装 | os、random、math |
| 第三方模块 | 需要通过 pip 安装 | numpy、pandas、requests |
| 自定义模块 | 自己编写的模块 | calculator.py |
2.2 pip 详解
pip 是 Python 的包管理工具。
常用命令:
pip -V # 查看版本pip list # 查看已安装的模块pip install numpy # 安装模块pip install numpy==1.24.3 # 安装指定版本pip uninstall numpy # 卸载模块pip show numpy # 查看模块信息python -m pip install --upgrade pip # 更新 pip
2.3 国内镜像源
由于网络原因,直接从 PyPI 下载可能很慢,可以使用国内镜像源。
临时使用:
pip install numpy -i https://mirrors.aliyun.com/pypi/simple/
永久配置:
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
2.4 常用第三方模块示例
示例一:requests(HTTP 请求)
import requests# 发送 GET 请求response=requests.get('https://www.baidu.com')print(f"状态码:{response.status_code}")# 发送 POST 请求data= {'username': 'admin', 'password': '123456'}response=requests.post('https://example.com/login', data=data)
示例二:numpy(数值计算)
import numpy as np# 创建数组arr=np.array([1, 2, 3, 4, 5])print(f"数组:{arr}")print(f"求和:{arr.sum()}")print(f"均值:{arr.mean()}")# 创建二维数组matrix=np.array([[1, 2, 3], [4, 5, 6]])print(f"形状:{matrix.shape}")
输出:
数组:[1 2 3 4 5]求和:15均值:3.0形状:(2, 3)
示例三:pandas(数据分析)
import pandas as pd# 创建数据框data= { '姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 35], '工资': [5000, 8000, 12000]}df=pd.DataFrame(data)print(df)print(df.describe())
示例四:flask(Web 框架)
from flask import Flaskapp=Flask(__name__)@app.route('/')defhello(): return'Hello, World!'if__name__=='__main__': app.run(debug=True)
2.5 常用第三方模块一览
| 模块名称 | 用途 | 安装命令 |
|---|
| requests | HTTP 请求库 | pip install requests |
| numpy | 数值计算 | pip install numpy |
| pandas | 数据分析 | pip install pandas |
| flask | Web 框架 | pip install flask |
| django | Web 框架 | pip install django |
| matplotlib | 数据可视化 | pip install matplotlib |
| selenium | 自动化测试 | pip install selenium |
| opencv-python | 计算机视觉 | pip install opencv-python |
| scikit-learn | 机器学习 | pip install scikit-learn |
3. 常见问题解决
3.1 pip 版本过旧
python -m pip install --upgrade pip
3.2 安装失败
# 使用镜像安装pip install numpy -i https://mirrors.aliyun.com/pypi/simple/
3.3 模块导入失败
# 确认模块已安装import sysprint(sys.modules.keys()) # 查看已导入的模块
3.4 虚拟环境
# 创建虚拟环境python -m venv myenv# 激活(Windows)myenv\Scripts\activate# 激活(Mac/Linux)source myenv/bin/activate# 在虚拟环境中安装模块pip install numpy pandas# 退出deactivate
本篇总结
| 知识点 | 核心内容 |
|---|
| 包的概念 | 包含 __init__.py 的目录,用于组织模块 |
| 包的结构 | __init__.py + 模块文件 + 子包 |
| 导入方式 | 绝对导入(推荐)、相对导入(包内使用) |
| 第三方模块 | 需要通过 pip 安装的模块 |
| pip 命令 | install、uninstall、list、show |
| 镜像源 | 阿里云、豆瓣、清华大学镜像 |
| 虚拟环境 | 隔离不同项目的依赖,避免冲突 |
实战项目:构建完整的学生管理系统
student_system/├── __init__.py├── student.py├── course.py└── main.py
# student_system/student.pyclass Student: def __init__(self, student_id, name, age): self.student_id = student_id self.name = name self.age = age self.courses = [] def add_course(self, course): self.courses.append(course) def info(self): return f"学号: {self.student_id}, 姓名: {self.name}, 年龄: {self.age}"# student_system/course.pyclass Course: def __init__(self, course_id, name, credits): self.course_id = course_id self.name = name self.credits = credits def info(self): return f"课程号: {self.course_id}, 课程名: {self.name}, 学分: {self.credits}"# student_system/__init__.pyfrom .student import Studentfrom .course import Course__all__ = ['Student', 'Course']# student_system/main.pyfrom student_system import Student, Course# 创建学生和课程s1 = Student("001", "张三", 20)c1 = Course("C001", "Python 基础", 3)# 选课s1.add_course(c1)# 打印信息print(s1.info())print(c1.info())
输出:
学号:001,姓名:张三,年龄:20课程号:C001,课程名:Python 基础,学分:3
📌 恭喜你!Python 模块与包的完整知识已经学完!建议收藏并动手实践!