需求 a.實現加減乘除及拓號優先級解析 b.用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ),計算結果
import re def mul_div(m_d): # 計算乘除公式 for index, member in enumerate(m_d): if "*" in member or "/" in member: oper = re.findall("[*/]", member) calculation = re.split("[*/]", member) num = None for i, e in enumerate(calculation): if num: if oper[i - 1] == "*": num *= float(e) elif oper[i - 1] == "/": num /= float(e) else: num = float(e) m_d[index] = num return m_d def add_sub(oper, num_list): #計算加減公式 num = None for i, n in enumerate(num_list): if num: if oper[i - 1] == "+": num += float(n) elif oper[i - 1] == "-": num -= float(n) else: num = float(n) return num def brackets(formula): #格式化計算公式 formula = re.sub("[()]", "", formula) # 去除兩邊的() formula = formula.replace(" ", "") # 去除空字符 formula = formula.replace("+-", "-") # 定義計算規則,正負得負 formula = formula.replace("--", "+") # 定義計算規則,負負得正 sign = re.findall("[+-]", formula) # 取出公式內加減運算符 m_d = re.split("[+-]", formula) # 以加減運算符切割計算公式,取出帶有'*' '/' if m_d[0] == "": # 若是列表第一個字符爲空,表示一個數字爲負號 m_d[1] = "-" + m_d[1] # 從新定義帶有*/的公式,加上負號 del sign[0] del m_d[0] for index, member in enumerate(m_d): #枚舉列表 if member.endswith("*") or member.endswith("/"): m_d[index] = member + sign[index] + m_d[index + 1] del m_d[index + 1] del sign[index] res=sign, m_d sign = res[0] m_d = res[1] after_m_d = mul_div(m_d) res = add_sub(sign, after_m_d) return res def main(formula): # 主邏輯,循環取出括號內計算公式並進行公式拼接 while True: formula_cut = re.search("\([^()]+\)", formula) if formula_cut: formula_cut = formula_cut.group() res = brackets(formula_cut) # 格式化計算公式 formula = formula.replace(formula_cut, str(res)) # 把括號計算後的內容拼接到計算公式 else: res = brackets(formula) print("\33[31;1m結果:%s\33[0m" % (res)) exit() formula=input(''' 請輸入運算公式: 格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 【Q】 退出 ''') if formula.lower() == 'q': print('計算器已退出') exit() main(formula)
測試效果 請輸入運算公式: 格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 【Q】 退出 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 結果:2776672.6952380957