模块化编程是什么?用生活例子秒懂
想象你在搭乐高积木:
模块化编程的核心思想是:把复杂代码拆成小而独立的 "积木",需要时直接拿来用,不用重复造轮子。
模块就是一个.py为后缀的python文件,可以被其它Python程序导入和使用,也可以自己独立运行,里面存放着的是一组相关函数或者类。
模块的导入使用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的整数
Python解释器自带的标准库模块,可以直接导入使用,比如 keyword、os等,这些模块可直接导入而不需要安装,在所有安装了Python 解释器的电脑上都可以运行且每个py文件都会自动导入builtins模块。
特点
即用即导入:直接import
即可使用。
性能高效:通常使用 C 语言实现。
模块 | 功能 | 官方文档 |
---|---|---|
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 文档 |
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)
import time
time.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)
# 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}' 已删除")
模块 | 功能 | 示例 |
---|---|---|
numpy |
数值计算 | 科学运算、矩阵操作 |
pandas |
数据分析 | 数据清洗与处理 |
matplotlib |
数据可视化 | 绘制图表 |
requests |
HTTP请求处理 | 爬取网页内容,调用API |
flask |
Web应用框架 | 快速搭建Web服务 |
安装更新与卸载
安装
|
pip install numpy pandas requests
|
更新
|
pip install numpy pandas requests
|
卸载
|
pip uninstall numpy pandas requests
|
使用
import numpy as np
array = np.array([1, 2, 3])
print(array.mean()) # 输出: 平均值 2.0
import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]})
print(df)
requests
爬取网页内容import requests
# 发送请求获取网页内容
response = requests.get("https://api.github.com") # 调用GitHub开放API
# 打印结果(JSON格式)
print(response.json()) # 输出:GitHub API的返回数据(字典形式)
用户根据需求自己编写的.py文件。
创建一个myutils.py
文件:
# utils.py
def add(a, b):
return a + b
def greet(name):
return f"Hello, {name}!"
创建一个main.py
文件,并导入自定义模块:
# main.py
import myutils
print(myutils.add(3, 5)) # 输出: 8
print(myutils.greet("Alice")) # 输出: Hello, Alice!
在main.py
中:
'''
假设目录结构如下:
project/
utils/
__init__.py
math_utils.py
main.py
'''
from utils.math_utils import add
print(add(3, 5)) # 输出: 8
作用:用于组织模块的集合,形成层次化的结构,便于管理大型项目。
结构:
my_package/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
module3.py
示例:
# __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
使用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
安装
|
pip install package-name==version
|
更新
|
pip install –upgrade package-name
|
卸载
|
pip uninstall package-name
|
模块 | 包 |
---|---|
一个Python文件 | 一个包含__init__.py 的文件夹 |
提供基本功能单元 | 用于组织多个模块 |
文件名为.py |
目录名 |
在使用 import module_name时,Python 会按照特定顺序搜索并加载模块。
查找优先级 | 查找位置 | 说明 |
---|---|---|
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__/ |
预编译字节码 |
最高优先级,Python 直接加载,不查找文件
如果模块已加载,则直接返回,避免重复导入
import sys
print(sys.modules.keys()) # 查看已加载的模块
如果 C 扩展模块中找不到,就查找当前目录下是否有 module_name.py 或 module_name 目录
import os
print(os.getcwd()) # 查看当前目录
如果当前目录没有该模块,则检查 $PYTHONPATH$ 环境变量中的目录
import sys
print(sys.path) # 列出所有可能的搜索路径
sys.path.insert(0, "/custom/path/") # 添加路径
如果前面路径都找不到,会查找标准库中的模块。
最后,进入 site-packages 目录查找安装的第三方模块。
import site
print(site.getsitepackages())
__pycache__/
从__pycache__/
目录中加载 .pyc
文件,而不是重新解析 .py
文件。
你可以删除 __pycache__/
让 Python 重新编译 .py。
模块化编程让Python代码从"一团乱麻"变成"井然有序的积木":
记住:学好模块和包,是从"写脚本"到"开发项目"的关键一步。下次写代码时,试试把常用功能拆成模块——你会发现代码变得清爽又好维护!