Python多输入场景异常处理:BMI计算器输入错误仅重填错误项实现
问题核心原因
你当前的代码将身高、体重两次输入逻辑放在同一个try块中,任意一个输入触发ValueError都会中断整个块的逻辑,重新调用完整的计算函数,自然会要求用户重新输入所有项。同时你重复定义了逻辑完全一致的两个计算函数,也存在代码冗余问题。
优化后可实现需求的代码
import time # 单独封装带数值校验的输入函数,输错只会重输当前项 def get_valid_number(prompt: str) -> float: while True: try: return float(input(prompt)) except ValueError: print("请输入有效的数字") def calculate_bmi(): height = get_valid_number("请输入你的身高(单位:厘米):") weight = get_valid_number("请输入你的体重(单位:千克):") bmi = weight / (height / 100) ** 2 print(f"你的BMI值为:{round(bmi, 1)}") if bmi <= 18.5: print("你体重偏轻") elif bmi <= 24.9: print("你的体重在健康范围") elif bmi <= 29.9: print("你体重超重") else: print("你属于肥胖范畴") def main(): print("BMI计算器") while True: calculate_bmi() # 询问是否再次使用 while True: user_choice = input("你想要再次计算吗?(yes/y/no/n):").lower() if user_choice in ['yes', 'y', 'no', 'n']: break print("请输入有效的选项") if user_choice in ['no', 'n']: print("祝你生活愉快!") time.sleep(1) break if __name__ == "__main__": main()
主要优化点
- 单独封装了数值输入校验函数,每个输入项出错只会循环当前输入环节,已正确输入的内容不会丢失
- 删掉了重复冗余的代码,所有计算逻辑只需要维护一份
- 改用循环代替原有递归调用的逻辑,避免输入错误次数过多导致递归深度溢出的问题
- 统一了交互逻辑,整体运行流程更清晰
内容的提问来源于stack exchange,提问作者Lyoshka
相关产品推荐
相关产品推荐

