第二十九天打卡
@浙大疏锦行
模块和库的导入
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
模块并使用其功能。