實現一個簡單的計算器,代碼如下:
下面的函數用來檢驗數學表達式的合規性,當然此處只實現兩個檢驗:(1)括號應該閉合 (2)不能出現字母
def check_expression(str):check_result = Trueif str.count('(') != str.count(')'):print('表達式有誤:括號未閉合!請重新輸入')check_result = Falseelif re.findall('[a-z]',str.lower()):print('表達式含有非法字符!請重新輸入')check_result = Falsereturn check_result
下面的函數用來將表達式格式化:此處實現以下幾個功能
def format_expression(str):str = str.replace('--','+')str = str.replace('+-','-')str = str.replace(' ', '') #用空字符代替空格return str
計算乘除的函數
def calc_mul_div(str1):mul_div_exp = '\d+\.?\d*[*/]-?\d+\.?\d*' #匹配一個帶/*的表達式while re.findall(mul_div_exp,str1) != []: #當能找到這樣的表達式時,進行以下計算search_exp=re.search(mul_div_exp,str1).group() #先匹配一個if search_exp.count('*') == 1: #如果表達式中帶的是*x,y = search_exp.split('*') #則用*分割mul_result = str(float(x) * float(y)) #進行計算str1 = str1.replace(search_exp,mul_result) #用計算結果代替匹配的表達式str1 = format_expression(str1) #再次格式化else: #如果表達式中帶的是不是*,那就必然是/x, y = search_exp.split('/')div_result = str(float(x) / float(y))str1 = str1.replace(search_exp, div_result)str1 = format_expression(str1)return str1
計算加減的函數
1 def calc_add_sub(str1): 2 add_sub_exp = '-?\d+\.?\d*[+-]-?\d+\.?\d*' 3 while re.findall(add_sub_exp,str1) != []: 4 search_exp = re.search(add_sub_exp,str1).group() 5 if search_exp.count('+') == 1: 6 x,y = search_exp.split('+') 7 add_result = str(float(x) + float(y)) 8 str1 = str1.replace(search_exp,add_result) 9 str1 = format_expression(str1) 10 else: 11 num = search_exp.split('-') 12 if len(num) == 3: #像-3-5這樣的式子,用減號會分割出三個元素,所以要進行判斷 13 sub_result = 0 14 for i in num: 15 if i != '': 16 sub_result -= float(i) 17 else: 18 x,y = search_exp.split('-') 19 sub_result = float(x) - float(y) 20 sub_result = str(sub_result) 21 str1 = str1.replace(search_exp,sub_result) 22 str1 = format_expression(str1) 23 return str1
下面是計算器工作流程
1 while True: 2 exp = input('請輸入表達式:') 3 if check_expression(exp) == True: #檢驗表達式 4 format_expression(exp) #將表達式格式化 5 while exp.count('(') >0: #當有括號時,先找到最里層括號,再計算 6 inner_exp = re.search('\([^()]+\)',exp).group() #匹配最里層括號的表達式 7 mul_div_ret = calc_mul_div(inner_exp) #先算乘除 8 add_sub_ret = calc_add_sub(mul_div_ret) #再算加減 9 exp = format_expression(exp.replace(inner_exp,add_sub_ret[1:-1])) 10 else: #當沒有括號時,直接計算 11 mul_div_ret = calc_mul_div(exp) # 先算乘除 12 add_sub_ret = calc_add_sub(mul_div_ret) # 再算加減 13 calc_ret = exp.replace(exp,add_sub_ret) 14 print('The result is:',calc_ret) 15 else: #如果沒有通過檢驗,讓用戶重新輸入 16 continue
?
?
?
?