老男孩Python全栈开发(92天全)视频教程 自学笔记19
day19 课程内容:
第19天的课程就是复习一些正则表达式,以及说一下计算器的思路,我就把我做的计算器代码当这一天的内容吧。
计算器作业:不eval函数,计算能计算:'1-2*((60-30-8*(9-10/3+7/297/9000+10*568/14))-(-4*3)/(16-3*2))' 的计算器
用了三天两夜才算写出来,接触正则刚开始的时候,更喜欢使用re.findall() 但是真的在实战中,我切身的感觉到,re.search()才是最常用的,因为比较好跟循环配合使用。
还有就是代码的逻辑,一开始,我写计算器的时候,恨不得一个函数解决战斗,结果盘根错节的直接蒙了。同样优先级的,同样功能的函数,要单写成一个函数,然后以备调用
这样可以很大程度的提升逻辑的清晰度,以免除了错,没办法找bug,只能删掉所有代码从头开始写(我是深受其苦啊),好在最后,终于写出来了,三天两夜啊,只写了个计算器
看来程序员,真的是一个容易猝死的职业啊。
#s=1-2*((60-30-8*(9-10/3+7/297/9000+10*568/14))-(-4*3)/(16-3*2)) #判断有没有字母,支持浮点型 import re,time def start(): #检查字符串里是否有非法字符 flag=True while flag: s=input('请输入要计算的内容s:') if re.search('[a-zA-Z]',s): print('输入内容含有非法内容') elif s=='': print('输入算式为空,请重新输入') else: print('正在计算……') flag=False #print(s) return s def md_sy(s): #去除不合规字符 s=s.replace(' ','') s=s.replace('+-','-') s=s.replace('--','+') s = s.replace('-+', '-') s = s.replace('++', '+') return s def cc(s='(60-30-8*411.3809549998)'): flag = True while flag: ret = re.search('\d+\.?\d*[*/]\d+\.?\d*', s) if ret: x = ret.group() if '*' in x: li = re.split('[*]', x) y = float(li[0]) * float(li[1]) y = '{:.10f}'.format(y) s = s.replace(x, y) else: li = re.split('/', x) y = float(li[0]) / float(li[1]) y = '{:.10f}'.format(y) s = s.replace(x, y) else: flag = False return s def jj(s='(-12.0000000000)'): if re.search('\(-?\d+\.?\d*\)', s): s = s[1:-1] else: flag = True if s[1] == '-': head_li = re.findall('\((-\d*\.?\d*)', s) # print(head_li) ret = re.search('\(-\d*\.?\d*', s) s = '(' + s[len(ret.group()) + 1:] # print(s) while flag: ret = re.search('\d+\.?\d*[+-]\d+\.?\d*', s) if ret: x = ret.group() # print(x) if '+' in x: li = re.split('[+]', x) y = float(li[0]) + float(li[1]) y = '{:.10f}'.format(y) s = s.replace(x, y) else: li = re.split('-', x) y = float(li[0]) - float(li[1]) y = '{:.10f}'.format(y) s = s.replace(x, y) else: s = s[1:-1] head_li.append(s) s = float(head_li[0]) + float(head_li[1]) s = str(s) flag = False else: while flag: ret = re.search('\d+\.?\d*[+-]\d+\.?\d*', s) if ret: x = ret.group() # print(x) if '+' in x: li = re.split('[+]', x) y = float(li[0]) + float(li[1]) y = '{:.10f}'.format(y) s = s.replace(x, y) else: li = re.split('-', x) y = float(li[0]) - float(li[1]) y = '{:.10f}'.format(y) s = s.replace(x, y) else: s = s[1:-1] flag = False return s def hj(s='1-2*-3259.8476399984/2.000*5*6*9*666'): flag=True while flag: ret = re.search('\d+\.?\d*[*/]-\d+\.?\d*', s) if ret: if '*' in ret.group(): li = re.split('[*]', ret.group()) s1 = float(li[0]) * float(li[1]) s1 = '{:.10f}'.format(s1) s = s.replace(ret.group(), s1) else: li = re.split('/', ret.group()) s1 = float(li[0]) /float(li[1]) s1 = '{:.10f}'.format(s1) s = s.replace(ret.group(), s1) else: break return s def ccjj(s='1-6519.6952799968/2.000*5*6*9*666'): flag1=True while flag1: ret=re.search('\d+\.?\d*[*/]\d+\.?\d*',s) if ret: if '*' in ret.group(): li=re.split('[*]',ret.group()) s1=float(li[0])*float(li[1]) s1='{:.10f}'.format(s1) s=s.replace(ret.group(),s1) else: li = re.split('/', ret.group()) s1 = float(li[0]) / float(li[1]) s1 = '{:.10f}'.format(s1) s = s.replace(ret.group(), s1) else: flag1=False flag2=True while flag2: ret = re.search('\d+\.?\d*[+-]\d+\.?\d*', s) if ret: if '+' in ret.group(): li = re.split('[+]', ret.group()) s1 = float(li[0]) + float(li[1]) s1 = '{:.10f}'.format(s1) s = s.replace(ret.group(), s1) else: li = re.split('-', ret.group()) s1 = float(li[0]) - float(li[1]) s1 = '{:.10f}'.format(s1) s = s.replace(ret.group(), s1) else: flag2 = False return s def jsq(s='1-2*((60-30-8*(9-10/3+7/297/9000+10*568/14))-(-4*3)/(16-3*2))'): flag=True while flag: ret=re.search('\([^()]+\)',s) if ret: x=ret.group() #print(x) y=jj(cc(x)) #print(y) s=s.replace(x,y) s=md_sy(s) #print('s:',s) #time.sleep(3) else: s=md_sy(s) s=hj(s) s=md_sy(s) s=ccjj(s) flag=False return s s=start() print(jsq(s))