一、先认识这两个库
上一篇讲了怎么用 import 把现成的工具箱请进来。这一份就动手用两个最常用、也最好玩的工具箱:
time库——像是你手腕上的手表和秒表:看看现在几点、让程序停下来歇一会儿、量一量一段代码跑了多久。random库——就像一颗骰子或一顶魔术帽:掷一个随机数、从一堆名字里随机抓一个、把一副牌打乱。专门用来制造「不确定」。
两个都是标准库,装好 Python 就有,不用 pip install,写一句 import 就能用。
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() |
二、让程序停一下:time.sleep()
最常用的一个:time.sleep(秒数),让程序原地等一会儿再往下走。
括号里填几,就暂停几秒,可以是小数(0.5 就是半秒)。
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()
要让程序说出「现在是几点几分」,要用两个函数配合:一个负责取时间,一个负责把时间变成好看的文字。
import time
now = time.localtime() # ① 取出当前时间(一大堆数字)
print(now)
text = time.strftime('%Y-%m-%d %H:%M:%S') # ② 变成好看的格式
print(text)
运行结果:
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 刚好能当列表的下标用:
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 日到现在,一共过去了多少秒(带小数)。单独看它没什么意思,但取两次、一减,就是中间那段代码消耗的时间。
就跟体育比赛一样:起跑线看一次表,终点线再看一次表,两个数一减就是成绩。
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) 换成你要测的代码即可——比如一个循环、一次排序,用同样的办法就能比较两种写法谁更快。time.perf_counter() 比 time.time() 更准。用法一模一样:开头取一次、结尾取一次、相减。起步阶段先用 time.time() 就够,见到 perf_counter 能认出来就行。五、掷骰子:random.randint()
random.randint(最小值, 最大值) 会给你一个这个范围内的随机整数,而且两头的数都能取到。
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 个。最常见的用法就是随机点名、随机抽奖。
import random
names = ['小明', '小红', '小刚', '小美']
print(f'请 {random.choice(names)} 同学回答')
print(f'请 {random.choice(names)} 同学回答')
运行结果(两次抽到的人可能相同,因为每次都是独立地抽):
请 小美 同学回答
请 小明 同学回答
把名单换成你们班的同学,这就是一个能直接用的课堂点名器。
random.choice('石头剪刀布') 会随机取到其中一个汉字(因为字符串就是一个个字符排成的队)。random.choices(名单, k=3):一次抽 3 个,而且允许重复(可能抽到同一个人)。注意函数名多了个 s,这个是「复数」的意思,并且必须写 k= 告诉它抽几个。import random
names = ['小明', '小红', '小刚', '小美']
print(random.choices(names, k=3)) # 比如 ['小刚', '小刚', '小红']
七、洗牌:random.shuffle()
random.shuffle(列表) 把列表里的顺序彻底打乱,就像把一副牌哗啦哗啦搓几下。
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 取不到)。最常用在「按概率决定做不做某件事」。
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(名单, 抽几个) 从名单里抽出指定个数,保证互不重复,而且原名单不会被改动。
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 库帮你准备好了,也是标准库、不用装:
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(数字) 就是解决这个问题的:给它一个固定的「种子」,后面所有随机结果就固定下来了,每次运行都一模一样。
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 给出的序列不同,但各自都稳定:
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:终点算不算数
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():整数还是小数
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:倒计时
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:抽奖开奖
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:随机密码生成器
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 negative | sample() 要抽的个数比名单里的人数还多(比如 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)) 打印出 None | shuffle() 是原地打乱、不返回东西。要打印就打 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 题)
点击选项即可判分,答错的题会立刻显示解析。答完可以看到正确率和错题清单,也可以重新答一遍。
1想让程序暂停 1 秒再往下走,应该写哪一句?
- A. time.sleep(1)
- B. time.stop(1)
- C. time.wait(1)
- D. sleep.time(1)
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)
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 只能用于字符串
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)
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 这七个字符
%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. 一直等,直到列表里有东西
IndexError。真实的抽奖程序里,如果名单来自文件或输入,要先用 if not names: 判断一下名单是不是空的,别把空列表直接丢给 choice()。7想测一测一段代码跑了多久,最合适的做法是?
- A. 开头和结尾各取一次 time.time(),两个数相减
- B. 用 time.sleep() 把时间读出来
- C. 用 time.ctime() 相减
- D. 用 random.random() 相减
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)
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()
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
%A、%B 只输出英文,标准库不带中文。做法是建一张 ['星期一', …, '星期日'] 的列表,用 time.localtime().tm_wday 当下标——它规定星期一是 0,刚好和列表下标对齐。