上一章我们讲了 sys,重点是在说:程序不只是写逻辑,还要理解自己是怎么被启动、怎么运行的。而这一章,我们进入两个特别高频、也特别实用的标准库模块:
randomdatetime
为什么把它们放在一起讲?
因为这两个模块都特别常见,而且一上手就能做出很有“真实味道”的功能。
想做抽奖、随机点名、验证码、小游戏,就常会用到 random。 想做打卡、日志、倒计时、时间比较、记录创建时间,就很容易碰到 datetime。
很多人学 Python 学了很久,写的代码还是停留在“输入一个数字,加减乘除一下”。但只要你把这两个模块用起来,程序立刻就会更像真实工具。
所以这一章的重点,不是把所有函数一股脑塞给你,而是先把最常用、最值得先掌握的那部分吃透。
一、先说 random 是干什么的
你可以先把 random 理解成:
Python 里专门负责随机相关操作的工具箱。
最常见的用途有这些:
生成随机整数 随机选择列表里的某个元素 打乱列表顺序 随机生成小数 做抽奖、点名、测试数据生成
也就是说,只要你想让程序里出现一点“不可预测”的结果,脑子里就可以先想到 random。
先导入模块:
import random
后面几乎所有随机操作,都是从这个模块里取。
二、最常用的第一个函数:randint()
这个函数特别高频。
import randomprint(random.randint(1, 10))
它的意思是:
在 1 到 10 之间,随机取一个整数。
注意,是包含两端的。 也就是说,1 有可能被取到,10 也有可能被取到。
输出结果每次可能不同,比如:
7
或者:
2
或者:
10
这就是随机的味道。
这个函数为什么这么常用?
因为很多场景天然都要“随机整数”。
比如:
随机出一个题号 随机生成一个验证码数字 随机决定抽中的序号 随机给一个初始值 小游戏里随机生成敌人位置编号
所以 randint() 可以说是入门 random 时第一个必须会的函数。
三、再看一个更有感觉的例子:随机点名
比如你有一组同学名单:
import randomstudents = ['张三', '李四', '王五', '赵六', '小明']name = random.randint(0, len(students) - 1)print(students[name])
这当然能实现随机点名。 但更自然的做法不是用下标,而是直接用 choice()。
四、最常用的第二个函数:choice()
import randomstudents = ['张三', '李四', '王五', '赵六', '小明']print(random.choice(students))
choice() 的意思非常直接:
从一个序列里随机选一个元素。
这比前面自己先随机下标再取值更自然,也更好读。
比如输出可能是:
王五
也可能是:
小明
这个函数在这些场景里特别常见:
随机点名 随机抽奖 随机推荐一句话 随机选一个题目 从列表里随机拿一个测试样本
你会发现,很多真实小功能,一用 choice() 就立刻有味道了。
五、第三个高频函数:shuffle()
如果你想把一个列表顺序打乱,可以用:
import randomnums = [1, 2, 3, 4, 5]random.shuffle(nums)print(nums)
输出结果可能变成:
[3, 1, 5, 2, 4]
也可能是别的顺序。
注意这里有一个细节特别重要:
shuffle() 是直接在原列表上修改顺序。
也就是说,它不是返回一个打乱后的新列表,而是把原来的 nums 直接改掉。
这一点很多新手容易忽略。
这个函数很适合:
随机打乱抽签顺序 打乱题目顺序 洗牌 做随机练习顺序
你会发现,这些功能一旦加到程序里,立刻就比纯静态代码更像真实工具。
六、第四个常见函数:random()
如果你想得到一个 0 到 1 之间的随机小数,可以用:
import randomprint(random.random())
输出结果可能像这样:
0.583271
或者:
0.124889
这个函数虽然不像 randint() 和 choice() 那么直观,但它也很常见。
比如你想做:
随机概率判断 生成随机小数 模拟命中率 模拟折扣浮动 做一些简单随机实验
都会用到它。
你现在先记住一句话就够了:
random() 返回的是 0 到 1 之间的随机浮点数。
七、random 模块最适合做什么样的小功能
你现在可以先把它和下面这些需求绑定起来。
抽奖 点名 洗牌 验证码 随机题目 随机推荐 概率模拟 小游戏里的随机事件
只要你的程序里出现“随机”这两个字,脑子里就先想到它。
这会让你对 random 建立非常稳的场景感,而不是只记一堆函数名字。
八、做一个小案例:随机抽奖
下面这个例子很适合你现在的阶段。
import randomusers = ['张三', '李四', '王五', '赵六', '小明']winner = random.choice(users)print(f'本次抽奖中奖者是:{winner}')
输出结果每次可能不同,比如:
本次抽奖中奖者是:赵六
这种例子为什么重要?
因为它已经非常接近真实需求了。 你以后做年会抽奖、课堂点名、随机推荐、随机测试,基本都是这个思路。
也就是说,random 不是只能拿来“看看随机数”,而是真能直接做出实用小功能。
九、现在转到 datetime:它又是干什么的
如果说 random 管的是“随机”,那 datetime 管的就是:
日期和时间。
先导入最常见的用法:
from datetime import datetime
注意这里和前面 import random 不完全一样。 因为 datetime 这个模块里本身也有一个同名的 datetime 类,所以很多时候会这样写:
from datetime import datetime
你现在先别被名字重复吓到,后面一用就顺了。
十、最常见的第一个动作:获取当前时间
from datetime import datetimenow = datetime.now()print(now)
输出结果通常像这样:
2026-03-2615:30:45.123456
也就是说,datetime.now() 的作用是:
获取当前此刻的日期和时间。
这个功能非常重要。
因为现实里的很多程序,一旦和业务、记录、日志沾边,就几乎都离不开当前时间。
比如:
记录创建时间 生成日志时间 做打卡系统 比较两个时间差 显示“现在几点了” 统计今天、明天、昨天
所以 datetime 的第一步,就是先学会拿到“现在”。
十一、打印出来的时间为什么看着这么长
因为它包含的信息很多:
年 月 日 时 分 秒 微秒
比如:
2026-03-2615:30:45.123456
这里:
2026-03-26 是日期15:30:45 是时间 后面的 .123456 是更细的微秒部分
很多时候你不需要这么完整,那就会涉及时间格式化,这也是 datetime 特别重要的能力之一。
十二、最常用的第二个动作:格式化时间 strftime()
如果你想把时间显示得更适合人看,而不是默认那种长样子,就可以用:
from datetime import datetimenow = datetime.now()print(now.strftime('%Y-%m-%d'))
输出结果可能是:
2026-03-26
再比如:
print(now.strftime('%Y-%m-%d %H:%M:%S'))
输出可能是:
2026-03-2615:30:45
你现在可以先把 strftime() 理解成:
把时间对象按指定格式转成字符串。
这在实际开发里非常高频。
因为很多时候你不是只想“拿到时间”,而是想“按某种可读格式显示时间”。
十三、最常见的几个格式符,先记这几个就够了
你现在不需要背大全,只先认识最常用的这些:
%Y四位年份,比如 2026
%m两位月份,比如 03
%d两位日期,比如 26
%H24 小时制小时,比如 15
%M分钟,比如 30
%S秒,比如 45
所以:
'%Y-%m-%d'
就是:
年-月-日
而:
'%Y-%m-%d %H:%M:%S'
就是:
年-月-日 时:分:秒
这两个格式,已经够你应付当前阶段绝大多数时间显示需求了。
十四、做一个更贴近真实场景的小例子:生成打卡时间
from datetime import datetimenow = datetime.now()checkin_time = now.strftime('%Y-%m-%d %H:%M:%S')print(f'打卡成功,时间是:{checkin_time}')
输出结果可能是:
打卡成功,时间是:2026-03-2615:30:45
这个例子已经很像真实业务了。
你会发现,一旦加上时间,程序立刻就从“静态脚本”变成了“和现实时刻有关的工具”。
这也是为什么 datetime 特别值得早学。
十五、datetime 还可以创建指定时间
除了拿当前时间,也可以手动创建一个时间对象。
from datetime import datetimedt = datetime(2026, 3, 26, 18, 30, 0)print(dt)
输出结果:
2026-03-2618:30:00
这说明什么?
说明 datetime 不只是“现在是什么时间”的工具, 它也是一种正式表达时间数据的方式。
比如你以后想表示:
某个活动开始时间 某个任务截止时间 某个订单创建时间 某个日志记录时间
都可以用 datetime 对象来表达,而不是只靠普通字符串。
十六、时间对象之间还可以比较
这也非常重要。
比如:
from datetime import datetimet1 = datetime(2026, 3, 26, 10, 0, 0)t2 = datetime(2026, 3, 26, 18, 0, 0)print(t1 < t2)
输出:
True
这说明时间对象本身是可以比较大小的。
所以以后你做这些需求时:
截止时间到了没 当前时间是否晚于开始时间 两个事件谁先发生
就会很自然。
这比你拿字符串硬比较要正规得多,也稳得多。
十七、再看一个非常高频的东西:timedelta
如果你想表示“时间差”或者“在某个时间基础上加几天、减几小时”,就会经常用到:
from datetime import datetime, timedelta
比如:
from datetime import datetime, timedeltanow = datetime.now()tomorrow = now + timedelta(days=1)print(now.strftime('%Y-%m-%d'))print(tomorrow.strftime('%Y-%m-%d'))
如果今天是 2026-03-26,那输出可能就是:
2026-03-262026-03-27
timedelta 你可以先理解成:
时间增量。
比如:
加一天 减两小时 加 30 分钟 减 7 天
它在很多场景里特别常见:
计算明天 计算昨天 做倒计时 做过期时间 算两个时间点的差距
十八、做一个简单例子:七天后到期
from datetime import datetime, timedeltanow = datetime.now()expire_time = now + timedelta(days=7)print('当前时间:', now.strftime('%Y-%m-%d %H:%M:%S'))print('到期时间:', expire_time.strftime('%Y-%m-%d %H:%M:%S'))
这类代码在会员到期、优惠券有效期、任务截止时间这些场景里特别常见。
你会发现,datetime 一旦和 timedelta 配合起来,就已经很像业务逻辑了。
十九、random 和 datetime 为什么放一起学特别合适
因为这两个模块都满足一个特点:
一上手就能做出特别有真实感的小功能。
random 让程序有随机性。datetime 让程序有时间感。
一个程序只要同时有了随机和时间,味道就会立刻变得不一样。
比如:
随机抽奖并记录时间 随机点名并打卡 生成随机验证码并附带过期时间 随机推荐一句话并显示当前日期
这些功能单独看都不复杂,但组合起来就已经很像真正的小工具了。
二十、做一个综合小案例:随机点名并记录时间
import randomfrom datetime import datetimestudents = ['张三', '李四', '王五', '赵六', '小明']name = random.choice(students)now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')print(f'本次点到的是:{name}')print(f'点名时间:{now}')
输出结果可能是:
本次点到的是:李四点名时间:2026-03-2615:30:45
这个例子虽然很小,但已经非常有感觉了。
它不再只是单纯输出一个随机值,也不只是打印当前时间。 而是开始把“随机”和“时间”结合进一个具体小功能里。
这就是标准库真正好用的地方。
二十一、本章小练习
你可以做两个特别适合巩固的练习。
第一个练习:
写一个随机抽奖程序。 准备一个名单列表,用 random.choice() 抽出一个中奖者。 然后用 datetime.now() 记录开奖时间,并格式化输出。
第二个练习:
写一个小脚本,显示:
当前时间 明天的时间 七天后的时间
你会用到:
datetime.now()timedelta(days=1)timedelta(days=7)strftime(...)
这两个练习,一个练随机,一个练时间,再加一点组合,就能把这一章的主干真正落下来。
二十二、本章总结
这一章,我们正式进入了两个最常用的标准库模块。
random 主要负责随机相关操作。 常用的有 randint()、choice()、shuffle()、random()。 它特别适合做抽奖、点名、洗牌、小游戏、测试数据生成。
datetime 主要负责日期和时间处理。datetime.now() 可以获取当前时间。strftime() 可以把时间格式化成更易读的字符串。timedelta 可以表示时间增量,常用于计算明天、昨天、到期时间等。
这两个模块虽然不复杂,但实用性非常高。 只要你把它们用熟,很多小功能都会一下子变得更像真实项目。
下一章我们继续往前走,把几个高频标准库放在一起梳理:089|math、statistics、collections 常用能力盘点。