Python 模块与包
程序变大,不可能全写在一个文件里。Python 用模块(module)和包(package)组织代码——一个 .py 文件就是一个模块,一个目录就是一个包。这一章讲清怎么写自己的模块、用别人的模块(标准库和第三方包)。
1. 模块是什么?
模块就是一个 .py 文件。文件里定义的函数、类、变量,别的文件可以 import 进来复用。这是 Python 代码复用的基本单位。
2. import 的四种写法
# 1. 导入整个模块
import math
print(math.pi) # 3.141592653589793
print(math.sqrt(16)) # 4.0
# 2. 导入并起别名(长名字太累时用)
import numpy as np
# print(np.array([1, 2, 3])) # 假设装了 numpy
import pandas as pd
# 3. 从模块导入特定的函数/常量
from math import pi, sqrt
print(pi) # 3.141592653589793
print(sqrt(16)) # 4.0
# 4. 从模块导入并起别名
from math import sqrt as square_root
print(square_root(16)) # 4.0
# 5. 导入模块的全部内容(用 *)
# ⚠ 强烈不推荐!会污染命名空间,容易名字冲突
# from math import * # ❌ 不要这样写新手要点:
import 模块名最安全,但用起来要写全名模块名.函数。from 模块 import 函数方便,但同名函数会冲突。- 避免
from math import *:导入所有内容会污染命名空间,容易踩坑。 - 约定俗成的别名:
import numpy as np、import pandas as pd、import matplotlib.pyplot as plt,几乎所有教程都这么写。
3. 自己写一个模块
写模块就是写一个普通的 .py 文件。在项目目录下创建 mymath.py。
# === file: mymath.py ===
"""自定义数学工具模块"""
PI = 3.14159
def circle_area(radius):
"""计算圆的面积"""
return PI * radius * radius
def circle_perimeter(radius):
"""计算圆的周长"""
return 2 * PI * radius
# 这行让模块既能被 import,也能直接运行
if __name__ == "__main__":
# 只有直接运行本文件时才执行
# 被 import 时不执行
print(f"半径 5 的圆,面积 = {circle_area(5):.2f}")if __name__ == "__main__": 是 Python 的经典惯用法:它让文件既能被 import,又能直接运行。被 import 时 __name__ 是模块名(不等于 "__main__"),这块代码不执行;直接 python mymath.py 运行时 __name__ 等于 "__main__",这块代码执行。测试代码、演示代码都该放这里。
4. 使用自己的模块
# === file: main.py ===
# 导入自己写的模块(同目录下的 mymath.py)
import mymath
# 用模块名.函数 调用
area = mymath.circle_area(5)
print(f"面积:{area:.2f}") # 78.54
# 也可以只导入特定函数
from mymath import circle_perimeter
perimeter = circle_perimeter(5)
print(f"周长:{perimeter:.2f}") # 31.425. 包(package):多文件组织
项目更大时,把多个模块按目录分组,目录就叫包。Python 3.3+ 的包不需要 __init__.py 也能用(普通命名空间包),但传统写法和大多数项目还是保留它。
# === 目录结构 ===
# myproject/
# ├── main.py
# └── utils/ <- 包(目录 + __init__.py)
# ├── __init__.py <- 标识这是一个包(可空)
# ├── string_utils.py
# └── math_utils.py
# === utils/string_utils.py ===
def reverse(s):
return s[::-1]
# === main.py ===
# 从包里导入子模块
from utils.string_utils import reverse
print(reverse("hello")) # olleh
# 也可以导入整个包,用全路径访问
import utils.string_utils
print(utils.string_utils.reverse("Python")) # nohtyP6. 标准库(Python 的宝藏)
Python 被称为"自带电池(batteries included)"——标准库极其丰富,装好 Python 就有 200 多个模块。常用的记住下面几个:
# Python 标准库极其丰富,无需安装,直接 import
# 1. os:操作系统接口
import os
print(os.getcwd()) # 当前工作目录
# os.makedirs("test_dir", exist_ok=True) # 创建目录
print(os.path.exists(".")) # True
# 2. sys:Python 解释器相关
import sys
print(sys.version) # Python 版本信息
print(sys.platform) # 平台 (darwin/linux/win32)
# 3. math:数学函数
import math
print(math.pi) # 3.141592653589793
print(math.factorial(5)) # 120 5 的阶乘
print(math.log(100, 10)) # 2.0 以 10 为底的对数
# 4. random:随机数
import random
print(random.randint(1, 100)) # 1~100 随机整数
print(random.choice(["红", "绿", "蓝"])) # 随机选一个
print(random.shuffle([1,2,3,4,5])) # 原地打乱(返回 None)
# 5. json:JSON 处理
import json
data = {"name": "小明", "age": 20}
s = json.dumps(data, ensure_ascii=False)
print(s) # {"name": "小明", "age": 20}
# 6. re:正则表达式
import re
phones = re.findall(r"\d{4}", "电话 1234 和 5678")
print(phones) # ['1234', '5678']常用标准库速查:
- os / sys:操作系统、解释器
- math:数学函数
- random:随机数
- datetime:日期时间(下一篇专门讲)
- json:JSON 互转
- re:正则表达式
- collections:Counter、defaultdict、namedtuple
- pathlib:现代路径处理(比 os.path 更优雅)
- urllib:HTTP 客户端(自带,但 requests 更好用)
- logging:日志
- unittest / pytest:单元测试
- threading / asyncio:并发
7. pip:安装第三方包
Python 之所以强大,很大程度因为 PyPI(pypi.org)上有 50 万+ 第三方库。pip 是它们的包管理器。
# pip 是 Python 的第三方包管理器
# 1. 安装包
pip install requests # HTTP 请求库
pip install numpy # 科学计算
pip install pandas # 数据分析
pip install flask # Web 框架
# 2. 安装指定版本
pip install requests==2.31.0
# 3. 从 requirements.txt 批量安装
pip install -r requirements.txt
# 4. 升级包
pip install --upgrade requests
# 5. 卸载
pip uninstall requests
# 6. 查看已安装
pip list
pip show requests # 查看某个包的详情
# === 安装后就能 import 用 ===
# import requests
# r = requests.get("https://api.github.com")
# print(r.status_code) # 200常用第三方库推荐:
- requests:HTTP 客户端(比 urllib 友好十倍)
- numpy:科学计算基础
- pandas:数据分析
- matplotlib:绘图
- Flask / Django / FastAPI:Web 框架
- beautifulsoup4:HTML 解析(爬虫)
- pytest:单元测试框架
8. requirements.txt:项目依赖清单
# requirements.txt:项目依赖清单
# 每行一个包名,可带版本号
requests==2.31.0
pandas>=2.0.0
numpy~=1.24.0
flask
# 生成方式:在项目目录运行
pip freeze > requirements.txt
# 别人拿到你的项目后,一键安装全部依赖
pip install -r requirements.txt
# 这是 Python 项目的事实标准
# 大部分 Python 项目根目录都有这个文件小结
模块和包是组织代码的基础。重点掌握:import 四种写法、__name__ == "__main__" 惯用法、包的结构、常用标准库(os/sys/math/random/json/re/collections)、pip 安装第三方包、requirements.txt。下一篇看类与面向对象——组织更大规模代码的方式。
← 上一篇 Python 函数
下一篇 Python 类与面向对象 →