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

罗马数字转整数转换器多条件If分支执行异常排查

罗马数字转整数转换器:math_logic函数条件判断错误导致TypeError

问题根源:布尔表达式写法错误

你的代码报错核心在于math_logic函数的条件判断不符合Python语法规则,导致输入CCC时错误进入分支,最终函数返回None,与整数相加触发TypeError。

看math_logic里的这类条件:

(char_1 == "D" or "M")

Python会先计算char_1 == "D",如果结果为False,会直接判断字符串"M"——非空字符串在布尔语境下永远为True,所以不管char_1是什么值,这个表达式结果都是True。

当输入CCC时,char_0 = "C",char_1 = "C",第三个elif的条件:

(char_1 == "D" or "M") and (char_0 == "C")

会被解析为True and True,程序错误进入该分支,但分支内的if char_1 == "D"和elif char_1 == "M"都不满足(char_1是"C"),函数没有执行任何return语句,默认返回None。后续total = total + math_logic(...)执行时,整数与None相加就会触发类型错误。

修复方案

修正所有条件表达式,确保or连接的是完整的比较语句,调整后的math_logic函数如下:

def math_logic(char_0, char_1, r_to_i_dict):
    if (char_0 == "I") and (char_1 == "V" or char_1 == "X"):
        if char_1 == "V":
            return 4
        elif char_1 == "X":
            return 9
    elif (char_0 == "X") and (char_1 == "L" or char_1 == "C"):
        if char_1 == "L":
            return 40
        elif char_1 == "C":
            return 90
    elif (char_0 == "C") and (char_1 == "D" or char_1 == "M"):
        if char_1 == "D":
            return 400
        elif char_1 == "M":
            return 900
    else:
        return r_to_i_dict[char_0]

注意:

  • 每个or都连接完整的比较表达式(如char_1 == "V" or char_1 == "X")
  • 调整了第二个elif的条件顺序,先判断前缀字符,逻辑更清晰

额外优化建议

  1. 避免重复调用math_logic:在convert_roman_to_int的循环中,你两次调用了同一逻辑,可以将结果存入变量减少重复计算:
current_val = math_logic(character_list[0], character_list[1], romanToIntDictionary)
if (not did_i_sub) and (item == current_val):
    total += current_val
    # 后续逻辑复用current_val
  1. 简化roman_numeral_checker函数:当前循环逻辑冗余,简化后更高效:
def roman_numeral_checker(string):
    for character in string:
        if character not in romanToIntDictionary:
            return False
    return True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:40:21