侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

2.3 模块包库

路小飞
2025-07-09 / 0 评论 / 0 点赞 / 1 阅读 / 7057 字

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()  # 无需前缀直接使用
模块搜索路径
  1. 当执行 import my_module 时,Python 按以下顺序查找模块:
  2. 当前执行脚本所在目录
  3. sys.path 变量包含的路径(可通过 import sys; print(sys.path) 查看)
  4. 标准库目录
  5. 第三方库安装目录(如 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 的作用
  1. 标识文件夹为包:Python 通过该文件判断一个文件夹是否为包
  2. 初始化包:导入包时会自动执行 __init__.py 中的代码
  3. 简化导入路径:通过在 __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_modulefrom my_module import func
__init__.py 的文件夹,组织多个模块或子包文件夹 + __init__.py 文件按功能分层管理模块,构建代码的层次结构。from my_package.module import funcimport my_package.sub_package
模块和包的集合,解决特定领域问题多个包/模块的组合提供完整解决方案,支持复杂场景开发(如数据分析)。import numpy as npfrom pandas import DataFrame
命名空间与作用域
  • 模块:拥有独立的命名空间,通过模块名访问内部成员(如 module.func()
  • :通过多级命名空间组织代码(如 package.module.func()
  • :通常通过约定俗成的别名简化访问(如 np.array() 而非 numpy.core.multiarray.array()
最佳实践建议
  1. 模块设计:保持功能单一,避免模块过大
  2. 包组织:按功能领域划分模块(如将数据处理、模型训练、可视化分为不同子包)
  3. 库使用:优先使用官方文档和社区推荐的导入方式(如 import pandas as pd
  4. 避免命名冲突:慎用 from module import *,使用 as 别名处理重名问题
0

评论区