Python模块化编程:高效代码组织技巧

模块化编程的概念

模块化编程是一种将程序分解为独立,可重用的"模块"(Module)的编程思想,通过合理划分代码结构,实现**“高内聚,低耦合”** 的设计目标。在Python中,包和模块是代码组织和管理的重要概念。这种思想能显著提升代码的可读性,可复用性和可维护性,是现代编程中广泛采用的核心范式之一。

1.模块(Module)

1.1 基本概念

  • **定义:**模块是一个独立的代码文件(如Python的.py文件、Java的.java文件等),每个文件就是一个模块。包含函数、类、变量等代码单元,可被其他程序导入并使用。

  • 作用:

    • 高内聚
      模块内部的代码紧密相关,专注于实现单一功能(如一个模块只处理文件读写,另一个只处理数据计算),避免功能混杂。

    • 低耦合
      模块之间的依赖关系尽可能简单,通过清晰的接口(如函数参数、返回值)通信,修改一个模块时不会对其他模块造成大规模影响。

    • 模块化编程的优势

      1. 代码复用
        编写一次模块后,可在多个程序中通过导入重复使用,避免重复编码。例如,一个处理日期格式化的模块,可在多个项目中直接调用。

      2. 便于维护
        模块独立划分后,定位和修复 bug 更简单。例如,若数据计算出错,只需检查负责计算的模块,无需通读整个程序。

      3. 协作开发
        多人开发时,可按模块分工(如 A 开发用户认证模块,B 开发数据存储模块),减少代码冲突,提高开发效率。

      4. 降低复杂度
        将大型程序分解为多个小模块,每个模块专注解决一个子问题,降低单个文件的代码量和逻辑复杂度。

      5. 命名空间隔离
        不同模块的同名函数 / 变量不会冲突(通过模块名区分)。例如,moduleA.add()moduleB.add() 可共存。

1.2 快速上手

1.2.1模块定义:一个 .py 文件即为一个模块,可通过 import 导入。创建一个calculator.py
# 模块:calculator.py
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b
1.2.2 导入模块
  • 语法:

    1. import 模块名 [as 模块新名字]

    导入整个模块,并将其作为一个对象引入当前程序的命名空间。通过 “模块名。属性” 的方式使用模块内的功能(如函数、类、变量)。

    2. from 模块名 import 模块属性名 [as 属性新名]

    只导入模块中指定的部分属性(如特定函数、类),直接将这些属性引入当前命名空间,可直接使用属性名调用。

    3. from 模块名 import *

    导入模块中所有公开属性(受模块内 __all__ 限制),直接引入当前命名空间,可直接使用属性名调用。

模块导入:使用 importfrom...import 语句调用模块中的功能。

# 主程序:main.py
import calculator  # 导入整个模块
print(calculator.add(2, 3))  # 输出:5

from calculator import multiply  # 导入模块中的特定函数
print(multiply(2, 3))  # 输出:6
1.2.3 内部属性

__file____name__ 的对比表

