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

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()
问题原因
  1. 递归调用的返回值未被处理:当输入2/1触发int(up) > int(down)时,代码递归调用get_fraction()。递归的函数实例即使得到正确输入并返回结果,这个结果也不会被上层的函数实例接收,上层的while True循环会继续执行,再次请求输入。只有最外层的循环接收到正确输入时,才会返回最终结果。
  2. 异常捕获写法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:42:34