30天学会Python编程:7. Python模块与包使用指南
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
|
import module | module.func() | ||
import module as m | m.func() | ||
from module import func | func() | ||
from module import * | func() |
注意事项:
from module import *
(易导致命名冲突)Python按以下顺序查找模块:
import sys
print(sys.path) # 查看导入搜索路径
在包内模块间引用时使用:
# 包结构
"""
mypkg/
__init__.py
utils.py
subpkg/
__init__.py
helpers.py
"""
# utils.py中导入helpers.py
from .subpkg import helpers # 相对导入
注意事项:
mypackage/
├── __init__.py # 包初始化文件
├── module1.py # 模块文件
├── subpackage/ # 子包
│ ├── __init__.py
│ └── module2.py
└── setup.py # 打包配置文件
__init__.py
详解作用:
__all__
控制导入行为示例:
# mypackage/__init__.py
__all__ = ['module1', 'subpackage'] # 控制*导入的内容
# 预加载常用功能
from .module1 import PI, circle_area
实践建议:
__init__.py
内容__init__.py
中执行耗时操作__all__
明确导出接口os模块:
import os
# 创建多级目录
os.makedirs("data/logs", exist_ok=True)
# 遍历目录
for file in os.listdir("src"):
if file.endswith(".py"):
print(f"Python文件: {file}")
# 路径操作
config_path = os.path.join(os.getcwd(), "config", "settings.ini")
datetime模块:
from datetime import datetime, timedelta
# 获取当前时间
now = datetime.now()
print(f"当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}")
# 时间计算
yesterday = now - timedelta(days=1)
next_week = now + timedelta(weeks=1)
# 时间解析
date_str = "2023-12-25"
christmas = datetime.strptime(date_str, "%Y-%m-%d")
# 安装包
pip install requests
# 指定版本安装
pip install numpy==1.21.0
# 升级包
pip install --upgrade pip
# 卸载包
pip uninstall package-name
# 导出依赖
pip freeze > requirements.txt
# 安装依赖
pip install -r requirements.txt
venv使用:
# 创建虚拟环境
python -m venv myenv
# 激活环境(Linux/Mac)
source myenv/bin/activate
# 激活环境(Windows)
myenv\Scripts\activate
# 停用环境
deactivate
conda使用:
# 创建环境
conda create -n myenv python=3.9
# 激活环境
conda activate myenv
# 安装包
conda install numpy pandas
# 导出环境
conda env export > environment.yml
为什么使用虚拟环境:
__name__
属性# mymodule.py
def main():
print("模块功能")
if __name__ == "__main__":
# 直接执行时运行
print("模块作为脚本执行")
main()
说明:
__name__
等于"__main__"
__name__
等于模块名import importlib
import mymodule
# 修改模块后重新加载
importlib.reload(mymodule)
注意事项:
.pyc
文件__pycache__
目录包结构:
data_tools/
├── __init__.py
├── file_utils.py
└── stats.py
file_utils.py:
"""文件处理工具"""
import csv
import json
defread_csv(file_path):
"""读取CSV文件"""
withopen(file_path, 'r', encoding='utf-8') as f:
returnlist(csv.DictReader(f))
defsave_json(data, file_path):
"""保存JSON文件"""
withopen(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2)
stats.py:
"""统计计算工具"""
import math
defmean(values):
"""计算平均值"""
returnsum(values) / len(values)
defstandard_deviation(values):
"""计算标准差"""
avg = mean(values)
variance = sum((x - avg) ** 2for x in values) / len(values)
return math.sqrt(variance)
使用示例:
from data_tools import file_utils
from data_tools.stats import mean, standard_deviation
# 读取数据
sales_data = file_utils.read_csv('sales.csv')
# 提取销售额
amounts = [float(item['amount']) for item in sales_data]
# 计算统计量
avg_sale = mean(amounts)
std_dev = standard_deviation(amounts)
print(f"平均销售额: {avg_sale:.2f}, 标准差: {std_dev:.2f}")
# config_loader.py
import json
import os
from pathlib import Path
classConfigLoader:
"""配置加载器"""
_instance = None
def__new__(cls, config_file="config.json"):
if cls._instance isNone:
cls._instance = super().__new__(cls)
cls._instance.load_config(config_file)
return cls._instance
defload_config(self, config_file):
"""加载配置文件"""
config_path = Path(__file__).parent / config_file
ifnot config_path.exists():
raise FileNotFoundError(f"配置文件 {config_path} 不存在")
withopen(config_path, 'r', encoding='utf-8') as f:
self.config = json.load(f)
defget(self, key, default=None):
"""获取配置项"""
returnself.config.get(key, default)
# 单例配置对象
config = ConfigLoader()
使用示例:
from config_loader import config
db_host = config.get('database.host', 'localhost')
db_port = config.get('database.port', 5432)
__all__
控制导出内容.pyc
缓存动态导入:使用importlib.import_module()
module_name = "data_tools.file_utils"
file_utils = importlib.import_module(module_name)
命名空间包:跨多目录的包(Python 3.3+)
包资源访问:使用importlib.resources
C扩展模块:使用Cython提升性能
Python模块与包是构建可维护、可重用代码的基础。关键要点包括:
掌握这些概念后,我们将能够: ✅ 构建结构清晰的Python项目
✅ 有效复用代码
✅ 管理复杂依赖关系
✅ 利用丰富的标准库功能
✅ 创建可发布的Python包
最后建议:
"保持模块小巧专注,命名清晰明确,接口简洁稳定。良好的模块设计是高质量Python应用的基石。"
阅读原文:原文链接