今天你 AI 赋能了吗?打开浏览器,在地址栏输入 xuefulu.ai ,按下 Enter 即可访问学府路1号!
2026年10月14日 星期三 10:40:11
常用网址: | | 学府路1号 https://xuefulu.ai | 下载 Python https://xuefulu.ai/Python.html | 下载 TRAE https://xuefulu.ai/Trae.html

一、先认识这两个库

上一篇讲了怎么用 import 把现成的工具箱请进来。这一份就动手用两个最常用、也最好玩的工具箱:

两个都是标准库,装好 Python 就有,不用 pip install,写一句 import 就能用。

Python
import time
import random

print(time.time())         # 一串十位数字(表示从 1970 年至今经过的秒数)
print(random.randint(1, 6))  # 1~6 的随机整数

这一篇从头到尾都用带前缀的写法(time.sleep()、random.randint()),这也是最推荐的写法——一眼就能看出这个函数是从哪个工具箱里拿的。

工具箱负责什么这一篇要学的函数
time时间和计时sleep()、time()、localtime()、strftime()
random随机和抽签randint()、randrange()、choice()、shuffle()、random()、sample()、seed()
下面每个例子都能直接复制到 IDLE 里跑。涉及随机的例子,每次跑出来的结果都不一样,这是正常的——正文里会写成「比如 4」这样的形式。

二、让程序停一下:time.sleep()

最常用的一个:time.sleep(秒数),让程序原地等一会儿再往下走。

括号里填几,就暂停几秒,可以是小数(0.5 就是半秒)。

Python
import time

print('火箭发射倒计时开始……')
print(3)
time.sleep(1)      # 停 1 秒
print(2)
time.sleep(1)
print(1)
time.sleep(1)
print('发射!')

运行结果(数字之间会真的各停 1 秒,所以这三个数字是“一个一个蹦出来”的):

输出
火箭发射倒计时开始……
3
2
1
发射!

就像你喊口令:喊一个数字,心里默数一秒,再喊下一个。sleep 就是一个「不声不响,但是老老实实等够时间」的函数。

为什么要让程序等?三个最常见的用途:①倒计时、动画这种需要节奏的效果;②做个小程序假装“正在加载”,让人看着自然;③写爬虫时别把对方服务器问得太频繁。
⚠️ sleep 是「真的停住」,整个程序都静止不动,不是一边等一边干别的。所以别写 time.sleep(60) 去试——程序会像卡死一样一分钟不理你。写错了就按 Ctrl + C 强制停下。

课程思政|数据安全与法治素养 · 别把服务器问急了

time.sleep() 平时用来做倒计时、假装「正在加载」,但它在爬虫里还有个更正经的用途——让程序等一等再发下一个请求。对方服务器不是无限的,问得太密太快,轻则被封,重则给别人添麻烦。能拿到数据,不等于可以随便拿。以后再写采集脚本,主动加上这一句 sleep,是分寸,也是守法。

三、看看现在几点:localtime() 和 strftime()

要让程序说出「现在是几点几分」,要用两个函数配合:一个负责取时间,一个负责把时间变成好看的文字。

Python
import time

now = time.localtime()      # ① 取出当前时间(一大堆数字)
print(now)

text = time.strftime('%Y-%m-%d %H:%M:%S')   # ② 变成好看的格式
print(text)

运行结果:

Python
time.struct_time(tm_year=2026, tm_mon=9, tm_mday=21, tm_hour=7, tm_min=10, tm_sec=43, tm_wday=0, tm_yday=264, tm_isdst=0)
2026-09-21 07:10:43

第一行那一大坨是 localtime() 交出来的「时间数据包」,里面每一项是什么:

