Python燃料百分比计算代码正确输入后仍重复请求问题排查
问题描述
这段Python代码用于处理分数输入,输出对应燃油箱状态:
- 输入
1/2返回50%,输入1/1返回F - 规定输入无效分数(如
2/1这类分子大于分母的情况)时,需提示重新输入
但测试时出现异常:输入错误内容后再输入正确值,代码仍会继续请求输入,直到多次输入后才返回结果。测试执行过程:
(base) @user:~/Desktop$ python fuel.py Fraction:2/1 Fraction:1/2 Fraction:1/5 20%
原代码
def main(): fraction = get_fraction() if fraction > 0.9: print("F") elif fraction < 0.1: print("E") else: print("%i%%" % int(round(fraction * 100))) def get_fraction(): while True: try: fraction = input("Fraction:") up, down = fraction.split("/") if int(up) > int(down): get_fraction() else: return float(up) / float(down) except ValueError or ZeroDivisionError: pass main()
问题原因
- 递归调用的返回值未被处理:当输入
2/1触发int(up) > int(down)时,代码递归调用get_fraction()。递归的函数实例即使得到正确输入并返回结果,这个结果也不会被上层的函数实例接收,上层的while True循环会继续执行,再次请求输入。只有最外层的循环接收到正确输入时,才会返回最终结果。 - 异常捕获写法错误:
except ValueError or ZeroDivisionError等价于except ValueError,因为or运算会返回第一个真值,导致ZeroDivisionError不会被捕获。
修复方案
移除递归逻辑,改用continue进入下一次循环;同时修正异常捕获的语法:
def main(): fraction = get_fraction() if fraction > 0.9: print("F") elif fraction < 0.1: print("E") else: print("%i%%" % int(round(fraction * 100))) def get_fraction(): while True: try: fraction = input("Fraction:") up, down = fraction.split("/") up_int = int(up) down_int = int(down) # 检查分子大于分母或分母为0的情况,直接进入下一轮循环 if up_int > down_int or down_int == 0: continue return up_int / down_int except (ValueError, ZeroDivisionError): # 捕获无效输入或除零错误,直接进入下一轮循环 pass main()
内容的提问来源于stack exchange,提问作者Leandro
相关产品推荐
相关产品推荐