属性 作用 主模块(直接运行)时的值 被导入模块时的值
__file__ 存储模块的路径 模块的绝对路径(如 D:/a.py 模块的绝对路径(如 D:/a.py
__name__ 标识模块的名称 '__main__' 模块文件名(如 'a'

总结

  • __file__ 是模块的 “位置身份证”,用于获取模块的路径信息,方便动态处理文件。
  • __name__ 是模块的 “身份标识”,核心作用是通过 if __name__ == '__main__' 区分模块的运行方式,实现 “测试代码隔离”。

1.3 模块的分类

在 Python 中,模块根据其来源和性质可分为三类:内置模块标准库模块第三方模块,此外还包括用户自定义的模块。以下是详细分类及示例:

1.3.1 内置模块(Built-in Modules)

特点

  • 直接编译到 Python 解释器中,无需额外导入即可使用。
  • 提供最基础的功能(如 print()len()type() 等内置函数)
# 无需导入即可使用
print(len([1, 2, 3]))  # 使用内置函数 len()
x = 10
print(type(x))  # 使用内置函数 type()
1.3.2 标准库模块(系统模块)

特点

  • 即用即导入随 Python 安装包一起提供,无需额外安装,直接通过 import 使用。

  • 覆盖广泛领域:文件操作、网络通信、数据处理、多线程等。

  • 性能高效:通常使用 C 语言实现。

    模块名称 所属类别 核心功能 官方文档链接
    math 数学计算 提供三角函数(sincos)、对数函数(log)、常量(pie)等基础数学运算。 math 模块文档
    os 文件操作 与操作系统交互,如创建目录(mkdir)、删除文件(remove)、获取环境变量(environ)等。 os 模块文档
    os.path 文件操作 处理路径相关功能,如路径拼接(join)、判断路径是否存在(exists)、获取文件名(basename)等。 os.path 模块文档
    datetime 日期时间 提供 datetimedatetime 类,用于时间创建、格式化(strftime)、时间差计算(timedelta)等。 datetime 模块文档
    random 数学计算 生成随机数(random)、随机选择(choice)、打乱序列(shuffle)等。 random 模块文档
    time 日期时间 提供时间戳(time)、休眠(sleep)、时间格式化(strftime)等底层时间功能。 time 模块文档
    shutil 文件操作 高级文件操作,如递归复制目录(copytree)、移动文件(move)、删除目录树(rmtree)等。 shutil 模块文档
    collections 数据结构 提供 OrderedDict(有序字典)、defaultdict(默认值字典)、deque(双端队列)等扩展数据类型。 collections 模块文档
    json 序列化 实现 JSON 数据的编码(dumps)和解码(loads),用于数据交换。 json 模块文档
    unittest 测试调试 Python 内置的单元测试框架,支持测试用例编写、断言(assertEqual)、测试套件管理等。 unittest 模块文档
    socket 网络通信 底层网络编程接口,用于实现 TCP/UDP 协议的客户端和服务器端通信。 socket 模块文档
    urllib 网络通信 处理 URL 相关操作,如发送 HTTP 请求(urllib.request)、解析 URL(urllib.parse)等。 urllib 模块文档

一、random模块

✅ 1. 基本随机数生成

函数 说明 示例
random() 生成 [0.0, 1.0) 之间的随机小数 random.random()
uniform(a, b) 生成 [a, b] 之间的随机小数 random.uniform(1, 10)
randint(a, b) 生成 [a, b] 之间的随机整数 random.randint(1, 10)
randrange(start, stop[, step]) 从范围内生成随机整数(不含 stop) random.randrange(0, 10, 2)

✅ 2. 序列相关操作

函数 说明 示例
choice(seq) 从序列中随机选择一个元素 random.choice(['a', 'b', 'c'])
choices(seq, k=n) 从序列中随机选择 n 个元素(可重复) random.choices([1, 2, 3], k=2)
sample(seq, k=n) 从序列中随机选取 n 个元素(不重复) random.sample(range(10), 3)
shuffle(seq) 将序列就地随机打乱 random.shuffle(my_list)

✅ 3. 分布函数

函数 分布类型 示例
betavariate(alpha, beta) Beta 分布 random.betavariate(0.5, 0.5)
expovariate(lambd) 指数分布 random.expovariate(1.5)
gammavariate(alpha, beta) Gamma 分布 random.gammavariate(2, 3)
gauss(mu, sigma) 高斯(正态)分布 random.gauss(0, 1)
normalvariate(mu, sigma) 正态分布 random.normalvariate(0, 1)
lognormvariate(mu, sigma) 对数正态分布 random.lognormvariate(0, 1)
triangular(low, high, mode) 三角分布 random.triangular(0, 10, 5)
vonmisesvariate(mu, kappa) 冯·米塞斯分布 random.vonmisesvariate(0, 4)
weibullvariate(alpha, beta) Weibull 分布 random.weibullvariate(1, 1.5)

✅ 4. 种子与状态控制

函数 说明 示例
seed(a=None) 初始化随机数种子(可复现) random.seed(42)
getstate() 获取当前内部状态 state = random.getstate()
setstate(state) 恢复之前保存的状态 random.setstate(state)

案例1:random综合小案例:

import random

# 1️⃣ 设置随机种子,保证结果可复现
random.seed(42)

# 2️⃣ 模拟随机抽奖
participants = ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"]
winnner = random.choice(participants)
print(f"中奖者是:{winnner}")

# 3️⃣ 打乱名单,抽取3人二等奖(不重复)
participants.remove(winner)
random.shuffle(participants)
second_prize = random.sample(participants, 3)
print(f"二等奖名单为:{second_prize}")

# 4️⃣ 模拟生成10个正态分布的随机分数(均值为80,标准差为5)
scores = [round(random.gauss(80, 5), 2) for _ in range(10)]
print(f"生成的10个正态分布的随机分数为:{scores}")

Python模块化编程:高效代码组织技巧_第1张图片

案例2:密码生成器(random模块,time模块

import random
import time

# 生成n为数字密码
def generate_digit_password(length):
    password = ''
    for _ in range(length):
        digit = random.randint(0,9)
        password += str(digit)
    return password

# 生成n位混合密码
def generate_mixed_password(length):
    password = ''
    chars = '@!#$%^&*()_+/-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    for _ in range(length):
        char = random.choice(chars)
        password += char
    return password

print("密码生成中...")
time.sleep(2)
# password = generate_digit_password(4)
password = generate_mixed_password(8)
print("密码已生成:", password)
密码生成中...
密码已生成: bI_4xG7k

或者使用用时间戳+随机种子生成密码

import random
import time

def generate_password_with_timestamp(length):
    chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    # 使用当前时间戳作为随机种子
    timestamp = int(time.time() * 1000)  # 毫秒级时间戳
    random.seed(timestamp)  
    
    password = ''.join(random.choice(chars) for _ in range(length))
    return password

# 示例
print("基于时间戳的随机密码:", generate_password_with_timestamp(12))
基于时间戳的随机密码: QouBvhRhuCT1

time模块:

import time

# 获取当前时间的时间戳(秒)
timestamp = time.time()
print(f"返回当前时间的时间戳: {timestamp}")

# 获取当前本地时间的字符串表示
local_time_str = time.ctime()
print(f"返回当前的本地时间字符串: {local_time_str}")

# 获取当前本地时间的时间元组
local_time_tuple = time.localtime()
print(f"返回当前的本地时间元组: {local_time_tuple}")

# 暂停 2 秒
time.sleep(2)

# 格式化时间为 "年-月-日"
formatted_date = time.strftime("%Y-%m-%d", time.localtime())
print(f"格式化后的日期: {formatted_date}")

# 格式化时间为 "年-月-日 时:分:秒"
formatted_datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f"格式化后的完整时间: {formatted_datetime}")

返回当前时间的时间戳: 1752838056.9255471
返回当前的本地时间字符串: Fri Jul 18 19:27:36 2025
返回当前的本地时间元组: time.struct_time(tm_year=2025, tm_mon=7, tm_mday=18, tm_hour=19, tm_min=27, tm_sec=36, tm_wday=4, tm_yday=199, tm_isdst=0)
格式化后的日期: 2025-07-18
格式化后的完整时间: 2025-07-18 19:27:38

OS模块

✅ 常用的 os 模块 API

函数 功能
os.getcwd() 获取当前工作目录
os.chdir(path) 改变当前工作目录
os.listdir(path) 列出指定目录下的文件和文件夹
os.mkdir(path) 创建单层目录
os.makedirs(path) 创建多层目录
os.rmdir(path) 删除空目录
os.removedirs(path) 递归删除空目录
os.remove(path) 删除文件
os.rename(src, dst) 重命名文件或目录
os.path.exists(path) 判断路径是否存在
os.path.isfile(path) 判断是否是文件
os.path.isdir(path) 判断是否是目录
os.path.abspath(path) 获取绝对路径
os.path.join(a, b) 拼接路径(跨平台推荐用)
os.environ 获取环境变量字典
os.system(cmd) 运行系统命令
import os

# 获取当前工作目录
print("当前工作目录:", os.getcwd())

# 如果 test_dir 目录存在,先删除
if os.path.exists('test_dir'):
    os.rmdir('test_dir')

# 创建 test_dir 目录
os.mkdir('test_dir')

# 列出当前目录下的文件和文件夹
print("当前目录内容:", os.listdir())

# 拼接 test_dir 的绝对路径
new_path = os.path.join(os.getcwd(), 'test_dir')
print("test_dir 的绝对路径:", new_path)

# 判断路径相关信息
print("路径是否存在:", os.path.exists(new_path))
print("是否是目录:", os.path.isdir(new_path))
print("是否是文件:", os.path.isfile(new_path))

# 执行系统命令(输出 hello world)
os.system('echo "hello world"')

# 获取环境变量中的用户名
print("环境变量中的用户名:", os.environ.get('USERNAME'))
当前工作目录: E:\Workstation\PyCharm\Ai_250601
当前目录内容: ['.idea', '00.上课课件.Python', '01.day', '02.day', '03.day', '04.day', '05.day', '06.day', '07.day', '08.day', '09.day', 'personal_practice', 'test_dir'] 
test_dir 的绝对路径: E:\Workstation\PyCharm\Ai_250601\test_dir
路径是否存在: True
是否是目录: True
是否是文件: False
"hello world"
环境变量中的用户名: Gession

⚠️ 可能导致“看不见”echo输出的原因:

  1. Python 环境限制输出(比如 Jupyter Notebook,os.system 的输出会被吞)
  2. 双引号被 shell 误解析(有些系统对 echo 命令敏感)
  3. IDE 对系统命令无输出(极少数情况)

总结:

用法 推荐度
os.system() 简单测试 ✅
subprocess.getoutput() 建议常用 ✅✅✅
!命令 Jupyter 专用 ✅✅

os.environ 是一个类似字典的对象,用来访问系统的环境变量。

它的“键”就是当前系统中的环境变量名称,通常是操作系统设定的。


✅ 常见的环境变量键(不同系统有差异):

环境变量名 含义
PATH 可执行程序的搜索路径
HOME 用户主目录(Linux/macOS)
USERPROFILE 用户主目录(Windows)
USERNAME 当前用户名
TEMP / TMP 临时文件目录
OS 操作系统类型(Windows 常有)
COMSPEC 命令解释器路径
PATHEXT 可执行文件扩展名(Windows)
APPDATA 应用数据目录(Windows)
PYTHONPATH Python 模块搜索路径
PYTHONHOME Python 安装路径
SHELL 当前使用的 shell(Linux/macOS)

json模块

✅ 常用 API 总结

函数 功能
json.loads(s) 将 JSON 字符串 解析 成 Python 对象
json.dumps(obj) 将 Python 对象 编码 成 JSON 字符串
json.load(fp) 从文件读取 JSON 并解析成 Python 对象
json.dump(obj, fp) 将 Python 对象转为 JSON 并写入文件
import json

# Python 对象
data = {"name": "Tom", "age": 18, "hobbies": ["reading", "coding"]}

# ✅ dumps:对象转 JSON 字符串
json_str = json.dumps(data, indent=2, ensure_ascii=False)
print("JSON 字符串:\n", json_str)

# ✅ loads:JSON 字符串转 Python 对象
parsed_data = json.loads(json_str)
print("解析后的对象:", parsed_data)

# ✅ dump:对象写入 JSON 文件
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=2, ensure_ascii=False)

# ✅ load:从 JSON 文件读取并解析
with open('data.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)
    print("从文件读取的对象:", loaded_data)

输出结果:

JSON 字符串:
 {
  "name": "Tom",
  "age": 18,
  "hobbies": [
    "reading",
    "coding"
  ]
}
解析后的对象: {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'coding']}
从文件读取的对象: {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'coding']}
1.3.3 第三方模块

大多数通过命令:

pip install 模块名
conda install 模块名

即可安装

1.3.3.1 科学计算与数据分析
模块名 说明
numpy 数组与矩阵运算
pandas 数据清洗与分析
scipy 科学与工程计算
matplotlib 绘图与可视化
seaborn 高级统计图表(基于 matplotlib)

pandas 模块示例

# pip install pandas
import pandas as pd

data = {'name': ['Alice', 'Bob'], 'age': [25, 30]}
df = pd.DataFrame(data)

print("表格内容:\n", df)
print("平均年龄:", df['age'].mean())

matplotlib 模块示例

# pip install matplotlib
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 4, 6, 8]

