Python递归表达式计算函数的括号处理异常问题求助
递归表达式计算函数的问题修复
问题现象
- 输入含方括号的表达式时,仅解析方括号内内容,忽略前后部分
- 输入
[2+2]+[2+2]返回None - 输入
[2+3]*2仅输出括号内结果5
原代码
def divide(a, b): return a/b def pow(a, b): return a**b def addA(a, b): return a+b def subA(a, b): return a-b def mul (a, b): return a*b operators = { '+': addA, '-': subA, '*': mul, '/': divide, '^' : pow, } def calculate(s): if s.isdigit(): return float(s) elif '[' in s: start = s.index('[') end = s.rindex(']') return calculate(s[start + 1:end]) for c in operators.keys(): left, operator, right = s.partition(c) if operator in operators: return operators[operator](calculate(left), calculate(right)) calc = input("Type calculation:\n") print("Answer: " + str(calculate(calc)))
问题根源
- 方括号处理逻辑错误:只要表达式包含
[,就直接截取首尾括号内的内容返回,完全忽略括号外的运算符和操作数,导致外部运算被丢弃。 - 无运算符优先级处理:按字典插入顺序遍历运算符,会导致加减先于乘除计算,不符合数学规则;同时
partition仅提取第一个匹配的运算符,无法处理右结合的幂运算。 - 无匹配分支返回None:当表达式无法匹配数字、方括号或运算符时,函数无返回值,默认返回
None。
修复后的代码
def divide(a, b): return a / b def pow(a, b): return a ** b def addA(a, b): return a + b def subA(a, b): return a - b def mul(a, b): return a * b # 按运算符优先级从高到低排序,优先级:^ > *、/ > +、- operators = [ ('^', pow), ('*', mul), ('/', divide), ('+', addA), ('-', subA), ] def calculate(s): # 去除空格,增强输入兼容性 s = s.replace(" ", "") # 判断是否为纯数字(支持小数) if s.replace('.', '', 1).isdigit(): return float(s) # 处理方括号:优先解析最内层括号,计算后替换回原表达式 if '[' in s: # 定位最内层的[及其对应的] start = s.rindex('[') end = s.index(']', start) # 计算括号内结果并替换原括号部分,递归处理新表达式 inner_result = calculate(s[start+1:end]) return calculate(s[:start] + str(inner_result) + s[end+1:]) # 按优先级遍历运算符,处理右结合的幂运算时从右往左查找 for op, func in operators: if op == '^': idx = s.rfind(op) else: idx = s.find(op) # 跳过表达式开头的负号(如-3+5) if idx == 0: continue if idx != -1: left = s[:idx] right = s[idx+1:] return func(calculate(left), calculate(right)) # 表达式无效时抛出异常 raise ValueError(f"无法解析的表达式: {s}") try: calc = input("Type calculation:\n") result = calculate(calc) # 整数结果转为整数格式输出,否则保留浮点数 print("Answer: " + (str(int(result)) if result.is_integer() else str(result))) except ValueError as e: print(f"错误: {e}")
验证示例
- 输入
[2+2]+[2+2],输出:Answer: 8 - 输入
[2+3]*2,输出:Answer: 10 - 输入
[3^2]+[10/2],输出:Answer: 14
内容的提问来源于stack exchange,提问作者bob999
相关产品推荐
相关产品推荐