写法含义以 2026-09-21 07:10:43 为例
now.tm_year年份2026
now.tm_mon月份(1~12)9
now.tm_mday日期(1~31)21
now.tm_hour小时(0~23)7
now.tm_min分钟10
now.tm_sec秒43
now.tm_wday星期几(星期一是 0)0
now.tm_yday这一年中的第几天264
⚠️ 注意 strftime() 里用的是%m(月)和 %M(分)——大小写不一样,含义就不一样。写成 %Y/%m/%d %M:%H:%S 是不会报错的,但输出会变成「2026/09/21 10:07:43」这种顺序乱掉的怪结果。

格式符速查表

strftime() 的括号里就是一张「填空模板」,% 开头的字母会被替换成对应的数字。常用的这些:

格式符会被替换成例子
%Y四位年份2026
%y两位年份26
%m月份(两位数)09
%d日期(两位数)21
%H小时,24 小时制07
%I小时,12 小时制07
%M分钟10
%S秒43
%p上午 / 下午(英文)AM
%A星期几(英文全称)Monday
%a星期几(英文缩写)Mon
%B月份(英文全称)September
%j一年中的第几天264
模板里除了 % 这些符号,其他字符原样保留,所以能随便加中文和标点:time.strftime('%Y年%m月%d日') 就得到 2026年09月21日。

想要中文的「星期几」怎么办

%A 出来的是英文 Monday,%B 是 September。想要「星期一」这样的中文,就自己查表——tm_wday 刚好能当列表的下标用:

Python
import time

week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
now = time.localtime()

print(week[now.tm_wday])              # 比如 星期一
print(now.tm_mon, '月', now.tm_mday, '日')   # 比如 9 月 21 日
为什么这样能对上?因为 tm_wday 规定星期一是 0,而列表也是从 0 开始数的,两边刚好对齐。「星期天是 7 还是 0」这种问题,Python 里一律按 0 处理,不用纠结。

四、测一测代码跑了多久:time()

time.time() 返回的是一串大数字:从 1970 年 1 月 1 日到现在,一共过去了多少秒(带小数)。单独看它没什么意思,但取两次、一减,就是中间那段代码消耗的时间。

就跟体育比赛一样:起跑线看一次表,终点线再看一次表,两个数一减就是成绩。

Python
import time

start = time.time()          # 按下秒表,开始计时

time.sleep(0.5)             # 这里假装是一段很耗时的计算

end = time.time()           # 再按一下秒表,结束计时

print(f'一共花了 {end - start:.2f} 秒')

运行结果:

输出
一共花了 0.51 秒
{end - start:.2f} 里的 .2f 表示保留两位小数(在第 10 篇《字符串》里讲过 f-string 的格式写法)。真实工作里,中间那句 time.sleep(0.5) 换成你要测的代码即可——比如一个循环、一次排序,用同样的办法就能比较两种写法谁更快。
顺手认识一个更精确的:测很短的时间(不到 1 秒)时,用 time.perf_counter() 比 time.time() 更准。用法一模一样:开头取一次、结尾取一次、相减。起步阶段先用 time.time() 就够,见到 perf_counter 能认出来就行。

五、掷骰子:random.randint()

random.randint(最小值, 最大值) 会给你一个这个范围内的随机整数,而且两头的数都能取到。

Python
import random

dice = random.randint(1, 6)
print(f'你掷出了 {dice} 点')

if dice == 6:
    print('太棒了!再掷一次!')
else:
    print(f'继续前进 {dice} 格')

运行结果(每次都不一样,比如第一次跑):

输出
你掷出了 4 点
继续前进 4 格

randint(1, 6) 一共只有 6 种结果:1、2、3、4、5、6,正好是一颗骰子。想抽学号就用 random.randint(1, 45),想抽两位数就用 random.randint(10, 99)。