plt.plot(x, y)
plt.title("折线图示例")
plt.xlabel("X 轴")
plt.ylabel("Y 轴")
plt.show()

1.3.3.2机器学习与人工智能
模块名 说明
scikit-learn 通用机器学习库
tensorflow Google 深度学习框架
torch (PyTorch) Facebook 深度学习框架
xgboost 高效的梯度提升算法

1.3.3.3 网络请求与解析
模块名 说明
requests 简单易用的 HTTP 客户端
httpx 支持异步的 HTTP 客户端
beautifulsoup4 HTML/XML 解析库
lxml 高性能 HTML/XML 解析
selenium 自动化浏览器操作

requests 模块示例

import json
import os

import requests

# 十分类
CATEGORYS = {
    'airplane': '飞机',
    'automobile': '汽车',
    'bird': '鸟',
    'cat': '猫',
    'deer': '鹿',
    'dog': '狗',
    'frog': '青蛙',
    'horse': '马',
    'ship': '船',
    'truck': '卡车'
}

User_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'
headers = {
    'User-Agent': User_Agent
}


def download_image(key_class, word, index, image_url):
    response = requests.get(image_url)
    if response.status_code != 200:
        raise Exception('图片请求失败')
    current_path = os.path.dirname(__file__)
    save_path = os.path.join(current_path, 'images', key_class)
    if not os.path.exists(save_path):
        os.makedirs(save_path)
    os.chdir(save_path)
    with open(f'{word}_{index}.jpg', 'wb') as f:
        f.write(response.content)
        print(f'关键字:{key_class} -> {word}_{index}.jpg 下载成功')


