2.3.1 模块(Module)
模块是什么
- 模块是 Python 中最小的代码组织单元,每个
.py后缀的文件都可视为一个独立模块。 - 它的核心作用是封装变量、函数、类等代码片段,通过
import语句导入后,可在其他程序中复用这些代码。
核心特点
- 物理形态为单个 Python 文件(
.py)。 - 导入方式为
import 模块名或from 模块名 import 内容。 - 功能定位是提供特定工具(如单个功能函数、一组相关变量等)。
使用方法
# 方法1:导入模块中的特定函数/变量/类
from my_module import my_function, my_variable, MyClass
# 直接调用函数/使用变量/创建类实例
my_function()
print(my_variable)
obj = MyClass()
# 方法2:导入整个模块(推荐命名空间隔离)
import my_module
# 通过"模块名.成员名"调用
my_module.my_function()
print(my_module.my_variable)
obj = my_module.MyClass()
# 方法3:导入模块并自定义别名(适合长模块名)
import very_long_module_name as vlmn
vlmn.some_function()
# 方法4:导入模块中所有内容(不推荐,可能导致命名冲突)
from my_module import *
my_function() # 无需前缀直接使用
模块搜索路径
- 当执行
import my_module时,Python 按以下顺序查找模块: - 当前执行脚本所在目录
sys.path变量包含的路径(可通过import sys; print(sys.path)查看)- 标准库目录
- 第三方库安装目录(如
site-packages)
__name__ 属性
每个模块都有一个内置属性 __name__,其值取决于模块的使用方式:
- 当模块作为主程序直接运行时,
__name__值为'__main__' - 当模块被其他程序导入时,
__name__值为模块文件名(不含.py)
常见用法:
# example_module.py
def main():
print("模块作为主程序运行")
if __name__ == '__main__':
main() # 仅在直接运行时执行
else:
print("模块被其他程序导入")
2.3.2 包(Package)
包是什么
- 包是由文件夹构成的代码组织单元,用于存放多个相关模块或子包。
- 必须包含一个特殊文件
__init__.py(即使为空文件),以此标识该文件夹是 Python 可识别的包。 - 其核心价值是通过层次结构整合模块,让代码组织更清晰。
核心特点
- 物理形态为包含
__init__.py的文件夹,文件夹名称即包名。 - 内部可嵌套模块(
.py文件)或子包(含__init__.py的子文件夹)。 - 需通过多层路径导入(如
from 包名.模块名 import 内容)。
使用方法
# 使用方法1:导入包内特定模块的特定内容
from my_package.math_operations import multiply
result = multiply(4, 5)
# 使用方法2:导入整个模块,通过"模块名.成员名"调用
from my_package import math_operations
result = math_operations.multiply(4, 5)
# 使用方法3:导入子包中的模块
from my_package.sub_package import utils
utils.some_function()
# 使用方法4:导入包本身(需配合__init__.py暴露内容)
import my_package
my_package.some_function() # 需在__init__.py中定义或导入
__init__.py 的作用
- 标识文件夹为包:Python 通过该文件判断一个文件夹是否为包
- 初始化包:导入包时会自动执行
__init__.py中的代码 - 简化导入路径:通过在
__init__.py中预导入内容,可以缩短导入语句
示例 __init__.py:
# my_package/__init__.py
from .math_operations import multiply # 让 multiply 可通过包直接访问
from .sub_package import utils # 暴露子包中的模块
__version__ = '1.0.0' # 包版本信息
相对导入
在包内部的模块中,可以使用相对路径导入其他模块:
# my_package/sub_package/another_module.py
from ..math_operations import multiply # 从父包导入模块
from .utils import helper_function # 从当前子包导入模块
2.3.3 库(Library)
库是什么
库是一个更宽泛的概念,指一组模块或包的集合,针对特定领域问题提供完整功能支持,可在不同项目中重复使用。
- 组成单位:可能包含多个模块、多个包,或模块与包的混合体。
- 应用场景:聚焦解决某类问题(如数据分析、Web 开发、机器学习等)。
核心特点
- 规模更大:是多个模块/包的组合,形成完整工具链。
- 领域性强:针对特定场景设计(如 NumPy 专注科学计算,Django 专注 Web 开发)。
- 安装便捷:多数第三方库可通过 PyPI(Python 包索引)和
pip工具安装。
使用方法
# 1. 安装库(使用pip命令)
# 在终端中执行:
# pip install numpy pandas matplotlib
# 2. 导入并使用库
import numpy as np # 导入库并起别名
import pandas as pd # 行业惯例别名
from matplotlib import pyplot as plt # 导入子模块
# 使用NumPy创建数组
arr = np.array([1, 2, 3])
# 使用Pandas处理数据
data = {'name': ['Alice', 'Bob'], 'age': [25, 30]}
df = pd.DataFrame(data)
# 使用Matplotlib绘图
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
# 3. 查看库文档和版本
print(np.__version__) # 查看版本
help(np.array) # 查看函数帮助文档
虚拟环境(推荐实践)
为避免不同项目依赖冲突,建议使用虚拟环境:
# 创建虚拟环境
python -m venv myenv
# 激活虚拟环境(Windows)
myenv\Scripts\activate
# 激活虚拟环境(Linux/macOS)
source myenv/bin/activate
# 在虚拟环境中安装库
pip install numpy
# 退出虚拟环境
deactivate
2.3.4 三者的关系
核心区别和重点
| 术语 | 定义 | 物理结构 | 主要用途 | 导入示例 |
|---|---|---|---|---|
| 模块 | 单个 .py 文件,封装基础功能 | 单一 Python 文件(.py) | 封装独立功能,作为代码复用的最小单位。 | import my_module 或 from my_module import func |
| 包 | 含 __init__.py 的文件夹,组织多个模块或子包 | 文件夹 + __init__.py 文件 | 按功能分层管理模块,构建代码的层次结构。 | from my_package.module import func 或 import my_package.sub_package |
| 库 | 模块和包的集合,解决特定领域问题 | 多个包/模块的组合 | 提供完整解决方案,支持复杂场景开发(如数据分析)。 | import numpy as np 或 from pandas import DataFrame |
命名空间与作用域
- 模块:拥有独立的命名空间,通过模块名访问内部成员(如
module.func()) - 包:通过多级命名空间组织代码(如
package.module.func()) - 库:通常通过约定俗成的别名简化访问(如
np.array()而非numpy.core.multiarray.array())
最佳实践建议
- 模块设计:保持功能单一,避免模块过大
- 包组织:按功能领域划分模块(如将数据处理、模型训练、可视化分为不同子包)
- 库使用:优先使用官方文档和社区推荐的导入方式(如
import pandas as pd) - 避免命名冲突:慎用
from module import *,使用as别名处理重名问题
评论区