You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:00:05