需求: 计算加减乘除和小括号级别的运算,需考虑到正负数
运算优先级:括号>乘除>加减
流程图:
主函数:
if __name__ == '__main__': exp = str(input('请输入公式:\n>>')) # 测试公式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) exp = exp.split() exp = ''.join(exp) exp = exp.strip() print(exp) figure_up(exp)
获取里层括号公式:
def figure_up(exp_get): flag_exit = False while not flag_exit: every_percent = re.search('\([^()]*\)', exp_get) # 获取里层括号部分 if every_percent: formula = every_percent.group().strip('()') # 对获取部分去括号处理 ret = calculate(formula) exp_get = exp_get.replace(every_percent.group(), str(ret)) else: ret_end = calculate(exp_get) print('最终结果为:', ret_end) flag_exit = True
无括号运算:
def calculate(expression): expression = symbol_fix(expression) symbol_list = re.findall('[+-]', expression) # 取+-运算符和正负号 mul_div_list = re.split('[+-]', expression) # 按+-运算符和正负号分割 if not mul_div_list[0]: # 开头为负号的情况, 列表压缩处理 mul_div_list[1] = symbol_list[0] + mul_div_list[1] del mul_div_list[0] del symbol_list[0] symbol_list, mul_div_list = minus_fix(symbol_list, mul_div_list) for index, item in enumerate(mul_div_list): ret = mul_div(item) mul_div_list[index] = ret # 乘除计算完毕,并成功替换,开始计算加减 if len(symbol_list): ret_end = None for index, item in enumerate(mul_div_list): if index: if symbol_list[index - 1] == '+': ret_end += float(item) elif symbol_list[index - 1] == '-': ret_end -= float(item) else: ret_end = float(mul_div_list[0]) return ret_end else: return mul_div_list[0]
乘除运算:
def mul_div(formula): # 乘除运算 if re.search('[*/]', formula): list_items = re.split('[*/]', formula) list_symbol = re.findall('[*/]', formula) ret = None for index, item in enumerate(list_items): if index: if list_symbol[index-1] == '*': ret *= float(item) elif list_symbol[index-1] == '/': ret /= float(item) else: ret = float(item) return ret else: return formula
去除重复加减号:
def symbol_fix(formula): # 去除重复加减号 formula = ''.join(formula) formula = formula.strip() formula = formula.replace('--', '+') formula = formula.replace('-+', '-') formula = formula.replace('+-', '-') formula = formula.replace('++', '+') return formula
乘除符号后面接负号的情况:
def minus_fix(symbol, expression): # */ 后面接负号的情况, 列表压缩处理 for index, item in enumerate(expression): if item.endswith('*') or item.endswith('/'): expression[index] = expression[index] + symbol[index] + expression[index+1] del expression[index+1] del symbol[index] return symbol, expression