Python开发BMI计算器时,有没有无需重复while循环的更简便用户输入校验方法?
输入校验的简便实现方案
完全可以通过抽取通用可复用函数的方式,把两段一模一样的while校验逻辑合并,不用重复写冗余的循环代码。
核心优化逻辑
你当前代码里,身高校验和体重校验的流程是完全一致的:
- 给用户弹出输入提示
- 尝试把用户输入转成float类型
- 转换失败就弹错误提示,重新等待用户输入
- 转换成功就拿到合法数值跳出循环
我们只需要把这套流程封装成一个独立的小函数,后续不管是要获取身高、体重,还是其他需要合法浮点输入的场景,直接调用函数即可,主流程里完全不需要重复写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
相关产品推荐
相关产品推荐

