第三天 函数定义与参数传递 - 模块与包管理
Python模块化编程实战:手把手教你打造系统信息收集模块
一、模块化编程的重要性
在软件开发领域,模块化编程就像建造乐高积木一样重要。想象一下,如果我们要建造一座城堡,没有人会直接从一块砖头开始雕刻整个城堡,而是会把城堡分解为城门、塔楼、城墙等独立模块进行搭建。Python的模块化编程正是这样的思想。
1.1 什么是模块化编程?
模块化编程是把大型程序划分为独立模块的开发方法。每个模块就像积木零件:
- 独立的功能单元
- 清晰的接口定义
- 可重复使用的代码块
1.2 为什么需要模块化?
- 代码复用率提升40%以上(根据GitHub统计)
- 调试效率提高30%
- 团队协作更顺畅
- 系统维护成本降低
# 反面教材:把所有功能写在一个文件里
def get_cpu_info(): ...
def get_mem_info(): ...
def save_to_file(): ...
def send_email(): ...
# 超过2000行后难以维护
二、函数基础与参数传递
2.1 函数定义三步法
def 函数名(参数):
"""文档字符串"""
函数体
return 返回值
实战:创建信息收集函数
def collect_system_info(include_disk=True, log_level='INFO'):
"""
收集系统核心信息
:param include_disk: 是否包含磁盘信息(默认True)
:param log_level: 日志级别(DEBUG/INFO/WARNING)
:return: 系统信息字典
"""
info = {}
# 函数实现...
return info
2.2 参数传递的四种姿势
2.2.1 位置参数
show_info('CPU使用率', 75) # 必须按顺序传递
2.2.2 关键字参数
show_info(metric='内存占用', value=60) # 明确参数含义
2.2.3 默认参数
def connect_database(host='localhost', port=3306):
2.2.4 可变参数
def format_report(*sections, **metadata):
# sections接收元组
# metadata接收字典
三、模块与包管理精要
3.1 创建你的第一个模块
创建sys_collector.py:
"""系统信息收集模块(sys_collector.py)"""
import platform
def get_os_info():
return {
'系统类型': platform.system(),
'版本号': platform.release()
}
def _get_private_data(): # 私有方法
# 内部实现...
3.2 模块导入的六种方式
方式 | 示例 | 适用场景 |
---|---|---|
基础导入 | import module | 需要整个模块功能时 |
别名导入 | import numpy as np | 模块名较长时 |
选择性导入 | from module import func | 只需要特定功能时 |
全量导入 | from module import * | 快速测试(生产环境慎用) |
相对导入 | from .submod import cls | 包内模块互相引用时 |
延迟导入 | 在函数内import | 提升启动速度时 |
3.3 包管理工具pip的20个高频命令
# 安装指定版本
pip install psutil==5.9.0
# 生成requirements.txt
pip freeze > requirements.txt
# 从文件安装
pip install -r requirements.txt
# 查看过期包
pip list --outdated
四、实战:系统信息收集模块开发
4.1 项目结构规划
sys_monitor/
├── collectors/ # 收集器包
│ ├── cpu_collector.py
│ ├── mem_collector.py
│ └── disk_collector.py
├── utils/ # 工具包
│ ├── logger.py
│ └── formatter.py
└── main.py # 主程序
4.2 核心代码实现
CPU信息收集(跨平台支持):
import psutil
def get_cpu_info():
"""获取CPU信息"""
try:
return {
'物理核心数': psutil.cpu_count(logical=False),
'逻辑核心数': psutil.cpu_count(logical=True),
'使用率(%)': psutil.cpu_percent(interval=1)
}
except Exception as e:
print(f"CPU信息获取失败: {str(e)}")
return {}
内存信息收集:
def get_memory_info():
"""获取内存信息"""
mem = psutil.virtual_memory()
return {
'总内存(GB)': round(mem.total / 1024**3, 2),
'可用内存(GB)': round(mem.available / 1024**3, 2),
'使用率(%)': mem.percent
}
4.3 模块整合与测试
# main.py
from collectors import cpu_collector, mem_collector
def main():
print("=== 系统监控报告 ===")
print("CPU信息:", cpu_collector.get_cpu_info())
print("内存信息:", mem_collector.get_memory_info())
if __name__ == '__main__':
main()
4.4 输出结果示例
{
"CPU信息": {
"物理核心数": 8,
"逻辑核心数": 16,
"使用率(%)": 23.5
},
"内存信息": {
"总内存(GB)": 32.0,
"可用内存(GB)": 12.3,
"使用率(%)": 61.2
}
}
五、调试技巧与常见问题
5.1 模块导入的三大陷阱
- 循环导入问题
# module_a.py
from module_b import func_b
# module_b.py
from module_a import func_a # 死循环!
- 路径搜索问题
# 解决方案:添加项目根目录到PATH
import sys
sys.path.append('/project_root')
- 缓存导致更新不生效
# 在交互环境执行
import importlib
importlib.reload(module)
5.2 异常处理最佳实践
try:
import第三方库
except ImportError as e:
print(f"缺少依赖库: {e.name}")
print("请执行: pip install -r requirements.txt")
except Exception as e:
logger.error(f"意外错误: {str(e)}")
六、扩展方向与学习建议
6.1 项目扩展方向
- 添加网络信息收集(使用netifaces库)
- 实现定时采集功能(结合schedule库)
- 开发Web展示界面(使用Flask/Django)
6.2 推荐学习路径
- 掌握Python标准库(os, sys, platform)
- 学习常用第三方库(psutil, requests)
- 研究项目打包(setuptools)
- 探索自动化测试(pytest)
# 使用装饰器增强功能
def log_execution_time(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} 执行耗时: {time.time()-start:.2f}s")
return result
return wrapper
@log_execution_time
def collect_all_info():
# 收集所有信息...
通过本教程,你不仅掌握了模块化编程的核心技能,还构建了一个实用的系统监控工具。记住,好的代码就像乐高积木——每个模块都应该具备独立功能、清晰接口和灵活组合能力。现在就开始你的模块化编程之旅吧!