实现一个简单的计算器,代码如下:
下面的函数用来检验数学表达式的合规性,当然此处只实现两个检验:(1)括号应该闭合 (2)不能出现字母
def check_expression(str): check_result = True if str.count('(') != str.count(')'): print('表达式有误:括号未闭合!请重新输入') check_result = False elif re.findall('[a-z]',str.lower()): print('表达式含有非法字符!请重新输入') check_result = False return 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