PAGE_NUM = 3

if __name__ == '__main__':
    for key_class, word in CATEGORYS.items():
        for page in range(PAGE_NUM):
            image_url = f'https://image.baidu.com/search/acjson?tn=resultjson_com&word={word}&ie=utf-8&fp=result&fr=&ala=0&applid=8923700731872655071&pn={30 * (page + 1)}&rn=30&nojc=0&gsm=3c&newReq=1'
            request = requests.get(url=image_url, headers=headers).text
            request = json.loads(request)
            picture_list = request['data']['images']
            for index, picture in enumerate(picture_list):
                url = picture['thumburl']
                download_image(key_class, word, (page * 30 + index) + 1, url)

Python模块化编程:高效代码组织技巧_第2张图片


1.3.3.4 Web 开发框架
模块名 说明
flask 轻量级 Web 框架
django 全功能 Web 框架
fastapi 异步、类型安全的 Web 框架

1.3.3.5 数据库连接与 ORM
模块名 说明
sqlalchemy 通用 ORM 工具
pymysql MySQL 数据库驱动
psycopg2 PostgreSQL 数据库驱动

1.3.3.6自动化与办公
模块名 说明
openpyxl 操作 Excel (.xlsx)
xlrd / xlwt 读取/写入 Excel (.xls)
python-docx 处理 Word 文档
pdfplumber 提取 PDF 文本内容
pyautogui 自动化鼠标键盘操作

