第17章-常用标准库


假设你想写个程序:随机点一个同学的名字回答问题,或者让程序"掷骰子"出 1~6。你会不会觉得得先学一大堆随机算法?不用。Python 装好的那一刻,就自带了一大抽屉成品工具,随手就能用——这就是标准库。掷骰子这件事,import random 之后一行 random.randint(1, 6) 就搞定,就像去超市买现成的调味料,不用从种辣椒开始。

今天开三个最常用的工具抽屉:random(随机,用来抽奖、点名、掷骰子)、math(数学计算,开方、取整)、datetime(日期时间,记录"今天是几号")。这三个以后天天见:游戏、抽奖、记录日志、做报表都用得上。今天不要求你背 API,重点是知道有这个抽屉,需要用的时候知道去哪翻——具体写法忘了就问 AI。

标准库是什么,怎么导入

标准库就是 Python 官方自带的一批工具模块,不用额外安装,import 一下就能用。每个模块是一个"工具箱",装着一组相关的功能。

导入有两种写法:

  • 方式一:import random,用的时候写 random.randint(...)(先写模块名,再写函数名)。
  • 方式二:from random import randint,用的时候直接写 randint(...)

新手我建议用方式一。多带一个模块名,打字是多了几个,但一眼就能看出这个函数来自哪个工具箱;方式二函数多了容易重名,分不清谁是谁。两种方式先都见一见:

# 方式一:import 模块名,用的时候带模块名
import random
print(random.randint(1, 6))

# 方式二:from 模块 import 函数名,用的时候直接写函数名
from math import sqrt
print(sqrt(16))

输出(随机数那次每次不同,1~6 之间):

6
4.0

导入之后还可以查看模块里有什么:dir 看全部名字,help 看某个函数的说明。

import random
print(random.randint(1, 10))     # 随机整数
print(dir(random)[:5])           # 看看模块里前 5 个名字(不用背,扫一眼)

输出:

7(随机)
['BPF', 'Random', 'SystemRandom', 'WichmannHill', '__builtins__', ...]

两个最常见的导入报错,提前打个预防针:忘了 import 就写 random.randint(1, 6),报 NameError: name 'random' is not defined——先 import random;模块名写错,randommathdatetime 全小写,写成 from Random import ...ModuleNotFoundError

random:让程序"掷骰子、抽签"

random 帮程序产生"不固定"的数字或挑选结果,今天学 4 个:

  • random.randint(a, b):返回 a 到 b 之间的随机整数(含两头)。掷骰子就是 randint(1, 6)
  • random.choice(列表):从列表里随机挑一个元素。点名、抽奖就是它。
  • random.shuffle(列表):把列表顺序打乱(原地修改列表本身)。
  • random.sample(列表, n):随机挑 n 个不重复的元素,返回新列表。
import random

# 1. 随机整数:randint(最小, 最大),两头都包含
print(random.randint(1, 6))        # 模拟掷骰子:1~6

# 2. 随机挑一个:choice(列表)
names = ["小明", "小红", "小刚", "小丽"]
print(random.choice(names))        # 随机点一个人的名字

# 3. 打乱顺序:shuffle 直接改原列表
cards = ["A", "2", "3", "4"]
random.shuffle(cards)
print(cards)                       # 顺序被打乱

# 4. 随机挑 n 个不重复的:sample(列表, n)
print(random.sample(names, 2))     # 随机挑 2 个不同的人

输出(每次运行都不一样,这只是其中一次):

5
小丽
['4', 'A', '3', '2']
['小红', '小明']

再演示一次"猜数字"里随机数的用法,下周进阶会用到:

import random

secret = random.randint(1, 100)   # 电脑心里想一个 1~100 的数
print("心里想好了,范围 1~100")
print("答案(调试用):", secret)  # 调试时可以打印出来,正式玩再删掉

输出:

心里想好了,范围 1~100
答案(调试用): 57

random 的几个脾气要摸清:

  • randint 含头含尾randint(1, 6) 能出 6。想掷骰子就用它,别用 randrange(1, 6)(那个不含 6)。
  • shuffle 没有返回值x = random.shuffle(列表) 拿到的 x 是 None,shuffle 是原地打乱,直接打印原列表。
  • 随机数不能预测:每次运行结果都不同,这是特性不是 bug。要是调试时想"每次都一样",可以用 random.seed()(了解即可,资料里有)。

math:数学计算工具

math 提供数学运算函数和常量,常用的 5 个:

  • math.sqrt(x):开平方(结果是浮点数)。
  • math.floor(x):向下取整(往小的方向取),floor(3.7) = 3。
  • math.ceil(x):向上取整(往大的方向取),ceil(3.2) = 4。
  • math.pi:圆周率 π(一个常量,不是函数,不用加括号)。
  • math.pow(x, y):x 的 y 次方(和 x ** y 效果一样,看哪个顺手用哪个)。
import math

print(math.sqrt(16))        # 4.0(开平方,注意是浮点数)
print(math.floor(3.7))      # 3(向下取整)
print(math.ceil(3.2))       # 4(向上取整)
print(math.pi)              # 3.141592653589793(圆周率常量)
print(math.pow(2, 10))      # 1024.0(2 的 10 次方)
print(2 ** 10)              # 1024(用运算符也能算,结果还是整数)

输出:

4.0
3
4
3.141592653589793
1024.0
1024

注意看返回值:sqrt(16) 返回的是 4.0 而不是 4——返回的值要看清楚是整数还是小数,后面写代码经常在这上面栽跟头。

实际用一下——算圆的面积:

import math

r = 5
area = math.pi * r * r       # 圆面积 = π r²
print(f"半径 {r} 的圆,面积是 {area:.2f}")   # 保留两位小数

