DAY 30: 模块和库的导入
今天我们学习一个至关重要的话题:如何在你的项目中组织代码并使用他人的代码。这就是**模块(Module)和包(Package)/库(Library)**的导入。掌握好它,是让你从写“脚本”到构建“工程”的关键一步。
知识点回顾
- 导入官方库的三种手段:
import
,from...import...
,from...import *
。 - 导入自定义库/模块的方式:理解相对路径和绝对路径的导入。
- 导入库/模块的核心逻辑:找到项目的“根目录”是关键。
1. 导入Python的“武器库”
学习Python,本质上是学习基础语法 + 特定领域的第三方库。Python之所以强大,正是因为它拥有一个庞大且活跃的生态系统,几乎所有你能想到的任务,都有现成的库帮你完成。
类别 | 典型库 | 解决的问题 |
---|---|---|
数据分析 | pandas , numpy |
数据清洗、转换、科学计算 |
数据可视化 | matplotlib , seaborn |
绘制各种统计图表 |
机器学习 | scikit-learn |
经典的机器学习算法 |
深度学习 | TensorFlow , PyTorch |
构建和训练神经网络 |
Web开发 | Django , Flask |
搭建网站后台、API接口 |
网络爬虫 | requests , Scrapy |
从网页上抓取数据 |
所以,学习Python要有“以终为始”的思想。我们训练营的目标,就是学习借助Python掌握深度学习和机器学习必备的基础知识和相关工具。
1.1 标准导入:import ...
这是最推荐、最安全的导入方式。它将整个模块导入,并且在使用时需要加上 模块名.
前缀,代码清晰,不会造成命名冲突。
# 方式1:导入整个 math 模块
import math
print("方式1:使用 import math")
# 使用时必须加上模块名作为前缀
print(f"圆周率π的值:{math.pi}")
print(f"2的平方根:{math.sqrt(2)}\n")
1.2 按需导入:from ... import ...
当你只需要模块中的一两个函数或类时,可以使用这种方式。好处是调用时无需写前缀,代码更简洁。
# 方式2:从 math 模块中只导入 pi 和 sqrt
from math import pi, sqrt
print("方式2:使用 from math import pi, sqrt")
# 可以直接使用,无需前缀
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}\n")
# 在机器学习中非常常见
# from sklearn.model_selection import train_test_split
1.3 【不推荐】通配符导入:from ... import *
这种方式会导入模块中所有的公开成员,并且调用时无需前缀。虽然方便,但强烈不推荐在正式项目中使用,因为它会“污染”你的命名空间,极易引发命名冲突,让代码难以阅读和维护。
# 方式3:导入 math 模块中所有内容
from math import *
# 看起来很简洁,但如果其他库也有一个叫 pi 的变量,就会产生冲突
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}")
2. 创建并使用你自己的模块
当你的项目代码越来越多时,就需要把它们拆分到不同的文件中进行管理。
- 模块(Module):一个
.py
文件就是一个模块。 - 包(Package):一个包含
__init__.py
文件的文件夹就是一个包。这个包里可以包含多个模块(.py
文件)和其他子包(文件夹)。
__init__.py
的作用
这个文件(可以为空)是Python识别一个文件夹为“包”的标志。有了它,你才能从这个文件夹中导入模块。
3. 导入的核心逻辑:找到“根目录”
Python是如何找到你想要导入的模块的?它会去一个叫做 sys.path
的列表里查找路径。这个列表里包含了Python的安装目录、标准库位置,以及当前脚本运行的根目录。
理解“根目录”至关重要。通常,你在IDE(如VSCode、PyCharm)中打开的项目文件夹,就是执行代码时的根目录。
让我们通过一个场景来理解导入逻辑:
目录结构:
project_root/
├── main.py
└── utils/
├── __init__.py # 使得 utils 成为一个包
└── calculator.py
utils/calculator.py
的内容:
# utils/calculator.py
def add(a, b):
return a + b
main.py
的内容:
# main.py
# Python从根目录(project_root)开始查找
# 它看到了一个叫 utils 的包,然后进入包里找到了 calculator 模块
from utils.calculator import add
# 另一种写法:导入整个模块
# from utils import calculator
# result = calculator.add(10, 5)
result = add(10, 5)
print(f"计算结果是: {result}") # 输出: 计算结果是: 15
当你从 project_root
目录运行 python main.py
时,Python能正确找到并导入add
函数。
一个常见的错误:
如果你的终端当前在 utils
目录下,然后试图运行 python calculator.py
,而 calculator.py
中又试图导入项目根目录的其他模块,就会失败。因为此时的“根目录”变成了utils
。
解决方案:始终在项目的顶层目录(project_root
)执行你的主程序。
作业与解答
作业:自己新建几个不同路径的文件,尝试如何导入它们。
参考答案:
下面我们通过一个具体的实践来完成这个作业。
第1步:创建项目结构
首先,创建一个清晰的项目目录结构,如下所示:
my_project/
├── main_app.py
├── tools/
│ ├── __init__.py
│ ├── string_helper.py
│ └── math_helper.py
└── models/
├── __init__.py
└── user.py
my_project
是我们的项目根目录。main_app.py
是我们的主程序入口。tools
和models
是两个不同的包(因为它们都有__init__.py
)。
第2步:编写模块代码
在每个 .py
文件中写入简单的内容。
tools/math_helper.py
# tools/math_helper.py
PI = 3.14159
def multiply(a, b):
"""返回两个数的乘积"""
print(f"[math_helper] 正在计算 {a} * {b}")
return a * b
tools/string_helper.py
# tools/string_helper.py
def to_uppercase(s):
"""将字符串转换为大写"""
print(f"[string_helper] 正在转换: {s}")
return s.upper()
models/user.py
# models/user.py
class User:
"""一个简单的用户类"""
def __init__(self, name):
# 注意这里我们导入了同级包中的模块
from tools.string_helper import to_uppercase
self.name = to_uppercase(name)
def greet(self):
return f"你好, 我是 {self.name}!"
第3步:在主程序中导入并使用
现在,我们在 main_app.py
中尝试导入并使用上面定义的所有功能。
main_app.py
# main_app.py
# 导入 'tools' 包中的特定函数和变量
from tools.math_helper import multiply, PI
from tools.string_helper import to_uppercase
# 导入 'models' 包中的 User 类
from models.user import User
# --- 开始使用导入的功能 ---
# 1. 使用 tools.math_helper 中的功能
radius = 5
area = PI * (radius ** 2)
print(f"圆的面积是: {area}")
product_result = multiply(10, 4)
print(f"10 * 4 的结果是: {product_result}\n")
# 2. 使用 tools.string_helper 中的功能
upper_name = to_uppercase("python")
print(f"'python' 的大写是: {upper_name}\n")
# 3. 使用 models.user 中的功能
# 创建 User 实例时,它内部也会执行一次导入和调用
user_instance = User("Alice")
greeting = user_instance.greet()
print(greeting)
第4步:运行和验证
确保你的终端位于 my_project
这个根目录下,然后执行命令:
python main_app.py
你应该会看到以下输出:
圆的面积是: 78.53975
[math_helper] 正在计算 10 * 4
10 * 4 的结果是: 40
[string_helper] 正在转换: python
'python' 的大写是: PYTHON
[string_helper] 正在转换: alice
你好, 我是 ALICE!
这个例子完整地演示了如何在不同包和模块之间进行导入,这是构建任何复杂Python项目的基础。