【第一阶段—基础准备】第五章:Python模块和包管理(基础篇)—变形金刚的装备库

文章目录

    • [📋 本篇内容](#📋 本篇内容)
    • [1. 模块基础 🎯](#1. 模块基础 🎯)
      • [1.1 什么是模块?](#1.1 什么是模块?)
      • [1.2 如何使用模块?](#1.2 如何使用模块?)
      • [1.3 name 的作用 - 区分"主角"和"配角"](#1.3 name 的作用 - 区分"主角"和"配角")
        • [1.3.1 场景1:文件作为"主角"(直接运行)](#1.3.1 场景1:文件作为"主角"(直接运行))
        • [1.3.2 场景2:文件作为"配角"(被导入)](#1.3.2 场景2:文件作为"配角"(被导入))
        • [1.3.3 深入理解:name 到底是什么?](#1.3.3 深入理解:name 到底是什么?)
        • [1.3.4 实际应用:为什么要这样做?](#1.3.4 实际应用:为什么要这样做?)
        • [1.3.5 总结:三个关键点](#1.3.5 总结:三个关键点)
    • [2. 包的概念 🏗️](#2. 包的概念 🏗️)
      • [2.1 什么是包?Python vs Java](#2.1 什么是包?Python vs Java)
        • [Python包 vs Java包的区别](#Python包 vs Java包的区别)
      • [2.2 创建Python包(3步搞定)](#2.2 创建Python包(3步搞定))
      • [2.3 编写和使用包](#2.3 编写和使用包)
      • [2.4 关于 init.py](#2.4 关于 init.py)
    • [3. 虚拟环境(重要!)🌍](#3. 虚拟环境(重要!)🌍)
      • [3.1 为什么需要虚拟环境?](#3.1 为什么需要虚拟环境?)
      • [3.2 创建和使用虚拟环境](#3.2 创建和使用虚拟环境)
      • [3.3 虚拟环境最佳实践](#3.3 虚拟环境最佳实践)
    • [4. 依赖管理 📦](#4. 依赖管理 📦)
      • [4.1 requirements.txt - 记录项目依赖](#4.1 requirements.txt - 记录项目依赖)
      • [4.2 pip 常用命令](#4.2 pip 常用命令)
      • [4.3 配置国内镜像(永久)](#4.3 配置国内镜像(永久))
    • [6. 常见问题 📚](#6. 常见问题 📚)
      • [6.1 ModuleNotFoundError](#6.1 ModuleNotFoundError)
      • [6.2 虚拟环境相关问题](#6.2 虚拟环境相关问题)
    • [7. 学习总结 🎓](#7. 学习总结 🎓)
      • [7.1 核心概念](#7.1 核心概念)
      • [7.2 必记命令](#7.2 必记命令)

📋 本篇内容

复制代码
什么是模块? → 什么是包? → 如何导入? → 虚拟环境 → 依赖管理

1. 模块基础 🎯

1.1 什么是模块?

简单理解 :模块就是一个.py文件,就像Java中的一个.java文件

python 复制代码
# utils.py - 这就是一个模块
"""工具模块"""

def format_size(size_bytes):
    """格式化文件大小"""
    if size_bytes < 1024:
        return f"{size_bytes}B"
    elif size_bytes < 1024 * 1024:
        return f"{size_bytes / 1024:.2f}KB"
    else:
        return f"{size_bytes / (1024 * 1024):.2f}MB"

APP_VERSION = "1.0.0"

1.2 如何使用模块?

python 复制代码
# main.py - 使用模块

# 方式1:导入整个模块
import utils
print(utils.format_size(1024000))  # 1000.00KB
print(utils.APP_VERSION)            # 1.0.0

# 方式2:导入特定函数(推荐)
from utils import format_size
print(format_size(1024000))  # 1000.00KB

# 方式3:导入并重命名
from utils import format_size as fmt_size
print(fmt_size(1024000))  # 1000.00KB

1.3 name 的作用 - 区分"主角"和"配角"

生活类比:就像一个演员,在自己的电影里是主角,在别人的电影里是配角

1.3.1 场景1:文件作为"主角"(直接运行)
python 复制代码
# my_module.py
def greet(name):
    """打招呼函数"""
    return f"Hello, {name}!"

# 🔑 关键代码:判断是否是主角
if __name__ == "__main__":
    # 只有作为主角(直接运行)时才执行这里的代码
    print("我是主角!正在直接运行这个文件")
    print(greet("Python"))
    print("执行一些测试代码...")

# 运行方式:在命令行执行
# python my_module.py
# 
# 输出:
# 我是主角!正在直接运行这个文件
# Hello, Python
# 执行一些测试代码...
1.3.2 场景2:文件作为"配角"(被导入)
python 复制代码
# main.py
import my_module  # 导入my_module作为配角

# 使用my_module中的函数
result = my_module.greet("World")
print(result)

# 运行方式:在命令行执行
# python main.py
#
# 输出:
# Hello, World
#
# 注意:my_module.py中if __name__ == "__main__"里的代码不会执行!
1.3.3 深入理解:name 到底是什么?
python 复制代码
# test_name.py
print(f"当前文件的 __name__ 是: {__name__}")

# 场景1:直接运行此文件
# python test_name.py
# 输出:当前文件的 __name__ 是: __main__
#       ↑ Python把直接运行的文件标记为 "__main__"

# 场景2:被其他文件导入
# 在另一个文件中:import test_name
# 输出:当前文件的 __name__ 是: test_name
#       ↑ Python把被导入的文件标记为 "文件名"
1.3.4 实际应用:为什么要这样做?
python 复制代码
# calculator.py - 一个计算器模块
def add(a, b):
    """加法"""
    return a + b

def subtract(a, b):
    """减法"""
    return a - b

# 测试代码:只在直接运行时执行
if __name__ == "__main__":
    # 这些是测试代码,用来验证函数是否正常工作
    print("=== 测试计算器模块 ===")
    print(f"10 + 5 = {add(10, 5)}")      # 测试加法
    print(f"10 - 5 = {subtract(10, 5)}")  # 测试减法
    print("测试完成!")

# 使用场景对比:

# 场景A:开发时测试(直接运行)
# python calculator.py
# 输出:
# === 测试计算器模块 ===
# 10 + 5 = 15
# 10 - 5 = 5
# 测试完成!

# 场景B:在项目中使用(被导入)
# main.py:
# from calculator import add
# result = add(100, 200)
# print(result)  # 输出:300
# 
# 注意:测试代码不会执行,不会打印"=== 测试计算器模块 ==="
1.3.5 总结:三个关键点
python 复制代码
# 1️⃣ __name__ 是Python的特殊变量
#    - 直接运行文件时:__name__ == "__main__"
#    - 被导入时:__name__ == "文件名"

# 2️⃣ if __name__ == "__main__": 的作用
#    - 区分"我是主程序"还是"我被别人导入"
#    - 主程序:执行测试、演示代码
#    - 被导入:只提供函数和类,不执行测试代码

# 3️⃣ 实际用途
#    - 在模块中写测试代码
#    - 写示例代码展示如何使用
#    - 开发时方便调试

2. 包的概念 🏗️

2.1 什么是包?Python vs Java

简单理解:包就是一个包含多个模块的文件夹

Python包 vs Java包的区别
对比项 Java包 Python包
定义方式 在文件中声明package com.example; 文件夹结构自动形成包
标识文件 不需要特殊文件 建议添加__init__.py
包名规则 必须与文件夹路径一致 自动根据文件夹路径
导入方式 import com.example.Utils; from myapp.utils import helper
python 复制代码
# Java包(需要声明)
// com/example/utils/Helper.java
package com.example.utils;  // ← 必须声明包名

public class Helper {
    public static void clean() { }
}

# Python包(自动识别)
# myapp/utils/helper.py
# 不需要声明包名!文件夹结构就是包名

def clean_data(data):
    return [item.strip() for item in data if item]

2.2 创建Python包(3步搞定)

bash 复制代码
# 📁 创建项目结构
my_project/
├── main.py              # 主程序
└── myapp/               # 包文件夹
    ├── __init__.py      # 空文件(推荐添加)
    ├── utils/
    │   ├── __init__.py  # 空文件
    │   └── helper.py    # 工具模块
    └── models/
        ├── __init__.py  # 空文件
        └── user.py      # 用户模块

# 步骤1:创建文件夹
mkdir -p myapp/utils myapp/models

# 步骤2:创建 __init__.py(空文件即可)
touch myapp/__init__.py
touch myapp/utils/__init__.py
touch myapp/models/__init__.py

# 步骤3:创建模块文件
touch myapp/utils/helper.py
touch myapp/models/user.py

2.3 编写和使用包

python 复制代码
# ===== 编写模块 =====

# myapp/utils/helper.py
def clean_data(data):
    """清理数据"""
    return [item.strip() for item in data if item]

# myapp/models/user.py
class User:
    def __init__(self, name):
        self.name = name

# ===== 使用包 =====

# main.py
from myapp.utils.helper import clean_data
from myapp.models.user import User

# 使用
data = ["  hello  ", "", "  world  "]
cleaned = clean_data(data)
print(cleaned)  # ['hello', 'world']

user = User("张三")
print(user.name)  # 张三

2.4 关于 init.py

常见疑问__init__.py 是必须的吗?

python 复制代码
# 答案:Python 3.3+ 不是必须的,但强烈建议添加!

# ✅ 推荐做法:总是创建 __init__.py
myapp/
├── __init__.py          # 空文件即可
├── utils/
│   ├── __init__.py      # 空文件即可
│   └── helper.py

# 为什么要添加?
# 1. 明确标识这是一个包
# 2. 兼容性更好(支持旧版本Python)
# 3. 可以简化导入(高级用法)

# __init__.py 的三种用法:

# 用法1:空文件(最常见,初学者推荐)
# __init__.py
# (什么都不写)

# 用法2:简化导入(进阶用法)
# utils/__init__.py
from .helper import clean_data
# 使用时:from myapp.utils import clean_data

# 用法3:包初始化(高级用法)
# __init__.py
VERSION = "1.0.0"
print("包已加载")

3. 虚拟环境(重要!)🌍

3.1 为什么需要虚拟环境?

问题场景

项目A需要 numpy 1.19 版本

项目B需要 numpy 1.21 版本

全局只能安装一个版本 → 冲突!
解决方案 :虚拟环境

每个项目有自己独立的Python环境,互不干扰

3.2 创建和使用虚拟环境

bash 复制代码
# 1️⃣ 创建虚拟环境(在项目目录下执行)
python -m venv venv

# 会生成一个venv文件夹:
# venv/
# ├── bin/          # macOS/Linux
# ├── Scripts/      # Windows
# └── lib/          # 安装的包

# 2️⃣ 激活虚拟环境
# macOS/Linux:
source venv/bin/activate

# Windows:
venv\Scripts\activate

# 激活后,命令行前面会显示 (venv)

# 3️⃣ 现在可以安装包了
pip install numpy pandas

# 4️⃣ 退出虚拟环境
deactivate

3.3 虚拟环境最佳实践

bash 复制代码
# ✅ 推荐做法
# 1. 每个项目创建独立的虚拟环境
# 2. 虚拟环境文件夹命名为 venv 或 .venv
# 3. 将虚拟环境添加到 .gitignore(不要提交到Git)

# .gitignore 文件内容
venv/
.venv/
*.pyc
__pycache__/

4. 依赖管理 📦

4.1 requirements.txt - 记录项目依赖

bash 复制代码
# 1️⃣ 安装项目需要的包
pip install numpy pandas scikit-learn

# 2️⃣ 导出依赖列表
pip freeze > requirements.txt

# requirements.txt 内容:
"""
numpy==1.21.0
pandas==1.3.0
scikit-learn==0.24.2
"""

# 3️⃣ 其他人使用你的项目时,一键安装所有依赖
pip install -r requirements.txt

4.2 pip 常用命令

bash 复制代码
# 安装包
pip install numpy

# 安装特定版本
pip install numpy==1.21.0

# 升级包
pip install --upgrade numpy

# 卸载包
pip uninstall numpy

# 查看已安装的包
pip list

# 查看包信息
pip show numpy

# 使用国内镜像加速(推荐)
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

4.3 配置国内镜像(永久)

bash 复制代码
# 一次配置,永久加速
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 常用国内镜像:
# 清华:https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里:https://mirrors.aliyun.com/pypi/simple/
# 腾讯:https://mirrors.cloud.tencent.com/pypi/simple

6. 常见问题 📚

6.1 ModuleNotFoundError

python 复制代码
# ❌ 错误:找不到模块
"""
ModuleNotFoundError: No module named 'mymodule'
"""

# ✅ 解决方案:
# 1. 检查文件名是否正确
# 2. 检查文件是否在正确的位置
# 3. 确保激活了虚拟环境(如果使用了虚拟环境)
# 4. 确保安装了需要的包(pip install package_name)

6.2 虚拟环境相关问题

bash 复制代码
# 问题1:忘记激活虚拟环境
# 症状:安装的包找不到
# 解决:source venv/bin/activate

# 问题2:虚拟环境损坏
# 解决:删除venv文件夹,重新创建
rm -rf venv
python -m venv venv

# 问题3:不同项目混用虚拟环境
# 解决:每个项目创建独立的虚拟环境

7. 学习总结 🎓

7.1 核心概念

  1. 模块 = 一个.py文件
  2. = 包含__init__.py的文件夹
  3. 虚拟环境 = 项目独立的Python环境
  4. requirements.txt = 记录项目依赖

7.2 必记命令

bash 复制代码
# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
source venv/bin/activate  # macOS/Linux
venv\Scripts\activate     # Windows

# 安装包
pip install package_name

# 导出依赖
pip freeze > requirements.txt

# 安装依赖
pip install -r requirements.txt

掌握这些基础知识,你就可以开始组织自己的Python项目了! 📦✨

相关推荐
lkbhua莱克瓦241 小时前
Java进阶——IO流
java·开发语言·笔记·学习方法·io流
阿杰同学1 小时前
Java中55种锁,高级面试题,最新面试题
java·开发语言
清晓粼溪1 小时前
SpringCloud01-基础概念
java·开发语言·spring cloud
学历真的很重要2 小时前
PyTorch 机器学习工作流程基础 - 完整教程
人工智能·pytorch·后端·python·深度学习·机器学习·面试
曹牧2 小时前
在C#中,string和String
开发语言·c#
小白学大数据2 小时前
基于文本检测的 Python 爬虫弹窗图片定位与拖动实现
开发语言·爬虫·python
小白|2 小时前
【OpenHarmony × Flutter】混合开发性能攻坚:如何将内存占用降低 40%?Flutter 引擎复用 + ArkTS 资源回收实战指南
开发语言·javascript·flutter
tuokuac3 小时前
java中的浮点数基本操作
java·开发语言
努力的BigJiang3 小时前
ORB-SLAM2在ubuntu20.04中的复现记录(跑数据集+ROS)(ROS接口失败版)
python