
文章目录
-
- [📋 本篇内容](#📋 本篇内容)
- [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 核心概念
- 模块 = 一个
.py文件 - 包 = 包含
__init__.py的文件夹 - 虚拟环境 = 项目独立的Python环境
- 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项目了! 📦✨