# -*- coding:utf-8 -*-import re,sysdef compute_exponent(arg): """ 操做指數 :param expression:表達式 :return:計算結果 """ val = arg[0] pattern = re.compile(r'\d+\.?\d*[\*]{2}[\+\-]?\d+\.?\d*') mch = pattern.search(val) if not mch: return content = pattern.search(val).group() if len(content.split('**'))>1: n1, n2 = content.split('**') value = float(n1) ** float(n2) else: pass before, after = pattern.split(val, 1) new_str = "%s%s%s" % (before,value,after) arg[0] = new_str compute_exponent(arg)def compute_mul_div(arg): """ 操做乘除 :param expression:表達式 :return:計算結果 """ val = arg[0] pattern = re.compile(r'\d+\.?\d*[\*\/\%\/\/]+[\+\-]?\d+\.*\d*') mch = pattern.search(val) if not mch: return content = pattern.search(val).group() if len(content.split('*'))>1: n1, n2 = content.split('*') value = float(n1) * float(n2) elif len(content.split('//'))>1: n1, n2 = content.split('//') value = float(n1) // float(n2) elif len(content.split('%'))>1: n1, n2 = content.split('%') value = float(n1) % float(n2) elif len(content.split('/'))>1: n1, n2 = content.split('/') value = float(n1) / float(n2) else: pass before, after = pattern.split(val, 1) new_str = "%s%s%s" % (before,value,after) arg[0] = new_str compute_mul_div(arg)def compute_add_sub(arg): """ 操做加減 :param expression:表達式 :return:計算結果 """ while True: if arg[0].__contains__('+-') or arg[0].__contains__("++") or arg[0].__contains__('-+') or arg[0].__contains__("--"): arg[0] = arg[0].replace('+-','-') arg[0] = arg[0].replace('++','+') arg[0] = arg[0].replace('-+','-') arg[0] = arg[0].replace('--','+') else: break if arg[0].startswith('-'): arg[1] += 1 arg[0] = arg[0].replace('-','&') arg[0] = arg[0].replace('+','-') arg[0] = arg[0].replace('&','+') arg[0] = arg[0][1:] val = arg[0] pattern = re.compile(r'\d+\.?\d*[\+\-]{1}\d+\.?\d*') mch = pattern.search(val) if not mch: return content = pattern.search(val).group() if len(content.split('+'))>1: n1, n2 = content.split('+') value = float(n1) + float(n2) else: n1, n2 = content.split('-') value = float(n1) - float(n2) before, after = pattern.split(val, 1) new_str = "%s%s%s" % (before,value,after) arg[0] = new_str compute_add_sub(arg)def compute(expression): """ 操做加減乘除 :param expression:表達式 :return:計算結果 """ inp = [expression,0] # 處理表達式中的指數 compute_exponent(inp) # 處理表達式中的乘除求餘等 compute_mul_div(inp) # 處理表達式的加減 compute_add_sub(inp) if divmod(inp[1],2)[1] == 1: result = float(inp[0]) result = result * -1 else: result = float(inp[0]) return resultdef exec_bracket(expression): """ 遞歸處理括號,並計算 :param expression: 表達式 :return:最終計算結果 """ pattern = re.compile(r'\(([\+\-\*\/\%\/\/\*\*]*\d+\.*\d*){2,}\)') # 若是表達式中已經沒有括號,則直接調用負責計算的函數,將表達式結果返回,如:2*1-82+444 #if not re.search('\(([\+\-\*\/]*\d+\.*\d*){2,}\)', expression): if not pattern.search(expression): final = compute(expression) return final # 獲取 第一個 只含有 數字/小數 和 操做符 的括號 # 如: # ['1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'] # 找出:(-40.0/5) content = pattern.search(expression).group() # 分割表達式,即: # 將['1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'] # 分割更三部分:['1-2*((60-30+( (-40.0/5) *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'] before, nothing, after = pattern.split(expression, 1) print('before:',expression) content = content[1:len(content)-1] # 計算,提取的表示 (-40.0/5),並活的結果,即:-40.0/5=-8.0 ret = compute(content) print('%s=%s' %( content, ret)) # 將執行結果拼接,['1-2*((60-30+( -8.0 *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'] expression = "%s%s%s" %(before, ret, after) print('after:',expression) print("="*10,'上一次計算',"="*10) # 循環繼續下次括號處理操做,本次攜帶者的是已被處理後的表達式,即: # ['1-2*((60-30+ -8.0 *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'] # 如此周而復始的操做,直到表達式中再也不含有括號 return exec_bracket(expression)# 使用 __name__ 的目的:# 只有執行 python index.py 時,如下代碼才執行# 若是其餘人導入該模塊,如下代碼不執行if __name__ == "__main__": flag = True while flag: calculate_input = input('\033[32m請輸入計算的表達式 | (退出:q)\033[0m') calculate_input = re.sub('\s*','',calculate_input) if len(calculate_input) == 0: continue elif calculate_input == 'q': sys.exit('退出程序') elif re.search('[^0-9\.\-\+\*\/\%\/\/\*\*\(\)]',calculate_input): print('\033[31m 輸入錯誤,請從新輸入!!!\033[0m') else: result = exec_bracket(calculate_input) print('最後計算結果是: %s' % result)