输出:

半径 5 的圆,面积是 78.54

math 的三个易错点:

  • 常量不是函数math.pi 没有括号,写成 math.pi()TypeError: 'float' object is not callable
  • 负数开方会报错math.sqrt(-1)ValueError: math domain error。真实程序里要先判断数字是不是非负(下周四学的 try/except 就是兜这种的)。
  • 取整方向别搞反:floor 永远往"小"取,ceil 永远往"大"取;floor(3.999) 是 3,ceil(3.001) 是 4。

datetime:日期和时间

程序里经常要"记录这是什么时候发生的"——日志、报表、聊天记录都离不开。datetime 就是干这个的:

  • datetime.date.today():今天的日期,返回如 2026-05-11
  • datetime.datetime.now():现在的日期 + 时间,返回如 2026-05-11 14:30:22.123456
  • .strftime("格式"):把日期时间格式化成自定义字符串,比如"2026年05月11日"。
  • today.timetuple().tm_yday:今天是这一年的第几天。
import datetime

# 1. 今天的日期(date 类型)
today = datetime.date.today()
print(today)

# 2. 现在的时间(datetime 类型,比 date 多一个时间)
now = datetime.datetime.now()
print(now)

# 3. 格式化输出:strftime 按格式拼字符串
print(today.strftime("%Y年%m月%d日"))
print(today.strftime("%Y-%m-%d"))          # 常用日期格式
print(now.strftime("%Y-%m-%d %H:%M:%S"))   # 常用"日期 时间"格式

# 4. 今天是这一年的第几天
print("今天是一年中的第", today.timetuple().tm_yday, "天")

输出:

2026-05-11
2026-05-11 14:30:22.123456
2026年05月11日
2026-05-11
2026-05-11 14:30:22
今天是一年中的第 131 

strftime 里的格式字母不用背,用的时候查这张表:

符号 含义 示例输出
%Y 四位年份 2026
%m 两位月份 05
%d 两位日期 11
%H 24 小时制小时 14
%M 分钟 30
%S 22

datetime 有三个地方容易迷糊:

  • date 和 datetime 是两回事date 只管"几月几号",datetime 连"几点几分"一起管;要当前时间就用 datetime.datetime.now()
  • 格式字母大小写敏感%m 是月份、%M 是分钟,写反了输出会怪怪的。
  • 打印 date 对象直接 print 就行print(today) 输出 2026-05-11,不用手动转字符串;要自定义格式才用 strftime

随堂练习

  1. 练习一(掷骰子统计,必做):随机生成 1~6,连掷 10 次,统计每个点数出现的次数并打印。 提示:用 random.randint(1, 6) 循环 10 次;用字典计数(第 3 周学过:出现过 次数+1,第一次出现设为 1);最后 for 遍历字典打印。

  2. 练习二(随机点名):把全班同学的名字放列表里,用 random.choice 随机点一个,点 3 次不重复。 提示:思路一(简单):点过的名字用 remove 从列表里移出去;思路二(推荐):先 random.shuffle(列表) 打乱,再按顺序取前 3 个。

  3. 练习三(日期输出):用 datetime 输出今天的日期,并输出"今天是一年中的第几天",再输出"今天是星期几"。 提示:第几天用 today.timetuple().tm_yday;星期几可以问 AI:"datetime 怎么输出今天是星期几"(strftime("%A") 可以输出英文星期,也可以用 weekday())。

  4. 进阶题(猜数字升级):让电脑随机想一个 1~100 的数,用户循环猜,大了提示"大了"、小了提示"小了",猜对打印"恭喜"和猜的次数。 提示:while True + break;猜的次数用一个变量累加;这题做出来就是第 4 周进阶作业"成绩记录"的雏形。

忘了用法?让 AI 帮你想

这三段提示词,想不起来某个函数怎么用的时候就丢给 AI——

场景:忘了某个标准库函数怎么用

提示词:
我是 Python 初学者。请问 random 模块里,怎么从一个列表里
随机挑 1 个元素、怎么挑 3 个不重复的元素?请用大白话解释,
给我一行示例代码,不要讲太深,我只想快速用起来。
场景:随机点名程序没思路

提示词:
我想写一个随机点名程序:全班 30 个同学放在一个列表里,
每次运行随机点 1 个人,点过的不能重复。请先给我思路
(用什么函数、分几步),不要直接给完整代码,我想自己写。
场景:日期格式化

提示词:
Python 里怎么把今天的日期输出成"2026年05月11日"这种格式?
怎么知道今天是一年中的第几天?给我简单示例代码并加注释,
我是初学者。

常见报错速查

报错信息 什么意思 怎么办
NameError: name 'random' is not defined 忘了 import random 文件最开头加 import random
ModuleNotFoundError: No module named 'Random' 模块名写错(大小写) 标准库模块名全小写:randommathdatetime
TypeError: 'float' object is not callable 把常量当函数调用了(比如 math.pi() 常量不加括号:math.pi
ValueError: math domain error 对负数开方等非法运算 先判断数字非负,或用 try/except(下周四学)
random.shuffle 后打印出来没变化 shuffle 是原地打乱,没有返回值 直接打印原列表,别把返回值赋给新变量

收个尾

今天的关键不是背下这几个函数名,而是建立起"Python 自带工具箱"这个意识:随机选 random,算数用 math,记时间用 datetime,具体写法忘了就查表、问 AI。你以后写程序,八成时间都在"找合适的抽屉",而不是从零造轮子。

明天开始学文件读写:怎么让数据"存得住"。今天 random 生成的成绩、datetime 记录的时间,明天就能写进文件保存下来——程序关掉再打开,数据还在。想想看,这解决了什么难题?