还有一个小兄弟 random.randrange(起点, 终点):它的终点取不到(左边闭、右边开),跟 range() 的规则一样。randrange(1, 6) 只能得到 1~5。两个函数的区别只有这一点:想两头都含就用 randint;写 randrange(0, 6) 和 randint(0, 5) 效果相同,但前者更像「从 0 数 6 个数」的写法。
掷骰子这件事,中国人玩得最有仪式感——闽南地区的中秋博饼,一桌人轮流掷六颗骰子,按点数组合定「状元、对堂、三红……」,掷出四个四点(俗称「四点红」)就能当状元。random.randint(1, 6) 模拟一颗骰子,正是这类游戏最核心的那一步。

课程思政|诚信与职业操守 · 抽签要经得起查

用 random.randint() 抽学号、抽奖,看着只是几行代码,背后却牵着公平。真正规范的抽签程序,结果只由随机数说了算,不会因为你认识谁、想让谁中,就偷偷改一下范围。程序里的「随机」,也是对别人的一句承诺——你写的抽奖器、分组器,将来可能就是别人眼里的规则,别让它在没人注意的地方偏了心。

六、抽一个:random.choice()

random.choice(一串数据) 从里面随机挑出 1 个。最常见的用法就是随机点名、随机抽奖。

Python
import random

names = ['小明', '小红', '小刚', '小美']

print(f'请 {random.choice(names)} 同学回答')
print(f'请 {random.choice(names)} 同学回答')

运行结果(两次抽到的人可能相同,因为每次都是独立地抽):

输出
请 小美 同学回答
请 小明 同学回答

把名单换成你们班的同学,这就是一个能直接用的课堂点名器。

括号里除了列表,也可以直接放字符串:random.choice('石头剪刀布') 会随机取到其中一个汉字(因为字符串就是一个个字符排成的队)。
一次想抽好几个怎么办?用 random.choices(名单, k=3):一次抽 3 个,而且允许重复(可能抽到同一个人)。注意函数名多了个 s,这个是「复数」的意思,并且必须写 k= 告诉它抽几个。
Python
import random

names = ['小明', '小红', '小刚', '小美']
print(random.choices(names, k=3))   # 比如 ['小刚', '小刚', '小红']

七、洗牌:random.shuffle()

random.shuffle(列表) 把列表里的顺序彻底打乱,就像把一副牌哗啦哗啦搓几下。

Python
import random

cards = ['红桃A', '黑桃K', '方块Q', '梅花J', '小王']
print('洗牌前:', cards)

random.shuffle(cards)      # 直接在原处打乱

print('洗牌后:', cards)
print('发牌,第一张是:', cards[0])

运行结果:

输出
洗牌前: ['红桃A', '黑桃K', '方块Q', '梅花J', '小王']
洗牌后: ['方块Q', '梅花J', '小王', '红桃A', '黑桃K']
发牌,第一张是: 方块Q
⚠️ 这是最容易踩的一个坑:shuffle() 会直接改动原来的列表,而且自己不返回任何东西(返回 None)。所以千万别写 cards = random.shuffle(cards)——那样 cards 会变成 None,后面一用就报错。写完 random.shuffle(cards) 直接留在原地用 cards 就行。
另外,shuffle() 只能用在列表上,不能直接打乱字符串:random.shuffle('abc') 会报 TypeError: 'str' object does not support item assignment(字符串是改不动的,这条在第 10 篇《字符串》里说过)。想打乱字符串,先 list('abc') 转成列表,打乱后再 ''.join(...) 拼回去。

AI 助手小贴士|随机数学会后第一个该做的小工具就是点名器,让 AI 写给你抄。

打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:用 random 写一个随机点名器:从名单里不重复地抽出 3 个人。每行加中文注释,并解释 sample 和 choices 的区别

八、随机小数与不重复抽取

1. random.random():0 到 1 之间的小数

random.random() 括号里什么都不用填,直接返回一个 0 到 1 之间的随机小数(0 能取到,1 取不到)。最常用在「按概率决定做不做某件事」。

Python
import random

chance = random.random()
print(f'今天的运气指数是 {chance:.4f}')

if chance < 0.5:
    print('手气一般,下次再来')
else:
    print('运气不错!')

