文章目录
前言
Python 的“电池”哲学让我们不必重复造轮子。本文挑选 网络传输、时间处理、随机数、图形可视化 四大高频场景,通过 json
、datetime
、random
、turtle
四个标准库,由浅入深地带你写出优雅且实用的代码。所有示例均在 Python 3.8+ 实测通过,复制即可运行。
一、为什么要学这四个模块
在日常开发里,我们经常会遇到四类需求:
把 Python 对象转成字符串,方便网络传输或保存——交给 json;
记录日志、计算时间差——交给 datetime;
抽奖、验证码、蒙特卡洛模拟——交给 random;
给小朋友画个五角星、给自己画个股票 K 线——交给 turtle。
掌握它们,80% 的脚本工具需求都能迎刃而解。
二、json:让 Python 与万物互联
json 模块的核心其实就四个函数:
json.dumps(obj)
:把 Python 对象(字典、列表、字符串、数字等)转成 JSON 字符串;
json.loads(s)
:把 JSON 字符串还原成 Python 对象;
json.dump(obj, fp)
和json.load(fp)
则是前两者的文件版,省去手动读写文件。
实战 1:一行代码保存配置
import json, pathlib
config = {
"db": {"host": "127.0.0.1", "port": 3306, "user": "root", "password": "123456"},
"debug": True
}
pathlib.Path("config.json").write_text(json.dumps(config, ensure_ascii=False, indent=2))
print("配置已写入磁盘!")
# 再读回来
cfg = json.loads(pathlib.Path("config.json").read_text())
print("数据库地址:", cfg["db"]["host"])
小贴士:
ensure_ascii=False
保留中文;
indent=2
让输出带缩进,方便人眼阅读。
实战 2:复杂对象自定义序列化
当遇到 datetime
或 Decimal
这类 JSON 不直接支持的对象时,可以用 default
参数:
from datetime import datetime
log = {"time": datetime.now(), "level": "INFO", "msg": "服务启动成功"}
json_str = json.dumps(log, default=str) # 把 datetime 转成 ISO 字符串
print(json_str)
三、datetime:让时间不再是玄学
datetime 模块里最重要的四个类:
datetime.datetime
:带日期和时间的完整时刻;
datetime.date
:只关心年月日;
datetime.timedelta
:表示“一段时间”;
datetime.timezone
:处理时区。
实战 1:计算“距离今天还有多少天”
from datetime import datetime, timedelta
target = datetime(2025, 12, 31)
delta = target - datetime.now()
print(f"距离 2025 跨年还剩 {delta.days} 天")
实战 2:把时间戳与字符串互转
# 字符串 → datetime
dt = datetime.strptime("2024-07-12 18:30:00", "%Y-%m-%d %H:%M:%S")
# datetime → 时间戳(秒)
ts = int(dt.timestamp())
# 时间戳 → datetime
print(datetime.fromtimestamp(ts))
实战 3:优雅的 UTC 与本地时区转换
from datetime import datetime, timezone, timedelta
utc_now = datetime.now(timezone.utc) # UTC 时间
bj_now = utc_now.astimezone(timezone(timedelta(hours=8))) # 北京时间
print("UTC :", utc_now.strftime("%Y-%m-%d %H:%M:%S"))
print("北京:", bj_now.strftime("%Y-%m-%d %H:%M:%S"))
四、random:伪随机,真方便
虽然 random 产生的是伪随机数,但日常应用足够。常用 API:
random.randint(a, b)
:闭区间 [a, b] 内整数;
random.choice(seq)
:从序列里随机挑一个;
random.sample(population, k)
:无放回抽样 k 个;
random.random()
:生成 0.0~1.0 之间浮点数;
random.seed(x)
:设置种子,让结果可复现。
实战 1:命令行抽签器
import random
participants = ["张三", "李四", "王五", "赵六"]
lucky = random.choice(participants)
print("今晚请客的是:", lucky)
实战 2:生成 6 位验证码
code = ''.join(random.choices("0123456789ABCDEF", k=6))
print("验证码:", code)
实战 3:模拟抛硬币 10000 次验证概率
random.seed(42) # 复现实验
heads = sum(random.random() < 0.5 for _ in range(10000))
print(f"正面 {heads} 次,反面 {10000-heads} 次")
五、turtle:画的不只是图形,还有快乐
turtle 把一只小海龟放在画布上,你发命令它就移动,留下轨迹。
核心命令:
turtle.forward(distance)
/turtle.back(distance)
:前进、后退;
turtle.left(angle)
/turtle.right(angle)
:左转、右转;
turtle.penup()
/turtle.pendown()
:抬笔、落笔;
turtle.color(color)
/turtle.width(width)
:换色、线宽;
turtle.speed(speed)
:0 最快,1-10 逐渐加速;
turtle.done()
:保持窗口不自动关闭。
实战 1:六芒星
import turtle as t
t.speed(3)
for _ in range(2):
for _ in range(3):
t.forward(200)
t.left(120)
t.left(60)
t.hideturtle()
t.done()
实战 2:实时画正弦曲线
import turtle, math
turtle.tracer(False) # 关闭动画,直接画
turtle.setworldcoordinates(0, -1.5, 2*math.pi, 1.5) # 自定义坐标系
turtle.color("red")
turtle.width(2)
for x in range(0, 720):
turtle.goto(x/100, math.sin(x/100))
turtle.hideturtle()
turtle.done()
实战 3:画一棵分形树(递归魔法)
import turtle as t
def tree(branch_len):
if branch_len < 10:
return
t.forward(branch_len)
t.right(20)
tree(branch_len - 15)
t.left(40)
tree(branch_len - 15)
t.right(20)
t.backward(branch_len)
t.left(90)
t.up(); t.backward(100); t.down()
t.color("brown")
tree(90)
t.done()
六、融会贯通:一个迷你项目
“随机生成 30 天的温度,保存为 JSON,再画出折线图”。
import json, random, datetime, turtle
# 1. 生成数据
random.seed(2024)
data = []
base = datetime.datetime(2024, 7, 1)
for i in range(30):
day = base + datetime.timedelta(days=i)
temp = round(25 + 10 * random.random(), 1)
data.append({"date": day.strftime("%m-%d"), "temp": temp})
# 2. 落盘
with open("temp.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 3. 画图
turtle.setup(800, 400)
turtle.tracer(False)
turtle.up(); turtle.goto(-380, -150); turtle.down()
turtle.speed(0)
for i, item in enumerate(data):
x = -380 + i * 26
y = -150 + (item["temp"] - 20) * 20 # 简单缩放
turtle.goto(x, y)
turtle.dot(5)
turtle.hideturtle()
turtle.done()
七、结语
json 让我们与外部世界沟通,datetime 让时间可算可控,random 让程序增添趣味,turtle 让创意跃然屏上。
掌握这四个模块,你的 Python 工具箱已经能覆盖 80% 的日常脚本需求。
收藏 + 实践,你会发现:Python 的优雅,就藏在这些“小轮子”里。