importre#计算器基本功能函数定义#幂运算:**
defpower(f):'''幂运算,power
:param f: 需要运算的公式,如:f = '2**3'
:return: 幂运算的结果f,str'''
#print(f,type(f)) #测试用
ret = re.split('\*\*',f)if len(ret) == 2:
f= str(float(ret[0])**float(ret[1]))returnf#乘除运算:*|
defcheng_chu(f):'''乘法和除法是同级运算,本函数进行乘除法运算并返回结果。
:param f: 待运算的公式,如2*3、3/4。
:return: 运算结果f,str'''ret= re.split(r'([*/])', f)if len(ret) == 3:if ret[1] == '*':
f= str(float(ret[0]) * float(ret[2]))else:
f= str(float(ret[0]) / float(ret[2]))returnf#加减运算:+-
defjia_jian(f):'''加法和减法是同级运算,本函数进行加减法运算并返回结果。
:param f: 待运算的公式,如2+3、3-4。
:return: 运算结果f,str'''ret= re.split('([+-])', f)if len(ret) == 3:if ret[1] == '+':
f= str(float(ret[0]) + float(ret[2]))else:
f= str(float(ret[0]) - float(ret[2]))returnf#不含()的公式运算#使用自定义函数power()、cheng_chu()、jia_jian()
defno_bracket_formula(fa):'''完成不带括号的公式运算,如:'1+3-3*2'。
:param fa: 待运算的公式,str
:return: 返回运算结果,str'''
#print(fa) # 测试用
#首先,进行幂运算
whileTrue:
ret= re.split('(\d+\.?\d*\*\*\d+\.?\d*)',fa,1)#print(ret) # 测试用
if len(ret) == 3:
ret[1] = power(ret[1])
fa= ret[0] + ret[1] + ret[2]#print(fa) # 测试用
continue
else:break
#print(fa,type(fa)) # 测试用
#其次,进行乘法和除法运算
whileTrue:
ret= re.split('(\d+\.?\d*[*/]\d+\.?\d*)',fa,1)#print(ret) # 测试用
if len(ret) == 3:
ret[1] = cheng_chu(ret[1])
fa= ret[0] + ret[1] + ret[2]#print(fa) # 测试用
continue
else:break
#print(fa, type(fa)) # 测试用
#最后,进行加减运算
whileTrue:if fa == re.match('[-+]?\d+\.?\d*', fa): #只剩下一个数值时,结束
break
else: #不止一个数值时,继续运算
ret = re.split('(\d+\.?\d*)',fa,2) #找到需要运算的两个数值,切割
#print('ret=',ret) # 测试用
if len(ret) == 5:if (ret[0] == ret[2]) or (ret[0] == '' and ret[2] == '+') :
fa= str(ret[0] + jia_jian(ret[1] + '+' + ret[3]) + ret[4])else:
fa= str(ret[0] + jia_jian(ret[1] + '-' + ret[3]) + ret[4])#print(fa) # 测试用
continue
else:break
#print(fa, type(fa)) # 测试用
#返回运算结果
returnfadefmain(fa):'''完成数学公式的运算。
思路:使用re.split()先计算()内部运算式;在求总体结果。
:param fa: 需要进行运算的公式
:return: 公式计算结果'''
whileTrue:#找出进行运算的()内公式
ret = re.split('\(([^()]+)\)',fa,1)#运算()公式,结果替换原公式中()部分
if len(ret) == 3:
ret[1] = str(no_bracket_formula(ret[1]))
fa= ret[0] + ret[1] + ret[2]continue
else:break
returnno_bracket_formula(fa)
#函数调用,进行公式运算,并返回结果
fa = '10**3+(20-(3*5)**(2.4/4.2))/5.5+5-(4*2-3)'ret=main(fa)print(fa,'=',ret)print(eval(fa)) #测试用