模块与包
模块化编程是什么?用生活例子秒懂
想象你在搭乐高积木:
- 每个小积木块都有特定功能(比如轮子、窗户、墙壁)—— 这就像模块(一个.py 文件,封装了函数或类)。
- 把相关的积木块装进一个盒子里,方便分类和取用 —— 这就像包(一个文件夹,里面装多个模块和子包,带__init__.py 标识)。
模块化编程的核心思想是:把复杂代码拆成小而独立的 "积木",需要时直接拿来用,不用重复造轮子。
1.模块的概念
模块就是一个.py为后缀的python文件,可以被其它Python程序导入和使用,也可以自己独立运行,里面存放着的是一组相关函数或者类。
1.1模块的导入
模块的导入使用import关键字,配合from和as有以下几种用法:
导入方式 | 语法示例 | 适用场景 |
---|---|---|
导入整个模块 | import math | 需要用模块里的多个功能,用模块名.功能 调用 |
导入模块并取别名 | import numpy as np | 模块名太长(如 numpy→np),简化代码 |
导入模块中的特定功能 | from os import getcwd | 只需要模块里的 1-2 个功能,避免代码冗余 |
导入特定功能并取别名 | from datetime import datetime as dt | 功能名太长或避免冲突 |
导入模块中所有功能 | from random import * |
import会把整个文件都导入进来,而使用from后可以只导入某一个模块,节省空间
示例
# 1. 导入整个模块
import math
print(math.sqrt(16)) # 用模块名.功能调用 → 4.0# 2. 别名简化
import pandas as pd # 约定俗成的别名,大家都这么用
df = pd.DataFrame({"name": ["Alice"]}) # 用别名调用# 3. 导入特定功能
from os import getcwd, chdir
print(getcwd()) # 直接用功能名 → 输出当前目录# 4. 功能取别名
from datetime import datetime as dt
print(dt.now()) # 用别名调用 → 输出当前时间# 5. 导入所有功能(谨慎使用)
from random import *
print(randint(1, 10)) # 直接用函数名 → 随机1-10的整数
1.2模块的作用
- 令Python代码的编写不必从零开始,不要重复写‘造轮子’的过程。
- 避免同意模块内的命令冲突
- 方便代码的管理与维护,提高代码的可读性
1.3模块的分类:内置、第三方、自定义
1.3.1内置模块(系统模块)
Python解释器自带的标准库模块,可以直接导入使用,比如 keyword、os等,这些模块可直接导入而不需要安装,在所有安装了Python 解释器的电脑上都可以运行且每个py文件都会自动导入builtins模块。
特点
-
即用即导入:直接
import
即可使用。 -
性能高效:通常使用 C 语言实现。
1.3.1.1常见模块
模块 | 功能 | 官方文档 |
---|---|---|
math | 数学运算 | math --- 数学函数 — Python 3.12.10 文档 |
os | 操作系统接口 | os --- Miscellaneous operating system interfaces — Python 3.13.5 文档 |
os.path | 路径相关 | os.path --- Common pathname manipulations — Python 3.13.5 文档 |
datetime | 日期和时间 | datetime --- Basic date and time types — Python 3.13.5 文档 |
random | 随机数生成 | random --- Generate pseudo-random numbers — Python 3.13.5 文档 |
time | 时间 | time --- Time access and conversions — Python 3.13.5 文档 |
1.3.1.2方法示例
- random模块:
import random
random.randint(1, 6) # random.randint(a,b) 生产 a~b的随机整数
random.randint(1, 6)
random.random() # random.random 生成包含0 但不包含1 的浮点数
random.choice("ABCD") # 从一个序列中,随机返回一个元素
random.choice("ABCD")
L = [1, 2, 3, 6, 9]
random.choice(L)
random.shuffle(L) # random.shuffer(x) # 把列表X 打乱
print(L)
- time模块
import timetime.time() # 返回当前时间的时间戳
time.ctime() #返回当前的UTC 时间的字符串
t1 = time.localtime() # 返回当前的本地时间元组
time.sleep(3) # 让程序睡眠 n 秒
time.strftime("%Y-%m-%d", t1) # 格式化时间
time.strftime("%y-%m-%d", t1)
time.strftime('%Y-%m-%d %H:%M:%S', t1)
- os模块:
# 1. os.getcwd(): 获取当前工作目录
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)# 2. os.chdir(path): 改变当前工作目录
new_directory = "F:\\01.AI07.深度学习框架\\00.上课课件"
os.chdir(new_directory)
print("工作目录已更改为:", os.getcwd())# 3. os.listdir(path='.'): 返回指定目录下的所有文件和目录列表
directory_path = "."
files_and_dirs = os.listdir(directory_path)
print("指定目录下的文件和目录列表:", files_and_dirs)# 4. os.mkdir(path): 创建目录
new_directory = "new_folder"
os.mkdir(new_directory)
print(f"目录 '{new_directory}' 已创建")# 5. os.rmdir(path): 删除目录
directory_to_remove = "new_folder"
os.rmdir(directory_to_remove)
print(f"目录 '{directory_to_remove}' 已删除")# 6. os.remove(path): 删除文件
file_to_remove = "example.txt"
os.remove(file_to_remove)
print(f"文件 '{file_to_remove}' 已删除")
1.3.2第三方模块
1.3.2.1常见模块
模块 | 功能 | 示例 |
---|---|---|
numpy | 数值计算 | 科学运算、矩阵操作 |
pandas | 数据分析 | 数据清洗与处理 |
matplotlib | 数据可视化 | 绘制图表 |
requests | HTTP请求处理 | 爬取网页内容,调用API |
flask | Web应用框架 | 快速搭建Web服务 |
1.3.2.2使用示例
安装更新与卸载
安装 | pip install numpy pandas requests |
更新 | pip install numpy pandas requests |
卸载 | pip uninstall numpy pandas requests |
使用
- numpy 模块
import numpy as np
array = np.array([1, 2, 3])
print(array.mean()) # 输出: 平均值 2.0
- pandas 模块
import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]})
print(df)
- requests 模块:用
requests
爬取网页内容
import requests# 发送请求获取网页内容
response = requests.get("https://api.github.com") # 调用GitHub开放API# 打印结果(JSON格式)
print(response.json()) # 输出:GitHub API的返回数据(字典形式)
1.3.3自定义模块
用户根据需求自己编写的.py文件。
1.3.3.1创建模块
创建一个myutils.py
文件:
# utils.py
def add(a, b):return a + bdef greet(name):return f"Hello, {name}!"
1.3.3.2 使用模块
创建一个main.py
文件,并导入自定义模块:
# main.py
import myutilsprint(myutils.add(3, 5)) # 输出: 8
print(myutils.greet("Alice")) # 输出: Hello, Alice!
1.3.3.3 跨文件夹使用
在main.py
中:
'''
假设目录结构如下:
project/utils/__init__.pymath_utils.pymain.py
'''
from utils.math_utils import addprint(add(3, 5)) # 输出: 8
1.4模块内置变量
- __name__:用于确定模块是被直接运行还是被导入到其他模块中。当一个模 块被直接运行时,__name__的值是”__main__”,否则为模块的名称。
- __doc__:包含模块的说明性文档。
- __file__:包含模块的文件路径。
- __all__:定义一个模块中的哪些变量、函数或类可以通过from module import *导入时可以用。
- __package__:包含模块所在的包的名称。
- __dict__:包含模块的全局命名空间。
包
2.包的概念
-
作用:用于组织模块的集合,形成层次化的结构,便于管理大型项目。
-
结构:
my_package/__init__.pymodule1.pymodule2.pysubpackage/__init__.pymodule3.py
2.1__init__.py文件的主要作用:
- 标识包目录:告诉Python解释器该文件所在的目录应被视为一个包而不是一 个普通的目录。如果没有这个文件,可能会无法正常导入包内的模块。
- 执行初始化代码:在该文件中也可以存在代码,在调用该包里的模块时,该文 件里的代码也会被运行。
- 控制包的导入行为:通过__all__来控制哪些模块可以被导入,从而限制包的公 开接口,防止不需要的模块导入。
- 提供包级别的命名空间:在该文件中定义的变量和函数可以在包的其他模块中 共享。
- 批量导入模块:在该文件中可以批量导入系统模块或其他模块。
示例:
# __init__.py 文件示例# 1. 批量导入系统模块
import os
import sys
import datetime# 2. 定义包级别的变量
package_variable = "This is a package variable"# 3. 控制包的导入行为
__all__ = ['module1', 'module2']# 4. 执行初始化代码
print("Initializing mypackage")# 注意:这个代码会在包被导入时执行# 5. 导入包内的模块
from . import module1
from . import module2
2.2导入包和子包
-
使用
import
关键字可以导入包和子包,以访问其中的模块和内容。
# 同模块的导入规则import 包名 [as 包别名]import 包名.模块名 [as 模块新名]import 包名.子包名.模块名 [as 模块新名]from 包名 import 模块名 [as 模块新名]from 包名.子包名 import 模块名 [as 模块新名]from 包名.子包名.模块名 import 属性名 [as 属性新名]# 导入包内的所有子包和模块from 包名 import *from 包名.模块名 import *
示例:
# 导入包中的模块
import matplotlib.pyplot as plt# 导入子包中的模块
from sklearn.linear_model import LinearRegression
2.3第三方包的相关操作:
安装 | pip install package-name==version |
更新 | pip install –upgrade package-name |
卸载 | pip uninstall package-name |
2.4包的创建
3.模块与包的区别
模块 | 包 |
---|---|
一个Python文件 | 一个包含__init__.py 的文件夹 |
提供基本功能单元 | 用于组织多个模块 |
文件名为.py | 目录名 |
4. 解析顺序
在使用 import module_name时,Python 会按照特定顺序搜索并加载模块。
4.1 模块解析顺序
查找优先级 | 查找位置 | 说明 |
---|---|---|
1️⃣ 内置 C 扩展模块 | sys.builtin_module_names | 如 math , sys , time , os |
2️⃣ sys.modules 缓存 | sys.modules | 避免重复加载 |
3️⃣ 当前目录 | os.getcwd() | 同名文件或目录 |
4️⃣ PYTHONPATH 变量 | sys.path | 环境变量指定的路径 |
5️⃣ Python 标准库 | /usr/lib/python3.x/Lib/ | 标准 Python 库 |
6️⃣ site-packages (第三方库) | site.getsitepackages() | pip install 安装的模块 |
7️⃣ __pycache__/*.pyc | __pycache__/ | 预编译字节码 |
4.2 内置C扩展模块
最高优先级,Python 直接加载,不查找文件
4.3 sys.modules
如果模块已加载,则直接返回,避免重复导入
import sys
print(sys.modules.keys()) # 查看已加载的模块
4.4 当前目录
如果 C 扩展模块中找不到,就查找当前目录下是否有 module_name.py 或 module_name 目录
import os
print(os.getcwd()) # 查看当前目录
4.5 PYTHONPATH
如果当前目录没有该模块,则检查 $PYTHONPATH$ 环境变量中的目录
import sys
print(sys.path) # 列出所有可能的搜索路径sys.path.insert(0, "/custom/path/") # 添加路径
4.6 标准库
如果前面路径都找不到,会查找标准库中的模块。
4.7 第三方模块
最后,进入 site-packages 目录查找安装的第三方模块。
import site
print(site.getsitepackages())
4.8 __pycache__/
从__pycache__/
目录中加载 .pyc
文件,而不是重新解析 .py
文件。
你可以删除 __pycache__/
让 Python 重新编译 .py。
5.总结:模块化编程的核心价值
模块化编程让Python代码从"一团乱麻"变成"井然有序的积木":
- - 代码复用:写一次功能,到处调用,不用重复劳动。
- - 易于维护:模块独立,改一处不影响其他部分。
- - 团队协作:多人分工写不同模块,最后像拼积木一样组合。
记住:学好模块和包,是从"写脚本"到"开发项目"的关键一步。下次写代码时,试试把常用功能拆成模块——你会发现代码变得清爽又好维护!