while循环中Try-except语句失效及时间转换函数逻辑异常求助
12小时制转24小时制代码问题修复
原代码存在的核心问题
- 输入逻辑错误:仅在循环外获取一次输入,报错后无法重新收集有效输入,导致程序陷入无效重试
- 类型不匹配:将字符串类型的
hour直接与整数12比较,所有时间分支判断全部失效 - 格式不规范:分钟为个位数时输出格式不一致(如
0:5而非00:05) - 容错性差:未处理
meridiem的大小写输入,也未校验小时/分钟的合法范围
修正后的代码
def convert_12_to_24(hour, minute, meridiem): # 统一转换为大写,兼容任意大小写输入 meridiem = meridiem.upper() # 12AM 转为00点 if hour == 12 and meridiem == 'AM': print(f"00:{minute:02d}") # 12PM 保持12点 elif hour == 12 and meridiem == 'PM': print(f"12:{minute:02d}") # 其他PM时间,小时加12 elif meridiem == 'PM': print(f"{hour + 12}:{minute:02d}") # 其他AM时间,直接格式化输出 else: print(f"{hour:02d}:{minute:02d}") while True: try: # 每次循环重新获取输入,确保错误后可重新输入 hour = int(input("Hour: ").strip()) minute = int(input("Minute: ").strip()) meridiem = input("AM or PM: ").strip() # 校验输入合法性 if not (1 <= hour <= 12): raise ValueError("小时必须是1-12之间的整数") if not (0 <= minute <= 59): raise ValueError("分钟必须是0-59之间的整数") if meridiem.upper() not in ('AM', 'PM'): raise ValueError("请输入AM或PM(大小写均可)") convert_12_to_24(hour, minute, meridiem) break # 转换成功,退出循环 except ValueError as e: print(f"\n错误:{str(e)},请重新输入!")
关键修改说明
- 输入循环重构:将输入逻辑移入
while True循环内部,每次报错后重新提示用户输入,解决无法重新执行的问题 - 类型处理与校验:直接将小时/分钟转换为整数,同时校验合法范围,避免无效输入进入转换逻辑
- 分支逻辑修正:使用整数类型的
hour进行判断,确保12AM/12PM等特殊情况正确触发 - 格式统一:使用f-string的
{:02d}格式化,确保小时/分钟始终显示为两位数字 - 容错性优化:将
meridiem转换为大写,兼容任意大小写输入;捕获具体的ValueError,避免隐藏未知错误 - 错误提示优化:直接告知用户具体错误原因,而非泛泛的格式提示
内容的提问来源于stack exchange,提问作者AspectST
相关产品推荐
相关产品推荐