运行结果:

输出
今天的运气指数是 0.6394
运气不错!
random() 不能填参数,写 random.random(1, 10) 会报 TypeError: Random.random() takes no arguments (2 given)。想要 1 到 10 之间的小数,用兄弟函数 random.uniform(1, 10)。

2. random.sample():不重复地抽几个

random.sample(名单, 抽几个) 从名单里抽出指定个数,保证互不重复,而且原名单不会被改动。

Python
import random

names = ['小满', '阿离', '大可', '团子', '柚子', '咕噜']   # 六个室友的昵称
print(random.sample(names, 3))    # 比如 ['小满', '阿离', '咕噜']
print(names)                      # 原名单顺序没变

运行结果:

输出
['小满', '阿离', '咕噜']
['小满', '阿离', '大可', '团子', '柚子', '咕噜']

「不重复」这一点在抽奖里特别重要——三等奖、二等奖、一等奖不能是同一个人。用 sample 一次抽 3 个,正好就是三名不同的幸运儿。

想做什么用哪个会不会重复原列表变不变
随机抽 1 个choice(名单)——不变
随机抽 3 个,可以重复(比如 3 次掷骰子)choices(名单, k=3)会重复不变
随机抽 3 个,必须不重复(比如抽 3 个奖)sample(名单, 3)不重复不变
把整个名单打乱顺序shuffle(名单)——会变

3. 好帮手:string 库里的「字母表」

做验证码、随机密码时,需要「所有小写字母」这种现成的字符串。string 库帮你准备好了,也是标准库、不用装:

Python
import string

print(string.ascii_lowercase)   # abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase)   # ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)            # 0123456789
print(string.ascii_letters)     # 大小写字母都在,共 52 个

运行结果:

输出
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
把 string.ascii_letters 和 string.digits 用 + 连起来,就得到一个「字母数字大集合」,正好用来 random.sample() 抽密码。

九、让结果「固定下来」:random.seed()

前面一直说「每次运行结果都不一样」。这在游戏里很好,但在调试程序、对答案、写作业演示的时候就很麻烦——你没法跟别人说「你看,结果应该是 6」。

random.seed(数字) 就是解决这个问题的:给它一个固定的「种子」,后面所有随机结果就固定下来了,每次运行都一模一样。

Python
import random

random.seed(42)          # 括号里填一个整数,42 是大家最常挑的那个
print(random.randint(1, 6))   # 6
print(random.randint(1, 6))   # 1
print(random.randint(1, 6))   # 1

运行结果(不管跑多少次,永远是 6、1、1):

输出
6
1
1
⚠️ 关键细节:seed() 要写在所有随机语句之前,而且只能管它后面的。把 random.seed(42) 放在 randint() 后面是没用的。

换个种子,就换一整串新的固定结果——种子 1 和种子 42 给出的序列不同,但各自都稳定:

Python
import random

random.seed(1)
print(random.randint(1, 6))   # 每次都是 2

random.seed(42)
print(random.randint(1, 6))   # 每次都是 6
两条实用建议:①交作业时如果要求「能复现」,就在开头写上 random.seed(42),老师才能得到和你一样的结果;②平时玩(掷骰子、点名)不要写 seed,否则每次都是同一个人被点到,就失去意义了。

课程思政|工匠精神与严谨求实 · 让结果可以复现

random.seed(数字) 一写,跑多少次结果都一模一样,调试、对答案、交作业演示时特别有用——你能拍着胸口说「这里就该是 6」。能被复现的结果,才经得起别人复核。做统计、跑实验也一样:把随机种子、参数、步骤都记下来,别人才可能顺着你的路再走一遍,而不是只能看见你一个人的背影。

十、最容易搞混的几组

10.1 randint 与 randrange:终点算不算数

Python
import random

print(random.randint(1, 6))    # 1 2 3 4 5 6  —— 6 能取到
print(random.randrange(1, 6))  # 1 2 3 4 5    —— 6 取不到

