前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >老男孩Python全栈开发(92天全)视频教程 自学笔记19

老男孩Python全栈开发(92天全)视频教程 自学笔记19

作者头像
玩蛇的胖纸
发布2018-06-08 13:14:18
4560
发布2018-06-08 13:14:18
举报

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,只能删掉所有代码从头开始写(我是深受其苦啊),好在最后,终于写出来了,三天两夜啊,只写了个计算器

看来程序员,真的是一个容易猝死的职业啊。

代码语言:javascript
复制
#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))
代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 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,只能删掉所有代码从头开始写(我是深受其苦啊),好在最后,终于写出来了,三天两夜啊,只写了个计算器
              • 看来程序员,真的是一个容易猝死的职业啊。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档