Python 从零开始 · 第 8 课:模块与第三方库——站在别人肩膀上
学到这里,你其实已经能写不少程序了。但有个问题:很多常见需求(发网络请求、处理日期、数学运算、操作文件系统)如果都自己从零写,会累死。
好消息是——别人已经写好了,你直接拿来用就行。 这就是 Python 最迷人的地方:它有一个庞大的"库"生态。
这一课,我们学会三件事:import 导入、标准库、pip 装第三方库。
一、import:把别人写好的代码拿进来
Python 自带一堆"标准库",装 Python 时就有了,用 import 就能用:
import math
print(math.sqrt(16)) # 4.0,开平方
print(math.pi) # 3.14159...
print(math.floor(3.7)) # 3,向下取整
print(math.ceil(3.2)) # 4,向上取整导入后,用 模块名.函数名 的方式调用。也可以只导入某个函数:
from math import sqrt, pi
print(sqrt(16)) # 4.0,直接用,不用写 math.
print(pi)还可以起别名:
import math as m
print(m.sqrt(9)) # 3.0🧊 冷笑话:一个 Python 脚本对另一个说:"走,一起import点乐子进来。"——import就是"把别人写好的东西拿进来用"。
二、常用标准库速览
Python 自带几十个标准库,最常用的这几个值得记住:
import random # 随机数
random.randint(1, 6) # 掷骰子,1~6
random.choice([1,2,3]) # 随机选一个
random.shuffle(lst) # 洗牌
import datetime # 日期时间
datetime.date.today() # 今天日期
datetime.datetime.now()# 现在时刻
import os # 操作系统
os.getcwd() # 当前目录
os.path.exists("a.txt")# 文件是否存在
os.makedirs("dir") # 建目录
import json # JSON 处理
json.dumps({"a": 1}) # 字典转 JSON 字符串
json.loads('{"a": 1}') # JSON 字符串转字典
import time # 时间
time.sleep(1) # 暂停 1 秒
import re # 正则表达式
re.findall(r"\d+", "a1b22c333") # ['1', '22', '333']json 特别重要——它是程序之间交换数据的通用格式,后面学"调 API"全靠它。三、datetime:处理日期和时间
第二节里 datetime 只露了一面。它其实是脚本里最常用的库之一——日志打时间、算"距离截止还有几天"、给文件名加日期,都靠它。
先分清两个东西:
datetime.date:只有"年月日",没有时刻。datetime.datetime:年月日 + 时分秒,最常用。
import datetime
# 现在这一刻
now = datetime.datetime.now()
print(now) # 2026-09-08 04:40:39.123456
# 指定某个日期时刻
d = datetime.datetime(2026, 9, 8, 9, 30)
print(d) # 2026-09-08 09:30:00
# 单独取出年月日时分秒
print(now.year, now.month, now.day)
print(now.hour, now.minute, now.second)格式化输出(strftime)——把日期变成你想要的字符串:
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d")) # 2026-09-08
print(now.strftime("%Y年%m月%d日 %H:%M")) # 2026年09月08日 04:40常用格式符号(记这几个就够):
| 符号 | 含义 | 示例 |
|---|---|---|
%Y | 四位数年份 | 2026 |
%m | 月(01-12) | 09 |
%d | 日(01-31) | 08 |
%H | 时(24 小时) | 04 |
%M | 分 | 40 |
%S | 秒 | 39 |
反向解析(strptime)——把字符串变回日期对象:
s = "2026-09-08"
d = datetime.datetime.strptime(s, "%Y-%m-%d")
print(d.year, d.month, d.day) # 2026 9 8算日期差(timedelta)——两个日期相减,或给日期加减一段时间:
from datetime import datetime, timedelta
d1 = datetime(2026, 9, 8)
d2 = datetime(2026, 10, 1)
delta = d2 - d1
print(delta.days) # 23,相差 23 天
print(d1 + timedelta(days=30)) # 2026-10-08 00:00:00,加 30 天
print(datetime.now() + timedelta(hours=2)) # 加 2 小时小结:strftime格式化输出、strptime解析输入、timedelta算差值,三者合起来就能覆盖绝大多数日期需求。
四、csv:读写表格数据
CSV 是最通用的表格格式——Excel 能开、记事本能看、程序能读。它就是"每行一条记录,列用逗号分开"的纯文本:
name,age,city
张三,20,北京
李四,22,上海用 Python 自带的 csv 模块来读写,比手动 split(",") 更稳(它会正确处理引号、逗号转义这些边角情况)。
读 CSV:
import csv
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f) # 返回一个"行"的迭代器
header = next(reader) # 第一行是表头
print("表头:", header)
for row in reader:
print(row) # 每行是一个列表,如 ['张三', '20', '北京']用表头当键来读(DictReader)——不用记列的顺序,直接按列名取值:
import csv
with open("data.csv", "r", encoding="utf-8") as f:
for row in csv.DictReader(f):
print(row["name"], row["age"]) # 直接按列名取写 CSV:
import csv
rows = [
["name", "age", "city"],
["张三", 20, "北京"],
["李四", 22, "上海"],
]
with open("out.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerows(rows) # 一次写多行写文件时记得加 newline="",否则 Windows 下会多出空行。五、pip:安装第三方库
标准库之外,还有海量的第三方库,要用 pip 安装。装之前通常先建一个虚拟环境,把不同项目的依赖隔离开,不互相污染:
# 建虚拟环境(项目目录下)
python3 -m venv venv
# 激活(Linux/Mac)
source venv/bin/activate
# 激活(Windows)
# venv\Scripts\activate
# 装库
pip install requests
pip install numpy
pip install pandas
# 查看已装
pip list装完就能 import 了:
import requests
import numpy as np # numpy 习惯起别名 np
import pandas as pd # pandas 习惯起别名 pd六、自己写模块:把函数分文件放
你也能自己写模块——把函数放到一个 .py 文件里,另一个文件 import 它。
假设有个 mytools.py:
# mytools.py
def double(x):
return x * 2
def greet(name):
return f"你好,{name}"在同一个目录下的另一个文件里:
import mytools
print(mytools.double(5)) # 10
print(mytools.greet("张三")) # 你好,张三这就是模块的本质:一个 .py 文件就是一个模块。项目一大,就把代码拆成多个模块,各管各的。
七、if __name__ == "__main__" 是啥?
看别人的代码,常常看到这行。它的作用是:这个文件被"直接运行"时,才执行下面的代码;被"import"时,不执行。
def main():
print("程序启动")
if __name__ == "__main__":
main()- 直接运行
python3 这个文件.py→ 会打印"程序启动"。 - 被别的文件
import 这个文件→ 不打印(只把函数借过去用)。
好处:既能让文件独立运行,又能当模块被复用,互不干扰。
八、动手时间 🎯
实验 1:掷骰子游戏
import random
def roll():
return random.randint(1, 6)
for _ in range(5):
print(f"掷出了 {roll()}")实验 2:JSON 读写
import json
data = {"name": "张三", "age": 20, "hobbies": ["篮球", "游戏"]}
# 存成 JSON 文件
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 读回来
with open("data.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["name"]) # 张三实验 3:用 requests 抓网页(需先 pip install requests)
import requests
r = requests.get("https://www.baidu.com")
print(r.status_code) # 200 表示成功
print(r.text[:100]) # 前 100 个字符九、小结
import把别人写好的代码拿来用:模块.函数或from 模块 import 函数。- 标准库自带(math/random/json/os/time),
datetime管日期、csv管表格;第三方库用pip install装,先建 venv 隔离。 - 一个
.py文件就是一个模块,项目大了就拆文件;if __name__ == "__main__"区分"直接运行"和"被导入"。
下一课,我们学 异常处理与调试——让程序不再一遇错就崩溃,学会优雅地兜底和定位 bug。
先把「JSON 读写」和「掷骰子」敲熟,模块的手感就长在你脑子里了。