• 计算器


    1.计算器方法一

    import re
    MUL = 'd+(.d+)?[*/]-?d+(.d+)?'
    ADD = '-?d+(.d+)?'
    
    def fsdf(exp):
        exp = exp.replace('--','+')
        exp = exp.replace('+-', '-')
        exp = exp.replace('-+', '-')
        exp = exp.replace('++', '+')
        return exp
    
    def mul_div(exp):
        lis = re.split('([*/])',exp)
        # print(len(lis))
        if lis[1] == '*':
            result = float(lis[0]) * float(lis[-1])
        else:
            result = float(lis[0]) / float(lis[-1])
        return result
    
    def add_sub(exp):
        m = 0
        ret = re.finditer(ADD, exp)
        for ret1 in ret:
            result = ret1.group()
            m += float(result)
        return m
    
    def first_(exp):
        exp = exp.replace(" ","")
        cp = re.compile('([^()]*)')
        try:
            while True:
                ret = re.search(cp,exp)  #m = '5+(6-1*(2-3/4))+(5-6/3)'  (2-3/4) (5-6/3)
                m = ret.group()
                while '*'in m or '/' in m:
                    ret1= re.search(MUL,m)
                    result = mul_div(ret1.group())
                    m = re.sub(MUL,str(result),m,1)
                else:
                    m = fsdf(m)
                    result = add_sub(m)
                    exp = re.sub(cp,str(result), exp, 1)
        except Exception as e:
            while '*' in exp or '/' in exp:
                ret1 = re.search(MUL, exp)
                result = mul_div(ret1.group())
                exp = re.sub(MUL, str(result), exp, 1)
            else:
                exp = fsdf(exp)
                result = add_sub(exp)
            return result
    
    result = first_('5*-5+(6-1*(- 2-3/  -4))+(  5-6  /-3)')#
    print(result)

    2.计算器方法二

    import re
    
    MUL = 'd+(.d+)?[*/]-?d+(.d+)?'
    ADD = '-?d+(.d+)?'
    
    def symbol(exp):
        exp = exp.replace('--','+')
        exp = exp.replace('+-','-')
        exp = exp.replace('-+', '-')
        exp = exp.replace('++', '+')
        return exp
    
    def mul_div(exp):
        """
        乘除法
        :param exp:
        :return:
        """
        if '*' in exp:
            a, b = exp.split('*')
            result = float(a) * float(b)
        else:
            a, b = exp.split('/')
            result = float(a) / float(b)
        return result
    
    def add_sub(exp):
        m = 0
        ret = re.compile(ADD)
        while True:
            exp_add_sub = ret.finditer(exp)
            for i in exp_add_sub:
                m += float(i.group())
            exp = exp.replace(exp, str(m))
            return exp
    
    
    def cal_mul_div(exp):
        ret = re.compile(MUL)
        while True:
            m = ret.search(exp)
            if m:
               exp_mul_div = m.group()
               result = mul_div(exp_mul_div)
               exp = exp.replace(exp_mul_div,str(result))
            else:break
        return exp
    
    def all(exp):
        result = cal_mul_div(exp)
        result = symbol(result)
        result = add_sub(result)
        return result
    
    def run(exp):   # m = '5+(6-1*(2-3/4))+(5-6/3)'
        exp = exp.replace(" ","")
        ret = re.compile("([^()]+)")
        while True:
            n = ret.search(exp)
            if n:
                m = n.group()
                result = all(m)
                exp = exp.replace(m,str(result))
            else:break
        result = all(exp)
        return result
    
    exp = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    result = run(exp)
    print(result)
  • 相关阅读:
    获取本机外网ip和内网ip
    服务器发布MVC常见问题解决方案
    Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
    Form验证(转)
    各浏览器各版本User-agent汇总 欢迎补充
    MSSQL中把表中的数据导出成Insert
    发布mvc3的项目时system.web.mvc 版本 为3.0.0.1高于服务器版本3.0.0.0 升级到3.0.0.1
    MySQL Packets larger than max_allowed_packet are not allowed
    SQL查看数据库所用用户表数量和使用的空间
    公用提示对话框
  • 原文地址:https://www.cnblogs.com/liuweida/p/10860441.html
Copyright © 2020-2023  润新知