Python3 模块:别什么都自己写,站在别人的肩膀上
我是陈默,一个正拼命上岸的码农。
你做饭会自己种菜吗?
不会。你去菜市场买。
编程也一样。你需要的功能,大概率别人已经写好了。你只需要"导入"就能用。
这就是模块。一个 .py 文件就是一个模块,里面装着一堆别人写好的函数和工具。
今天我们来聊聊 Python 模块怎么用、怎么写、怎么管理。
1. 导入模块:三种方式
import 模块名
import mathprint(math.pi) # 输出: 3.141592653589793print(math.sqrt(16)) # 输出: 4.0print(math.ceil(3.2)) # 输出: 4
用的时候要写 math. 前缀。好处是代码清晰,一眼就知道来自哪个模块。
from 模块名 import 具体功能
from math import sqrt, piprint(sqrt(16)) # 输出: 4.0print(pi) # 输出: 3.141592653589793
不用写前缀了。适合只用到模块里几个功能的情况。
from 模块名 import *
from math import *print(sqrt(16)) # 输出: 4.0print(pi) # 输出: 3.141592653589793
把模块里所有的东西都导入。
但这种写法不推荐。 你不知道导入了哪些名字,可能会覆盖你自己定义的变量。
用 as 起别名
import math as mprint(m.pi) # 输出: 3.141592653589793from math import sqrt as square_rootprint(square_root(16)) # 输出: 4.0
名字太长或者有冲突的时候,起个短一点的别名。
import numpy as np # 约定俗成的别名import pandas as pd # 约定俗成的别名import matplotlib.pyplot as plt # 约定俗成的别名
这些别名是社区约定,跟着用就行,别自己发明。
2. 常用内置模块
Python 自带了很多好用的模块,不用安装。
os:操作系统相关
import os# 当前工作目录print(os.getcwd()) # 输出: /Users/陈默/projects# 列出目录下的文件print(os.listdir(".")) # 输出: ['main.py', 'test.py', 'data.csv']# 创建目录os.makedirs("new_folder", exist_ok=True)# 拼接路径(跨平台兼容)path = os.path.join("folder", "file.txt")print(path) # 输出: folder/file.txt
sys:Python 解释器相关
import sys# Python 版本print(sys.version) # 输出: 3.x.x# 命令行参数print(sys.argv) # 脚本名和参数列表# 添加模块搜索路径sys.path.append("/my/modules")
json:处理 JSON 数据
import json# Python 对象 → JSON 字符串data = {"name": "陈默", "age": 25, "skills": ["Python", "SQL"]}json_str = json.dumps(data, ensure_ascii=False, indent=2)print(json_str)# JSON 字符串 → Python 对象parsed = json.loads(json_str)print(parsed["name"]) # 输出: 陈默# 读写 JSON 文件with open("data.json", "w") as f: json.dump(data, f, ensure_ascii=False, indent=2)with open("data.json", "r") as f: loaded = json.load(f)
datetime:日期和时间
from datetime import datetime, timedelta# 当前时间now = datetime.now()print(now) # 输出: 2026-04-01 10:30:00.123456print(now.strftime("%Y-%m-%d")) # 输出: 2026-04-01print(now.strftime("%Y年%m月%d日")) # 输出: 2026年04月01日# 日期计算tomorrow = now + timedelta(days=1)print(tomorrow.strftime("%Y-%m-%d"))# 字符串转日期date_str = "2026-01-15"date_obj = datetime.strptime(date_str, "%Y-%m-%d")print(date_obj) # 输出: 2026-01-15 00:00:00
random:随机数
import random# 随机整数print(random.randint(1, 100)) # 1-100 之间的随机整数# 随机选择fruits = ["苹果", "香蕉", "橙子"]print(random.choice(fruits)) # 随机选一个# 随机打乱random.shuffle(fruits)print(fruits) # 顺序被打乱# 随机抽样print(random.sample(range(1, 50), 6)) # 从 1-49 中随机选 6 个(不重复)
collections:扩展数据结构
from collections import Counter, defaultdict# Counter:计数器words = ["苹果", "香蕉", "苹果", "橙子", "香蕉", "苹果"]print(Counter(words)) # 输出: Counter({'苹果': 3, '香蕉': 2, '橙子': 1})# defaultdict:带默认值的字典dd = defaultdict(int) # 默认值是 0dd["Python"] += 1dd["Python"] += 1print(dict(dd)) # 输出: {'Python': 2}
3. 写自己的模块
任何 .py 文件都是一个模块。
创建模块
# 文件:my_tools.pydefgreet(name):"""打招呼"""returnf"你好,{name}!"defadd(a, b):"""加法"""return a + bPI = 3.14159
使用自己的模块
# 文件:main.py(和 my_tools.py 在同一目录)import my_toolsprint(my_tools.greet("陈默")) # 输出: 你好,陈默!print(my_tools.add(3, 5)) # 输出: 8print(my_tools.PI) # 输出: 3.14159
就这么简单。同一个目录下的 .py 文件,互相导入就行。
4. __name__ == "__main__":模块的入口
你可能见过这种写法:
# 文件:my_tools.pydefgreet(name):returnf"你好,{name}!"if __name__ == "__main__":# 只有直接运行这个文件时才执行 print(greet("陈默")) print("测试通过")
为什么需要这个?
- 直接运行
python my_tools.py:__name__ 是 "__main__",测试代码会执行 - 别人
import my_tools:__name__ 是 "my_tools",测试代码不会执行
这样模块既能被导入,也能自己运行测试。一举两得。
5. 包(Package):模块的文件夹
模块多了,需要分文件夹管理。
my_project/├── utils/│ ├── __init__.py # 告诉 Python 这是一个包│ ├── math_tools.py # 数学工具│ └── string_tools.py # 字符串工具├── main.py
导入包里的模块
# 导入包里的某个模块import utils.math_tools# 导入包里的具体函数from utils.math_tools import add# 包太多层?起别名from utils.math_tools import add as my_add
__init__.py 的作用
这个文件告诉 Python:"这个文件夹是一个包。"
它可以是空的,也可以写一些初始化代码:
# utils/__init__.pyfrom .math_tools import addfrom .string_tools import capitalize# 这样别人可以直接 from utils import add
6. 第三方模块:用 pip 安装
内置模块不够用?还有成千上万的第三方模块。
安装
# 安装pip install requests# 指定版本pip install requests==2.28.0# 升级pip install --upgrade requests# 卸载pip uninstall requests# 查看已安装pip list
常用第三方模块
# requests:HTTP 请求import requestsresponse = requests.get("https://api.github.com")print(response.status_code) # 输出: 200# pandas:数据分析# import pandas as pd# df = pd.read_csv("data.csv")# numpy:科学计算# import numpy as np# arr = np.array([1, 2, 3])
虚拟环境:项目隔离
不同项目可能需要不同版本的模块。用虚拟环境隔离:
# 创建虚拟环境python -m venv myenv# 激活(Mac/Linux)source myenv/bin/activate# 激活(Windows)myenv\Scripts\activate# 退出deactivate
每个项目一个虚拟环境,互不干扰。这是 Python 开发的基本规范。
7. 模块搜索路径
当你 import xxx 时,Python 按以下顺序找:
import sysprint(sys.path) # 看看 Python 都去哪里找模块
如果 import 报错 ModuleNotFoundError,先检查文件在不在这些路径里。
8. 实战:搭建一个项目结构
student_manager/├── __init__.py├── models.py # 数据模型├── utils.py # 工具函数└── main.py # 主程序入口
# models.pystudents = []defadd_student(name, score): students.append({"name": name, "score": score})defget_average():ifnot students:return0return sum(s["score"] for s in students) / len(students)
# utils.pydefformat_report(data): lines = []for item in data: status = "通过"if item["score"] >= 60else"补考" lines.append(f"{item['name']}:{item['score']}分({status})")return"\n".join(lines)
# main.pyfrom models import add_student, get_average, studentsfrom utils import format_reportadd_student("陈默", 85)add_student("小明", 42)add_student("小红", 91)print(format_report(students))print(f"\n平均分:{get_average():.1f}")# 输出:# 陈默:85分(通过)# 小明:42分(补考)# 小红:91分(通过)## 平均分:72.7
每个文件负责一件事,互相导入。这就是模块化开发的基本思路。
最后
模块化是从小项目走向大项目的关键一步。
记住三件事:
import 用什么导什么,别用 from xxx import *
我的建议:
选一个你经常复用的代码片段,提取成一个模块。下次用到的时候直接 import,体验一下"不写重复代码"的爽感。
好的程序员不是什么都自己写,而是知道去哪里找现成的。
今天就到这里。
我是陈默,我们下期再见。
如果你觉得这篇文章有帮助,欢迎关注我。我会持续分享 Python 学习的干货。