1.3.3.7虚拟环境与依赖管理
模块名 说明
virtualenv / venv 创建虚拟环境
pipenv 虚拟环境与依赖管理
poetry 项目管理与构建

✅ Conda 环境管理与依赖导出总结

功能 命令 说明
创建新环境 conda create -n 环境名 python=版本号 创建指定 Python 版本的虚拟环境
激活环境 conda activate 环境名 进入指定环境
退出环境 conda deactivate 离开当前环境
查看所有环境 conda env listconda info --envs 查看已创建的环境列表
删除环境 conda remove -n 环境名 --all 删除指定环境

✅ Conda 环境复制与共享

功能 命令 说明
导出当前环境依赖 conda env export > environment.yml 将当前环境的所有依赖(含版本)导出为 YAML 文件
基于环境文件创建环境 conda env create -f environment.yml 根据环境文件安装所有依赖并创建新环境
更新已有环境依赖 conda env update -f environment.yml 将当前环境更新为 environment.yml 中指定的依赖
查看已安装模块 conda list 列出当前环境下的所有已安装模块及版本

✅ Conda 常见环境文件示例(environment.yml)

name: myenv
channels:
  - defaults
dependencies:
  - python=3.10
  - numpy=1.24
  - pandas=1.5
  - pip
  - pip:
    - requests==2.31.0

1.3.4 用户自定义模块
1.3.4.1自定义模块

tools.py

def add(a, b):
    return a + b

使用示例

import tools
print(tools.add(3, 5))

跨文件夹使用

project/
  utils/
    __init__.py
    math_utils.py
  main.py

main.py 中调用

from utils.math_utils import add
print(add(3, 5))

1.3.4.2 模块的导入方式
import math               # 导入模块
from math import sqrt     # 导入模块中的函数
import numpy as np        # 给模块起别名
from math import *        # 导入所有内容(不推荐)

1.3.4.3模块的搜索路径

加载模块时查找顺序:
1️⃣ 当前目录
2️⃣ PYTHONPATH 环境变量目录
3️⃣ 标准库目录
4️⃣ 第三方库目录(如 site-packages)

查看路径:

import sys
print(sys.path)

你可能感兴趣的:(Python基础,python,开发语言,网络爬虫,爬虫)