记法:randint 名字里带 int,是「整数区间」,两头都含;randrange 名字里带 range,跟 range() 一样右边不算。

10.2 random() 与 uniform():整数还是小数

Python
import random

print(random.random())         # 0~1 之间的小数,比如 0.6394,不带参数
print(random.uniform(1, 10))   # 1~10 之间的小数,比如 1.2251,要写两个参数
print(random.randint(1, 10))   # 1~10 之间的整数,比如 6

10.3 choice、choices、sample、shuffle:四个「抽」怎么选

函数干什么返回什么会重复吗原列表
choice(名单)抽 1 个一个元素——不变
choices(名单, k=3)抽 3 个一个新列表会重复不变
sample(名单, 3)抽 3 个一个新列表不重复不变
shuffle(名单)打乱整个列表None——被打乱
一句话记住:带 s 的两个是「抽多个」(返回列表),choice 是「抽一个」(返回单个元素),shuffle 是「不抽、只打乱」。

10.4 该用 time() 还是 sleep()

time.sleep(秒)time.time()
作用让程序停下来等读出现在的时间数
返回值没有(None)一个很大的小数
典型用途倒计时、制造节奏、模拟加载计时、记录开始和结束时刻
配不配合单独用取两次、相减才是耗时

十一、三个能直接跑的小例子

例 1:倒计时

Python
import time

print('准备发射')
print(3)
time.sleep(1)
print(2)
time.sleep(1)
print(1)
time.sleep(1)
print('点火!')
把 time.sleep(1) 改成 time.sleep(0.3),倒计时会变得更急促,像游戏里的读秒。

例 2:抽奖开奖

Python
import random
import time

names = ['小满', '阿离', '大可', '团子', '柚子', '咕噜']

print('摇奖中……', end='', flush=True)
time.sleep(1)
print(' 开奖!')

lucky = random.sample(names, 3)      # 一次抽出 3 个不重复的幸运儿
print(f'三等奖:{lucky[0]}')
print(f'二等奖:{lucky[1]}')
print(f'一等奖:{lucky[2]}')

运行结果(每次的名字都不一样):

输出
摇奖中…… 开奖!
三等奖:小满
二等奖:阿离
一等奖:咕噜
print('摇奖中……', end='', flush=True) 的作用是先打印、但不换行(end=''),并且马上显示出来(flush=True),这样才会出现「摇奖中……(停顿一秒)开奖!」的效果。不加这两句,程序会等在 sleep 结束后才一次性把整行吐出来。

例 3:随机密码生成器

Python
import random
import string

pool = string.ascii_letters + string.digits      # 大小写字母 + 数字

password = ''.join(random.sample(pool, 8))       # 不重复地抽 8 个,拼成字符串
print(f'你的新密码是:{password}')

运行结果(每次都不一样):

输出
你的新密码是:u8jzPde0
拆开看这三步:①pool 是全部可选字符;②random.sample(pool, 8) 不重复地抽 8 个,得到一个小列表;③''.join(...) 把列表拼成一个字符串。把 8 改成 6,就是 6 位数字验证码——只要把 pool 换成 string.digits:''.join(random.sample(string.digits, 6))。

AI 助手小贴士|两个库都认识了,做两个小项目把它们焊牢。

打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:出 2 道小项目题:①用 time 做一个倒计时器;②用 random 做一个号码抽取模拟器。只要题目描述和思路提示,先不要给答案

十二、常见问题(报错手册)

这一节全是照抄的真实报错,见到认识就行。

