python开发Day05(计算器代码)
import re def calculator(formula):#定义函数,参数为formula(传进来的公式) print(formula) #输出传进来的参数 a=''#定义一个空的变量字符串,为了将用户传进来的参数中有空格的去掉并重新给a变量公式 for i in formula:#循环传进来的参数 if i == ' ':#判断如果是空就continue进行下一次循环 continue a=a+i#判断不成立就向a变量中添加当前循环的内容 while True:#while循环,使用break退出或者整个函数结束 b=re.search('\([^()]+\)',a)#取出传进来的参数中最里层的括号内容 if b:#判断b是否成立,如果取出了括号是成立向下执行,否则执行函数panduan。 c=b.group()#读取b变量的内容 cc=c[1:-1]#使用切片去掉字符串两边的空格 c2=panduan(formula_2=cc)#将去掉空格的字符串传给panduan函数使用c2变量接收返回值 print(c2)#输出panduan执行后的返回值 a=a.replace(c,c2[0])#将a变量中读取到的c变量内容也就是括号内的内容替换成panduan函数执行的返回值 print(a)#输出修改后的内容 else:#b变量不满足判断 c2=panduan(formula_2=a)#不满足的情况下就是没有括号了所以继续执行panduan函数将返回值给c2 return c2[0]#panduan函数执行完毕后将内容返回并且使用索引取出格式为字符串 def panduan(formula_2):#定义函数panduan,formula_2参数是将公式内最里层的括号内容。 a=re.split('[*/+-]',formula_2)#将传进来的参数按照*/+-切割。 b=re.findall('[*/+-]',formula_2)#在传进来的参数中找到*/+- print(a,b)#输出切割和找到的内容 for k,i in enumerate(a):#循环输出切割出来的内容并加上序号从0开始 if len(i) == 0:#判断这次循环的内容总长度是0 a[k+1] = b[k]+a[k+1]#将切割后内容索引为k+1的改成b变量中k的索引和a变量中k+1的索引,因为如果i是空的那么就代表着这个数是一个负数 del a[k]#删除当前a变量中对应的k索引 del b[k]#删除当前b变量中对应的索引 print(a,b)#输出当前a变量和b变量 abc=chengchu(formula_3=a,yunsuanfu=b)#在上一层循环结束后也就是将负数都恢复加上负号将当前切割后的a变量和b变量传给乘除函数,使用abc变量来接收乘除函数的返回值 return abc#返回abc变量内容 def chengchu(formula_3,yunsuanfu):#定义一个函数chengchu,参数formula_3用于接收panduan函数执行后的数值,yunsuanfu参数是panduan函数中b变量也就是索引的运算符号 a=True#定义一个变量为True while a:#while不断的循环 for k,i in enumerate(yunsuanfu):#for循环取运算符并且加上每一个的索引位置 if i == '*' or i == '/':#判断当前循环i的值是*或者/ print(formula_3[k],formula_3[k+1])#输出*或者/对应索引的formula_3列表中数值和当前索引加1的数值 if i == '*':#判断本次循环的i是* b=float(formula_3[k])*float(formula_3[k+1])#定义b变量使用formula_3加上本次循环索引的位置 乘 formula_3本次索引位置的+1,并且将其都转换成浮点类型 print('=======>',formula_3[k],'*',formula_3[k+1])#输出上一步的操作 formula_3[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_3列表中本次循环索引位置为b del formula_3[k+1]#删除本次循环索引加1对应的formula_3列表的值 del yunsuanfu[k]#删除本次循环索引对应的yunsuanfu列表中的值,因为此值是使用过的不需要再出现 print(formula_3,yunsuanfu)#输出当前formula_3列表和yunsuanfu列表 break#退出本次循环,因为如果他继续循环循环formula_3,yunsuanfu这两个列表的时候会报错,因为索引长度超出了列表的长度 else:#判断如果不是*那就是/ b=float(formula_3[k])/float(formula_3[k+1])#定义b变量使用formula_3加上本次循环索引的位置 除 formula_3本次索引位置的+1,并且将其都转换成浮点类型 print('+++++++>',formula_3[k],'/',formula_3[k+1])#输出上一步的操作 formula_3[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_3列表中本次循环索引位置为b del formula_3[k+1]#删除本次循环索引加1对应的formula_3列表的值 del yunsuanfu[k]#删除本次循环索引对应的yunsuanfu列表中的值,因为此值是使用过的不需要再出现 print(formula_3,yunsuanfu)#输出当前formula_3列表和yunsuanfu列表 break#退出本次循环,因为如果他继续循环循环formula_3,yunsuanfu这两个列表的时候会报错,因为索引长度超出了列表的长度 else:#循环完成了,在yunsuanfu列表中没有了*/ a=False#定义a变量为False停止while循环 if len(yunsuanfu) == 0:#判断当前的yunsunafu列表的长度是不是0,也就是说没有运算符了 return formula_3#返回计算后的结果 else:#当前的yunsuanfu列表中还有那么可能就是+或者-了 a=jiajian(formula_4=formula_3,yunsuanfu_2=yunsuanfu)#执行jiajian函数并且将当前计算完成的*和/结果传给他和当前xunhuanfu变量的列表,使用变量a来接收返回值 return a#返回a变量内容 def jiajian(formula_4,yunsuanfu_2):#定义一个函数jiajian,参数formula_4用于接收chengchu函数执行后的数值,yunsuanfu_2参数是chenghchu函数中执行完成后yunsuanfu变量剩余的内容 a=True#定义一个变量为True while a:#while不断的循环 for k,i in enumerate(yunsuanfu_2):#for循环取运算符并且加上每一个的索引位置 if i == '+' or i == '-':#判断当前循环i的值是+或者- print(formula_4[k],formula_4[k+1])#输出+或者-对应索引的formula_4列表中数值和当前索引加1的数值 if i == '+':#判断本次循环的i是+ b=float(formula_4[k])+float(formula_4[k+1])#定义b变量使用formula_4加上本次循环索引的位置 加 formula_4本次索引位置的+1,并且将其都转换成浮点类型 print('=======>',formula_4[k],'+',formula_4[k+1])#输出上一步的操作 formula_4[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_4列表中本次循环索引位置为b del formula_4[k+1]#删除本次循环索引加1对应的formula_4列表的值 del yunsuanfu_2[k]#删除本次循环索引对应的yunsuanfu_2列表中的值,因为此值是使用过的不需要再出现 print(formula_4,yunsuanfu_2)#输出当前formula_4列表和yunsuanfu_2列表 break#退出本次循环,因为如果他继续循环循环formula_4,yunsuanfu_2这两个列表的时候会报错,因为索引长度超出了列表的长度 else:#不是+就是- b=float(formula_4[k])-float(formula_4[k+1])#定义b变量使用formula_4加上本次循环索引的位置 减 formula_4本次索引位置的+1,并且将其都转换成浮点类型 print('+++++++>',formula_4[k],'-',formula_4[k+1])#输出上一步的操作 formula_4[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_4列表中本次循环索引位置为b del formula_4[k+1]#删除本次循环索引加1对应的formula_4列表的值 del yunsuanfu_2[k]#删除本次循环索引对应的yunsuanfu_2列表中的值,因为此值是使用过的不需要再出现 print(formula_4,yunsuanfu_2)#输出当前formula_4列表和yunsuanfu_2列表 break#退出本次循环,因为如果他继续循环循环formula_4,yunsuanfu_2这两个列表的时候会报错,因为索引长度超出了列表的长度 else:#循环完成了,在yunsuanfu列表中没有了+- a=False#定义a变量为False停止while循环 #if len(yunsuanfu_2) == 0:#判断当前的yunsunafu列表的长度是不是0,也就是说没有运算符了 return formula_4#返回计算后的结果 #else:#如果yunsuanfu列表中还有那就是*/但是不可能...... # a=chengchu(formula_3=formula_4,yunsuanfu=yunsuanfu_2) # return a#返回a变量内容 result=calculator("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) ")#执行函数calculator并且将运算的数值传给他的参数 print(result)#输出函数calculator执行结果