罗马数字转整数转换器多条件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的条件顺序,先判断前缀字符,逻辑更清晰
额外优化建议
- 避免重复调用
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
- 简化
roman_numeral_checker函数:当前循环逻辑冗余,简化后更高效:
def roman_numeral_checker(string): for character in string: if character not in romanToIntDictionary: return False return True
内容的提问来源于stack exchange,提问作者Efefay
相关产品推荐
相关产品推荐

