zoukankan      html  css  js  c++  java
  • Python之简易计算器

      思路:学会运用正则表达式把需要先进行计算的匹配出来,然后再一步步的去算,把先算出来的值替换原来的值,再进一步的把++,--等号变成我们正常的数学上的符号,然后再进行一步步的替换,最终把带括号的都计算出来,再调用一次加减函数进行计算

    import re
    
    def atom_cal(exp):      #计算乘除法
        if "*" in exp:
            a,b = exp.split("*")    #以*作切割,把切出来的两个值分别赋给a,b
            return str(float(a) * float(b)) #用float计算ab相乘的值并转换成字符串格式,便于计算
        else:
            a,b = exp.split("/")    #以/作切割,把切出来的两个值分别赋给a,b
            return str(float(a) / float(b))
    
    def mul_div(exp):   #乘除
        while 1:
            ret = re.search("d+(.d+)?[*/]-?d+(.d+)?",exp)     #把乘除法匹配出来
            if ret:
                atom_exp = ret.group()  #取第一个组匹配出来的乘除法
                res = atom_cal(atom_exp)    #调用atom_cal函数计算乘除法
                exp = exp.replace(atom_exp,res)     #替换  将计算出来的值与原式子替换
            else:return exp     #当没有相匹配的乘除法时,返回exp
    
    def format_exp(exp):    #改变符号
        exp = exp.replace("--","+")
        exp = exp.replace("-+","-")
        exp = exp.replace("+-","-")
        exp = exp.replace("++","+")
        return exp
    
    def add_sub(exp):   #计算加减
        ret = re.findall("[+-]?d+(?:.d+)?",exp)  #把能加减的匹配出来,包括小数,负数等
        exp_sum = 0
        for i in ret:
            exp_sum += float(i)     #累加至exp_sum中返回
        return exp_sum
    
    def cal(exp):
        exp = mul_div(exp)  #乘除
        exp = format_exp(exp) #变号
        exp_sum = add_sub(exp)  #加减
        return exp_sum      #float
    
    def main(exp):
        exp = exp.replace(" ","")#去空格
        while 1:
            ret = re.search("([^()]+)",exp)    #括号最里面的数
            if ret:
                inner_bracket = ret.group()     #取正则表达式匹配到的第一个组数
                res = str(cal(inner_bracket))       #调用cal计算
                exp = exp.replace(inner_bracket,res)           #把算出来的值返回给括号
                exp = format_exp(exp)   #调用函数,变号
            else:break
        return cal(exp)
    s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    print(main(s))
  • 相关阅读:
    java版二维码实例(非安卓版)
    Java—SSH(MVC)
    关于flex里面mousedown 和click事件冲突问题的解决办法
    navicat ssh通道受限问题处理
    如何更改linux文件目录拥有者及用户组
    如何查看linux中的ssh端口开启状态
    centos linux mysql 10060远程错误代码
    Navicat for MySQL 使用SSH方式链接远程数据库(二)
    Petri Net 的形式化定义
    如何做鲫鱼豆腐汤
  • 原文地址:https://www.cnblogs.com/qicun/p/9520473.html
Copyright © 2011-2022 走看看