8.1 打卡 DAY 30: 模块和库的导入

发布于:2025-08-02 ⋅ 阅读:(9) ⋅ 点赞:(0)

DAY 30: 模块和库的导入

今天我们学习一个至关重要的话题:如何在你的项目中组织代码并使用他人的代码。这就是**模块(Module)包(Package)/库(Library)**的导入。掌握好它,是让你从写“脚本”到构建“工程”的关键一步。

知识点回顾

  1. 导入官方库的三种手段import, from...import..., from...import *
  2. 导入自定义库/模块的方式:理解相对路径和绝对路径的导入。
  3. 导入库/模块的核心逻辑:找到项目的“根目录”是关键。

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 是我们的主程序入口。
  • toolsmodels 是两个不同的包(因为它们都有 __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项目的基础。

@浙大疏锦行


网站公告

今日签到

点亮在社区的每一天
去签到