Day 30:模块和库的导入
一、Python库的分类与选择
在开始学习导入之前,我们先了解一下Python生态中的主要库类型:
类别 | 典型库 | 解决的问题 | 学习门槛 |
---|---|---|---|
基础工具 | os 、sys 、json | 操作系统交互、序列化数据(如读写 JSON 文件) | 低 |
科学计算 | numpy 、scipy | 数值计算、线性代数、信号处理 | 中 |
数据分析 | pandas 、matplotlib | 数据清洗、转换、可视化(如绘制折线图、柱状图) | 中 |
Web 开发 | Django 、Flask | 快速搭建 Web 应用(如网站后台、API 接口) | 中高 |
机器学习 | scikit-learn 、TensorFlow | 机器学习算法(分类、回归、深度学习) | 高 |
自动化脚本 | pyautogui 、pytest | 自动化测试、桌面操作自动化(如模拟鼠标键盘操作) | 低 |
网络爬虫 | requests 、Scrapy | 从网页提取数据(需注意反爬机制和法律合规) | 中 |
核心原则:按需学习,用到什么学什么库即可。
二、导入官方库的三种方式
2.1 标准导入:导入整个库
这是最基本也是最常见的导入方式,使用import
语句导入整个模块。
# 方式1:导入整个模块
import mathprint("方式1:使用 import math")
print(f"圆周率π的值:{math.pi}")
print(f"2的平方根:{math.sqrt(2)}")
特点:
- 需要使用
库名.函数名
的方式调用 - 命名空间清晰,不会造成污染
- 适合需要使用库中多个功能的场景
2.2 从库中导入特定项
当只需要使用库中的特定函数或变量时,可以使用from...import
语法。
# 方式2:导入特定的函数或变量
from math import pi, sqrtprint("方式2:使用 from math import pi, sqrt")
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}")
特点:
- 可以直接使用函数名,无需前缀
- 节省内存,只导入需要的部分
- 适合大型库如sklearn:
from sklearn.model_selection import train_test_split
2.3 导入库中所有内容(不推荐)
使用from...import *
可以导入库中所有公开的函数和变量。
from math import *print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}")
注意事项:
- 命名空间污染:可能与其他库的函数名冲突
- 可维护性差:难以判断函数来源
- 一般不推荐使用,除非在交互式环境中快速测试
三、模块与包的概念
3.1 基本定义
模块(Module)
- 本质:以
.py
结尾的单个文件,包含Python代码(函数、类、变量等) - 作用:将代码拆分到不同文件中,避免代码冗余,方便复用和维护
包(Package)
- 本质:有层次的文件目录结构(即文件夹),用于组织多个模块和子包
- 核心特征:包的根目录下必须包含一个
__init__.py
文件(可以为空),用于标识该目录是一个包 - 注意:在Python中,包就是库
3.2 实际案例
让我们通过一个计算圆面积的例子来理解模块的使用:
创建模块文件 circle.py
:
# circle.py
import mathdef calculate_area(radius):return math.pi * radius ** 2
四、不同目录结构下的导入方式
理解Python的导入机制核心在于:找到根目录。IDE通常会将项目文件夹设为根目录,Python从这个根目录开始查找模块。
4.1 场景1:同一目录下的导入
目录结构:
项目根目录/
├── main.py
└── circle.py
main.py 内容:
# main.py
from circle import calculate_area
# 或者: import circle (然后用 circle.calculate_area)radius = 5
area = calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")
运行方式:
python main.py
4.2 场景2:子目录中的导入
目录结构:
项目根目录/
└── model/├── __init__.py (推荐添加)├── main.py└── circle.py
model/main.py 内容:
# model/main.py
from circle import calculate_arearadius = 5
area = calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")
运行方式:
# 方式1:
python model/main.py# 方式2:
cd model
python main.py
4.3 场景3:跨目录导入
目录结构:
项目根目录/
├── main.py
└── model/├── __init__.py (必需添加)└── circle.py
main.py 内容:
# main.py
from model.circle import calculate_area
# 或者: from model import circle (然后用 circle.calculate_area)radius = 5
area = calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")
运行方式:
python main.py
4.4 场景4:复杂目录结构
目录结构:
项目根目录/
├── circle2.py
├── utils/
│ ├── __init__.py
│ └── circle.py
└── model/└── main.py
运行方式:
python -m model.main
注意:使用python -m model.main
而不是python model/main.py
,因为前者会将当前目录添加到sys.path
的开头。
五、源代码查看与文档学习
5.1 纯Python库
对于纯Python编写的库,可以通过以下方式查看源代码:
- 在IDE中按住
Ctrl
点击函数名 - 使用调试器逐步查看函数内部实现
5.2 C++编写的库(如OpenCV)
许多高性能库(如OpenCV、NumPy等)的核心是用C++编写的:
特点:
- 二进制文件:预先编译好的机器语言,无法直接查看源代码
- 接口封装:Python中只能看到函数接口,不能看到实现细节
- 性能优势:C++实现提供更好的性能
- 知识产权保护:二进制形式保护了源代码
学习策略:
- 查看官方文档:这是最重要的学习资源
- GitHub仓库:查看开源库的C++源代码
- API说明书:理解函数参数和返回值
六、知识点回顾
6.1 导入官方库的三种方式
- 标准导入:
import math
- 导入整个库,使用时需加前缀 - 特定导入:
from math import pi, sqrt
- 只导入需要的部分 - 全部导入:
from math import *
- 导入所有内容(不推荐)
6.2 导入自定义库/模块的方式
- 同目录:直接
import 模块名
- 子目录:需要
__init__.py
文件,使用包路径导入 - 跨目录:使用完整的包路径,如
from model.circle import function
6.3 导入的核心逻辑
- 根目录识别:Python从项目根目录开始查找模块
- 路径问题:注意Python解释器的工作目录与终端目录可能不一致
- 运行方式:选择合适的运行命令(
python file.py
vspython -m module.main
)
@浙大疏锦行