搞定了蛇娘游戏的基本框架后,今天我终于可以来更新练习题目了,记录两题如下。
第四十三题,整数输入验证:
#定义一个函数,该函数用于尝试将用户输入的字符串转化成整数,如果转换成功,则返回整数,如果转换失败,则返回错误信息
#定义函数
def string_to_int():
"""
该函数用于尝试将用户输入的字符串转化成整数,如果转换成功,则返回整数,如果转换失败,则返回错误信息
:return: 整数或错误信息
"""
while True:
try:
# 接收用户输入信息
num = int(input('请输入一个整数:'))
return num # 转换成功,返回整数并结束函数
except ValueError:
# 转换失败:只提示,不 return,循环会自动进入下一轮重新询问
print('输入错误,请输入一个有效的整数。')
continue
#调用函数
print(string_to_int())
代码块思路解析如下:
我这次的任务是:让用户输入一个整数,但我根本不知道用户会不会乱输,所以他得输对了才罢休。
我是这么想的:
首先,我把这件事封装成了一个函数 string_to_int。这样外面用的时候就特别省事,一句 print(string_to_int()),拿到的保证是个正经整数,我不用在外面操心验证的事。
然后,我担心用户一次输错。 用 if 检查一次明显不够,输了错的总得让他重来吧?所以我上了 while True 死循环:只要还没拿到对的,我就一直问、一直问。那什么时候停呢?------输对了我就 return,函数一结束,循环自然就跳出去了。
接着是最关键的一步:怎么判断输没输对。 用户敲进去的东西永远是字符串,我直接拿 int() 去转。可万一他输了个 "abc",int() 是会当场"报错掀桌子"的。所以我提前用 try / except 布了个防:转换成功,一切照旧;一旦报了 ValueError,程序不会崩,而是被我接住,打印一句"输入错误,请重新输入",然后回到循环开头再问一遍。
你可能注意到我在 except 里写了个 continue。说实话它有点多余------异常处理完,循环本来就会自动进下一轮。我写它只是想表明态度:"这里就是明确地重新开始下一轮",让读代码的人(包括以后的我)一眼看明白。
总结成一句话就是: 我不停地问,试着把输入转成整数;转成了就交差走人,转失败就善意提醒一句,继续问。这就是我应对"用户输入不靠谱"的固定套路------循环 + try/except 组合拳。
第四十四题,验证年龄:
#定义一个函数,该函数接收一个人的年龄作为参数,如果年龄不在正常范围内,则提示异常(小于0或者大于一百五)
#定义函数
def verify_age():
"""
交互式获取并验证年龄:输入非整数或超出 0~150 范围都要求重新输入
:return: 合法时返回年龄整数
"""
while True:
try:
age = int(input('请输入您的年龄:'))
except ValueError:
print('输入错误,年龄必须是整数,请重新输入。')
continue
if age < 0 or age > 150:
print('输入异常!年龄应在 0 到 150 之间,请重新输入。')
continue
return age
#调用函数
print(verify_age())
代码块思路解析如下:
这个任务还是"用户不输对就不罢休",所以我的起手式完全没变:while True 死循环 + try/except 接异常 + 只有成功才 return。
但年龄这个东西,光"是个整数"还不够------用户输个 -5 或者 999,转换是能成功的,可这年龄明显不对劲。所以我在上一题的基础上,多设了一道"范围检查"的关卡。
现在我的循环里实际上要过三关:
第一关:能不能转成整数? 我用 try 包住 int(input(...)),用户输了 "abc" 这种,ValueError 被我接住,打印提示后 continue,回去重问。
第二关:数字合不合范围? 注意我把这个检查放在了 try/except 的外面,用独立的 if 来判。这是有讲究的------except 只在"转换失败"时才触发,正常输个数字根本不进那个分支,范围检查要是塞在里面就永远轮不到执行。
两关都过了,才放行: 走到最后的 return age,函数结束,循环退出,外面 print 拿到一个绝对合法的年龄。
还有个细节我得特意说一句:范围判断我用的是 age < 0 or age > 150,这个 or 不能换成 and。因为一个数不可能"既小于 0 又大于 150",用 and 的话条件永远不成立,等于这道关卡形同虚设。而 or 才是我要的意思------两头随便越哪一边,都算异常。
总结: 和第 43 题同一个骨架,只是我学聪明了------先管"格式对不对"(try/except 管类型),再管"内容合不合理"(独立 if 管范围),哪个不合格就 continue 重来,全合格了才 return 交卷。