用python编写一个计算器
# 1 - 2 * ((60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2)))
# 通过Python实现,自动判断括号以及加减乘除的运算优先级,得出运算结果,显示运算步骤
import re def atom_cal(exp): if '*' in exp: #计算单个的乘法 a,b = exp.split('*') return str(float(a) * float(b)) elif '/' in exp: #计算单个的除法 a, b = exp.split('/') return str(float(a) / float(b)) def format_exp(exp): #处理符号的问题 exp = exp.replace('--','+') exp = exp.replace('+-','-') exp = exp.replace('-+','-') exp = exp.replace('++','+') return exp def mul_div(exp): #计算乘除法 while True: ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp) #利用正则表达式匹配乘或除法 if ret: #如果匹配到的话 atom_exp = ret.group() #将这个值拿出来 res = atom_cal(atom_exp) #利用上面的atom_exp计算 exp = exp.replace(atom_exp,res) #将计算的结果把原来算法替换掉 else:return exp #如果匹配不到的话说明乘除法计算完毕,返回计算结果 def add_sub(exp): #计算加减法 ret = re.findall('[+-]?\d+(?:\.\d+)?', exp) #利用正则表达式算式中的带符号的每项数字,返回一个列表 exp_sum = 0 for i in ret: exp_sum += float(i) #将列表中的每一项求和 return exp_sum def cal(exp): #计算加减乘除混合运算 exp = mul_div(exp) #调用mul_div函数先计算乘除法 exp = format_exp(exp) #调用format_exp处理计算时候的符号 exp_sum = add_sub(exp) #调用 add_sub计算加减法 return exp_sum # float #返回计算结果 def main(exp): exp = exp.replace(' ','') #删除字符串中的空格 while True: ret = re.search('\([^()]+\)',exp) #匹配括号 if ret : #如果匹配到括号的话 inner_bracket = ret.group() #将匹配到的括号内容取出来 res = str(cal(inner_bracket)) #调用cal()计算括号中的内容,将返回结果转换成字符串 exp = exp.replace(inner_bracket,res) #将匹配到的括号内容用计算器结果替换 exp = format_exp(exp) #处理符号 else:break #直到没有括号跳出循环 return cal(exp) #将剩下的内容进行计算,然后返回 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' ret = main(s) print(ret,type(ret))