报错信息什么意思 / 怎么改
NameError: name 'random' is not defined. Did you forget to import 'random'?忘了写 import random。Python 已经直接提醒你了,在文件最上面补一行即可(time 库同理)。
TypeError: time.sleep() takes exactly one argument (0 given)sleep() 括号里什么都没填。要告诉它睡多久:time.sleep(1)。
TypeError: 'str' object cannot be interpreted as an integer给 sleep() 传了字符串,比如 time.sleep("1")。1 是数字,"1" 是文字,去掉引号。
TypeError: 'float' object cannot be interpreted as an integer给 randint() 传了小数,比如 random.randint(1, 6.0)。randint 只要整数,写成 randint(1, 6)。
ValueError: empty range in randrange(6, 2)两个数写反了——最小值必须写在前面。randint(6, 1) 是从「6 到 1」里挑,根本挑不出来。改成 randint(1, 6)。
IndexError: Cannot choose from an empty sequence给 choice() 传了一个空列表。从空帽子里摸不出纸条,先确认名单不是空的。
ValueError: Sample larger than population or is negativesample() 要抽的个数比名单里的人数还多(比如 3 个人里抽 5 个,又不能重复,那是不可能的)。要么减少抽取个数,要么把名单补长。
TypeError: 'str' object does not support item assignment把字符串传给了 shuffle()。字符串是改不动的,先用 list() 转成列表,打乱后再用 ''.join() 拼回去。
TypeError: Random.random() takes no arguments (2 given)random.random() 不用填参数。想要指定范围的小数请用 random.uniform(1, 10)。

还有几个不算报错、但一定会疑惑的现象:

现象怎么回事
print(random.shuffle(cards)) 打印出 Noneshuffle() 是原地打乱、不返回东西。要打印就打 print(cards),别把 shuffle 套在 print 里。
每次运行结果都不一样正常,这就是随机的意思。想让结果固定下来,在最前面加一句 random.seed(42)。
time.strftime('%A') 出来的是 Monday 不是「星期一」%A、%B 是英文。中文星期要自己做一张列表,用 tm_wday 当下标去取。
time.time() 得到一个像 1789945829.783944 的大数它是从 1970 年 1 月 1 日到现在的总秒数,单独看没意义,两次一减才是耗时。
time.sleep(5) 后程序像卡死了不是卡死,是真的在等。等待期间程序什么也不做。等不及就按 Ctrl + C 中断,把秒数改小。
IDLE 里跑完一遍,再按 F5 重跑还是老结果IDLE 的交互窗口里变量是一直保留的(上一轮的 cards、now 都还在)。想干净重来,在菜单里找 Restart Shell(重启交互窗口)。

AI 助手小贴士|学库最快的办法是做小玩意。让 AI 写一个完整小游戏并逐行注释,读懂它比自己翻文档快。

打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:用 Python 的 time 和 random 模块写一个「猜数字」小游戏:随机 1~100,提示大了小了,最后告诉我猜了几次。每行加中文注释,代码不超过 40 行

十三、随堂自测(10 题)

点击选项即可判分,答错的题会立刻显示解析。答完可以看到正确率和错题清单,也可以重新答一遍。

已答 0 / 10 · 正确 0 —

1想让程序暂停 1 秒再往下走,应该写哪一句?

  • A. time.sleep(1)
  • B. time.stop(1)
  • C. time.wait(1)
  • D. sleep.time(1)
答案:A。暂停用 time.sleep(秒数),括号里填几就停几秒,可以填小数(0.5 是半秒)。其余三个函数都不存在;sleep.time(1) 还写反了——永远是「模块名.函数名」,模块名在前面。

2想随机得到 1~6 的整数,而且 1 和 6 都可能出现,该用哪个?

  • A. random.randint(1, 6)
  • B. random.randrange(1, 6)
  • C. random.randint(0, 6)
  • D. random.random(1, 6)
答案:A。randint(1, 6) 两头都包含,正好是一颗骰子。选项 B 的 randrange(1, 6) 取不到 6(跟 range 一样右边不算);C 的 randint(0, 6) 会掷出 0 点,骰子没有 0;D 的 random() 不用参数,这样写直接报 TypeError。

