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))