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

Python开发BMI计算器时,有没有无需重复while循环的更简便用户输入校验方法?

输入校验的简便实现方案

完全可以通过抽取通用可复用函数的方式,把两段一模一样的while校验逻辑合并,不用重复写冗余的循环代码。

核心优化逻辑

你当前代码里,身高校验和体重校验的流程是完全一致的:

  1. 给用户弹出输入提示
  2. 尝试把用户输入转成float类型
  3. 转换失败就弹错误提示,重新等待用户输入
  4. 转换成功就拿到合法数值跳出循环
    我们只需要把这套流程封装成一个独立的小函数,后续不管是要获取身高、体重,还是其他需要合法浮点输入的场景,直接调用函数即可,主流程里完全不需要重复写while循环的代码块。

优化后完整代码

def get_valid_float_input(prompt: str, error_prompt: str) -> float:
    """
    循环获取用户输入,直到拿到合法的浮点数值
    :param prompt: 给用户的输入提示
    :param error_prompt: 输入非法时的错误提示
    :return: 转换成功的浮点数值
    """
    while True:
        user_input = input(prompt)
        try:
            valid_value = float(user_input)
            # 扩展基础校验规则,避免出现负数、0值导致的计算错误
            if valid_value <= 0:
                print("输入数值不能为负数或0,请重新输入")
                print("")
                continue
            return valid_value
        except ValueError:
            print(error_prompt)
            print("")


if __name__ == "__main__":
    print("#########################################################\n"
          "############## Body Mass Index calculator ###############\n"
          "#########################################################\n")

    # 直接调用函数获取合法输入,主流程无需重复书写while循环
    new_height = get_valid_float_input(
        prompt="Please enter your height in m: ",
        error_prompt="Enter a valid height..."
    )
    new_weight = get_valid_float_input(
        prompt="Please enter your weight in kg: ",
        error_prompt="Enter a valid weight..."
    )

    # 计算BMI并输出结果
    body_mass_index = new_weight / new_height ** 2
    print(f"\nYour BMI is {round(body_mass_index, 2)}")

写法优势

  • 完全消除重复代码,原来两处独立的while校验逻辑,核心规则只需要写1遍
  • 后续如果要调整校验规则(比如限制身高范围在0.5m-2.5m之间,体重范围在20kg-300kg之间),只需要在通用函数里加判断逻辑,不需要逐个修改每个输入的校验块
  • 代码结构更清晰,主流程和校验逻辑拆分,读代码的时候一眼就能看到整个BMI计算的流程,不会被冗余的循环代码打断

对比你原来的代码,这套写法没有改变原有功能,只是去掉了重复的while循环实现,是Python开发中做输入校验的常规最佳实践。


内容的提问来源于stack exchange,提问作者Tomcatn00b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 14:15:04