3执行 random.shuffle(cards) 之后,下面说法正确的是?

  • A. cards 没变,函数返回一个打乱后的新列表
  • B. cards 会变成 None
  • C. cards 自己被打乱了,函数返回 None
  • D. 会报错,shuffle 只能用于字符串
答案:C。shuffle() 是原地打乱,直接在 cards 上动手,自己不返回任何东西。所以千万别写 cards = random.shuffle(cards)(那样 cards 会变成 None),写完这一句直接继续用 cards 就行。

4想让「掷骰子」的结果每次运行都固定成同一串数字,应该加哪一句?

  • A. random.fix(42)
  • B. random.stop(42)
  • C. random.same(42)
  • D. random.seed(42)
答案:D。random.seed(42) 给随机数一个固定的「种子」,后面所有随机结果就固定了,跑多少次都一样。注意它必须写在所有随机语句之前,写在后面无效。只有 a、b、c 那三个名字都是编出来的。

5time.strftime('%Y-%m-%d') 会得到什么?

  • A. 2026/09/21
  • B. 2026-09-21
  • C. 21-09-2026
  • D. %Y-%m-%d 这七个字符
答案:B。%Y 是四位年份、%m 是两位月份、%d 是两位日期,中间那两条短横线是原样保留的,所以得到 2026-09-21。顺序由你写的模板决定,模板写成 %d-%m-%Y 才会变成 21-09-2026。

6写 random.choice([])(空列表)会发生什么?

  • A. 返回 None
  • B. 返回空字符串
  • C. 报 IndexError: Cannot choose from an empty sequence
  • D. 一直等,直到列表里有东西
答案:C。从空帽子里摸不出纸条,Python 会直接报 IndexError。真实的抽奖程序里,如果名单来自文件或输入,要先用 if not names: 判断一下名单是不是空的,别把空列表直接丢给 choice()。

7想测一测一段代码跑了多久,最合适的做法是?

  • A. 开头和结尾各取一次 time.time(),两个数相减
  • B. 用 time.sleep() 把时间读出来
  • C. 用 time.ctime() 相减
  • D. 用 random.random() 相减
答案:A。time.time() 返回「从 1970 年至今的秒数」,取两次相减就是中间那段的耗时,像秒表一样。sleep() 是让程序等待、不返回时间;ctime() 给的是给人看的文字,不能相减。

8要从 6 个人的名单里抽出 3 名不同的获奖者(不能重复),用哪个函数?

  • A. random.choice(names) 抽三次
  • B. random.choices(names, k=3)
  • C. random.shuffle(names) 再 print(names)
  • D. random.sample(names, 3)
答案:D。sample(names, 3) 一次抽 3 个,保证互不重复,原名单也不动。选项 B 的 choices 允许重复,可能抽到同一人——发奖就出事故了。选项 C 只是把顺序打乱,并没有「选出 3 个」。

9想得到一个 0 到 1 之间的随机小数,应该用哪个?

  • A. random.randint(0, 1)
  • B. random.random()
  • C. random.random(0, 1)
  • D. random.decimal()
答案:B。random.random() 括号里什么都不填,返回 0 到 1 之间的小数。选项 A 只能得到 0 或 1 两个整数;C 给它填了参数,会报 TypeError: Random.random() takes no arguments——想要 1~10 的小数要用 random.uniform(1, 10);D 的函数根本不存在。

10time.strftime('%A') 打印出来的是 Monday,想要中文的「星期一」该怎么办?

  • A. 换成 time.strftime('%W') 就是中文了
  • B. 用 time.strftime('%a'),缩写会自动变中文
  • C. 自己做一个中文星期列表,用 now.tm_wday 当下标去取
  • D. 先 import 中文语言包,再重新调用 strftime
答案:C。%A、%B 只输出英文,标准库不带中文。做法是建一张 ['星期一', …, '星期日'] 的列表,用 time.localtime().tm_wday 当下标——它规定星期一是 0,刚好和列表下标对齐。