紧接着再来两题。
第五十七题,数字猜谜游戏:
#编写一个程序,实现数字猜谜并测试反应速度。该程序会生成一个0到99之间的随机数字供用户猜测,通过实时反馈引导用户直至猜中。同时程序会记录用户猜测耗时,并在游戏结束时提供表现反馈
# 猜数字游戏(按 57 题要求优化:0-99 随机数、记录猜测耗时、结束提供表现反馈)
import random
import time
random_num = random.randint(0, 99) # 随机生成一个 0 到 99 的随机数
print('欢迎来到猜数字游戏!我想好了一个 0 到 99 之间的数字,猜猜看!')
start_time = time.time() # 记录游戏开始的时间
count = 0 # 记录猜测次数
while True:
num = int(input('请输入你猜的数字:'))
count += 1 # 每猜一次,计数器加 1
if num > random_num:
print('猜大了')
elif num < random_num:
print('猜小了')
else:
end_time = time.time() # 猜中的时刻
total_time = round(end_time - start_time, 2)
print(f'恭喜!猜对了,答案就是 {random_num}')
print(f'你一共猜了 {count} 次,总耗时:{total_time} 秒')
# 根据用时和次数给出发表现反馈
if total_time <= 30 and count <= 7:
print('表现反馈:太厉害了,简直是猜神!')
elif total_time <= 60 and count <= 15:
print('表现反馈:不错哦,稳扎稳打!')
else:
print('表现反馈:重在参与,下次一定更快!')
break
# Deleted:print('随机生成的数字是:',random_num)
这个代码其实很早我就写过一个版本了,这次做练习题又遇到一次,所以给它做了一个优化版本的代码,代码思路分析如下:
题目要求:生成 0 到 99 的随机数供用户猜测,实时反馈引导直至猜中;记录猜测耗时,游戏结束时提供表现反馈。
我的定位:这不是新游戏,是一场"合题"
猜数字我在第二章就写过雏形(随机数 + 循环 + 比大小)。这次 57 题的新要求------限时 0-99、记录耗时、表现反馈------恰好把系列里学过的零件全用上了:random 家族的抽签、43/44 题的循环交互、52 题的掐表减法。我做的是把散落的技能点拼成一个"像真游戏"的东西。
骨架:一个循环当裁判
主体仍是 while True:每轮收一个输入、和秘密数字比大小,大了提示、小了引导,猜中才 break 退场------循环在这里扮演"实时反馈引导"的裁判。范围选 randint(0, 99) 正好 100 个数,这个数是后面评级门槛的由来。另外我把原代码结尾那行"打印答案"删了:游戏已经亲口恭喜玩家并报出答案,再泄底一次既多余也破坏仪式感。
两个记录员:秒表和计数牌
游戏开始前,我按下 52 题那套三明治掐表的头表(存开始时间),同时在猜中的分支里按尾表、相减得总耗时------秒表从"给代码计时"摇身变成"给玩家计时"。旁边再立一个 count 变量,每轮加一,累加器老套路。两个数字凑成玩家的"成绩单"。
评级逻辑:这次我用 AND 而不是 OR
表现反馈分三档,最高档的条件是"30 秒内且 7 次内"。这里的"且"是刻意选的:评级是对玩家的双重考核,手快和脑子清楚缺一不可------只要一样不行就不配"猜神"。回想 44 题验证年龄时我用的是 OR,因为"任一违规即非法";两个场景逻辑方向正好相反,一个奖优、一个罚错,这是我最想提醒新手辨析的一处。数字门槛本身也有出处:100 个数二分查找理论最优约 7 次,30 秒则留给打字反应时间。
总结
一句话:循环当裁判、随机数当题目、掐表和计数当记分员、条件评级当颁奖词。单看每个零件都学过,拼到一起却第一次有了"产品"的味道------这种旧零件组装新玩具的感觉,大概就是练题的意义。
第五十八题,解析日期字符串为日期时间对象:
#编写一个程序,解析给定的日期字符串“Aug 28 2025 8:00 AM”,并打印出解析后的日期时间对象
#导入模块(用于实现日期字符串解析)
from dateutil import parser
#给定日期字符串
date_string = 'Aug 28 2025 8:00 AM'
#将日期字符串解析为日期时间对象
parsed_date = parser.parse(date_string)
#打印解析后的日期时间对象
print(parsed_date)
代码思路分析如下:
题目要求:解析给定的日期字符串 "Aug 28 2025 8:00 AM",打印解析后的日期时间对象。
我的第一反应:这活儿 54 题干过,但这次我不想自己报格式
看到"字符串变日期对象",我立刻想到 54 题的 strptime------但它有个死规矩:你必须亲手写一张一模一样的格式模板,%Y-%m-%d 少个分隔符都翻脸报错。可这题的输入是英式写法"Aug 28 2025 8:00 AM",月份是英文缩写、还带 AM/PM,要手写模板得查半天符号。
于是我换了思路:与其我教程序怎么读,不如找个本来就"识字"的工具------第三方模块 dateutil 里的 parser.parse(),把字符串整颗丢进去,它自己认出月份缩写、日期、12 小时制,直接吐出完整的日期时间对象。一句代码顶我拼半天的模板。
一个新身份:这是我第一次用"别人装的模块"
time、random 都是 Python 自带的标准库,拿来就用;而 dateutil 是第三方模块,得先用 pip 安装才能 import,而且安装名和导入名还不一样------装的是 python-dateutil, import 的却是 dateutil。这个坑我在笔记里特意标了一句,新手很容易在这里卡住找不到模块。
和 54 题的分歧:老实翻译 vs 智能翻译
54 题的 strptime 像填表格:格式严丝合缝才放行,胜在精确、零依赖,适合处理自己系统产出的规整时间。parser.parse 像请了个管家:乱七八糟的写法都能猜个八九不离十,适合应付来路不明的外部输入。代价是它猜的边界情况(比如 2 位的日月先后)未必合你心意,而且要多装一个包。我的结论:格式已知用 strptime,格式五花八门才请 dateutil 出山。
总结
一句话:把"我懂格式"变成"工具懂人话"。这题教会我的与其说是某个函数,不如说是选工具的判断力------先问"输入规不规整",再决定用模板硬翻译还是用智能解析兜底。