计算器小程序

import re

def silmple_cal(mul_div):  #乘法或除法计算函数
    if '/' in mul_div:   #如果‘/’在这个计算式里面
        val1,val2 = mul_div.split('/')
        ret_val = float(val1)/float(val2)
        return ret_val  #返回除法计算结果
    elif '*' in mul_div:  #如果乘法在计算式里面
        val1, val2 = mul_div.split('*')
        ret_val = float(val1) * float(val2)
        return ret_val   #返回除法计算结果
def modify_express(express):
    express = express.replace('--',' ')
    express = express.replace('- ','-')
    express = express.replace(' -','-')
    express = express.replace('  ',' ')
    return express
def express_cal(express_new):
    # 没有括号的表达式的计算
    no_bracket_express = express_new.strip('()')  #将传进来的小括号去掉
    while re.search(r'\d \.?\d*[*/]\-?\d \.?\d*', no_bracket_express): #当这个计算式里面含有*或者除号的时候,
        ret_mul_div = re.search(r'\d \.?\d*[*/]\-?\d \.?\d*', no_bracket_express)  #取到计算式里的第一个乘法或除法
        mul_div = ret_mul_div.group()   #取到计算式里的第一个乘法或除法
        ret_val = silmple_cal(mul_div)  #调用silmple_cal函数,并将这个除法或乘法传进去,并拿到它的返回值,拿到的是一个数
        no_bracket_express = no_bracket_express.replace(mul_div, str(ret_val), 1)  #将已经去掉括号的计算式里的第一个乘法或除法替换为它的结果,并只替换最前面的一次
        no_bracket_express = modify_express(no_bracket_express)#调用 modify_express函数,并将结果传进去,得到一个正确的计算式
    ret_lst = re.findall(r'[ \-]?\d \.?\d*', no_bracket_express)  #将已经没有乘除法的计算式里面的正负数取出来得到一个列表
    if ret_lst: #如果这个列表不为空,表示计算式里面含有加减法,要进行加减法计算
        total = 0
        for item in ret_lst:
            total  = float(item)
        return total   #返回最终结果
    return no_bracket_express   #如果没有走if语句说明里面没有加减法,将乘除法的结果返回即可
#去括号
def remove_bracket(s): #s= 'a1-2*((60-30 (-40/5)*(9-2*5/3 7/3*99/4 *2998  10* 568/14))-(-4*3)/(16-3*2))' #将计算式去除括号,并返回最终计算结果
    while re.search(r'\([^()] \)',s):    #当计算式里还含有小括号时,表示search能拿到值,不为空
        express_new = re.search(r'\([^()] \)',s).group()    #拿到第一个最里层的括号内的东西
        ret_val = express_cal(express_new)  #开始调用express_cal函数,将取到的第一小括号传进去,并拿到第一个小括号的计算总结果,
        express = s.replace(express_new,str(ret_val)) #将计算式第一个括号替换为总结果
        s = modify_express(express)#整理算式中的 -号
    ret = express_cal(s)
    return ret
s= '1-2*((60-30 (-40/5)*(9-2*5/3 7/3*99/4 *2998  10* 568/14))-(-4*3)/(16-3*2))'
#去空格
s = s.replace(' ','')
ret = remove_bracket(s)  #调用去括号函数,并拿到最终计算的结果
print('result : ',ret)  #将最终计算结果打印

  


更多专业前端知识,请上 【猿2048】www.mk2048.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值