第二十九天打卡
@浙大疏锦行
模块和库的导入
1. 导入官方库的三种手段
2. 导入自定义库/模块的方式
3. 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致)
导入官方库的三种手段
方式一:用import直接导入整个模块
 代码示例:
import math
print(math.sqrt(16))  # 计算16的平方根
运行结果:
4.0
运行步骤解析:
- import math这行代码,会把 Python 的- math库整个加载到当前程序里。
- 当执行math.sqrt(16)时,程序会去math模块里寻找sqrt函数,接着调用该函数进行计算。
2. 使用 from ... import ... 导入模块中的特定内容
 
这种方式可以直接导入模块中的函数、类或变量,使用时无需加模块前缀。
from random import randint, choice# 生成 1 到 10 之间的随机整数
random_number = randint(1, 10)
print(random_number)  # 可能输出 1 到 10 之间的任意整数# 从列表中随机选择一个元素
fruits = ["apple", "banana", "cherry"]
random_fruit = choice(fruits)
print(random_fruit)  # 可能输出 "apple"、"banana" 或 "cherry"
运行步骤解释:
- from random import randint, choice:从- random模块中导入- randint和- choice两个函数。
- randint(1, 10):直接调用- randint函数生成随机整数。
- choice(fruits):直接调用- choice函数从列表中随机选择元素。
3. 使用 import ... as ... 为模块指定别名
 
当模块名较长或可能与当前代码中的名称冲突时,可以使用别名简化调用。
import pandas as pd
import numpy as np# 创建一个简单的 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)# 创建一个 numpy 数组并计算平均值
arr = np.array([1, 2, 3, 4, 5])
print(np.mean(arr))  # 输出 3.0
运行步骤解释:
- import pandas as pd:导入- pandas模块并指定别名为- pd。
- import numpy as np:导入- numpy模块并指定别名为- np。
- pd.DataFrame(data):使用- pandas的- DataFrame类创建表格数据。
- np.array([1, 2, 3, 4, 5]):使用- numpy创建数组,并调用- np.mean()计算平均值。
导入自定义库/模块的方式
一、导入同级目录下的模块
如果自定义模块与主程序在同一目录下,可以直接导入。
my_project/
├── main.py
└── utils.py
utils.py 内容:
# utils.py
def add(a, b):return a + bdef multiply(a, b):return a * b
main.py 内容:
# main.py
import utilsresult1 = utils.add(3, 4)
result2 = utils.multiply(2, 5)print(result1)  # 输出 7
print(result2)  # 输出 10
运行步骤解释:
- 创建模块:在 utils.py中定义了两个函数add和multiply。
- 导入模块:在 main.py中使用import utils导入同级目录下的utils.py。
- 调用函数:通过 utils.add()和utils.multiply()调用模块中的函数。
二、导入子目录中的模块(作为包)
如果自定义模块位于子目录中,需要创建 __init__.py 文件将其声明为包。
文件结构:
my_project/
├── main.py
└── mypackage/├── __init__.py  # 空文件,声明该目录是一个包└── math_utils.py
math_utils.py 内容:
# math_utils.py
def square(x):return x ** 2def cube(x):return x ** 3
main.py 内容:
python
运行
# main.py
from mypackage import math_utilsresult1 = math_utils.square(5)
result2 = math_utils.cube(3)print(result1)  # 输出 25
print(result2)  # 输出 27
运行步骤解释:
- 创建包:在 mypackage目录下创建空的__init__.py文件(Python 3.3+ 允许省略,但建议保留)。
- 定义模块:在 math_utils.py中编写功能函数。
- 导入模块:使用 from mypackage import math_utils导入子目录中的模块。
- 调用函数:通过 math_utils.square()调用模块中的函数。
三、使用相对导入(在包内部)
如果需要在包内部的模块之间相互导入,可以使用相对导入。
文件结构:
my_project/
├── main.py
└── mypackage/├── __init__.py├── math_utils.py└── stats.py
math_utils.py 内容:
# math_utils.py
def square(x):return x ** 2
stats.py 内容:
# stats.py
from .math_utils import square  # 相对导入def mean_square(numbers):return [square(n) for n in numbers]
main.py 内容:
# main.py
from mypackage.stats import mean_squareresult = mean_square([1, 2, 3])
print(result)  # 输出 [1, 4, 9]
运行步骤解释:
- 相对导入:在 stats.py中使用from .math_utils import square导入同级模块。
- .表示当前包:相对导入中的- .表示当前包目录。
- 避免直接运行包内模块:相对导入只能在包内部使用,直接运行 stats.py会报错,需通过主程序导入调用。
四、导入上级目录或其他目录的模块
如果需要导入不在当前目录或子目录中的模块,可以临时修改 sys.path。
文件结构:
my_project/
├── main.py
├── utils/
│   └── string_utils.py
└── helpers/└── date_utils.py
string_utils.py 内容:
# string_utils.py
def capitalize_words(text):return ' '.join(word.capitalize() for word in text.split())
main.py 内容:
# main.py
import sys
from pathlib import Path# 将上级目录的 utils 文件夹添加到模块搜索路径
sys.path.append(str(Path(__file__).parent.parent / 'utils'))from string_utils import capitalize_wordsresult = capitalize_words("hello world")
print(result)  # 输出 "Hello World"
运行步骤解释:
- 修改搜索路径:使用 sys.path.append()将utils目录添加到模块搜索路径。
- 动态路径处理:通过 Path(__file__).parent.parent获取上级目录,确保路径在不同环境下都能正常工作。
- 导入模块:直接导入 string_utils模块并使用其功能。
