python计算器编写

import re
def main():
    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(" ","")
    print(s)
    print('s is ',eval(s))
    while True:
        li_s = re.findall('\([^()]+\)',s)
        if li_s:
            for i in li_s:
                ret = str(calOneExp(i))
                s = s.replace(i,ret)
        else:
            break
    # while True:
    #     ret = re.search('\([^()]+\)',s)
    #     if ret:
    #         inner = ret.group()
    #         res = str(calOneExp(inner))
    #         s = s.replace(inner,res)
    #     else:
    #         break
    #此时s 为没有任何括号的表达式
    final_res = calOneExp(s)
    print(final_res)

    return final_res

def calAtomExp(exp):
    '''
    计算最小的表达式
    :param exp:要计算的表达式
    :return: 字符串型表达式结果
    '''
    if '*' in exp:
        a,b = exp.split('*')
        return str(float(a)*float(b))
    elif '/' in exp:
        a, b = exp.split('/')
        return str(float(a) / float(b))
    elif '+' in exp or '-' in exp:
        lst_others = re.findall(r'[+-]?\d+(?:\.\d+)?',exp)
        sum_others = 0
        for i in lst_others:
            try:
                sum_others += float(i)
            except Exception:
                print('计算加减法时出现错误,请检查表达式是否合法')
                break
        return sum_others
def formatExp(exp):
    exp = exp.replace('--','+')
    exp = exp.replace('+-','-')
    exp = exp.replace('++', '+')
    exp = exp.replace('-+', '-')
    return exp
def calMulDivExp(exp):
    while True:
        lst_res = re.findall('\d+(?:\.\d+)?[*/]-?\d+(?:\.\d+)?', exp)
        if lst_res:
            for atom_exp in lst_res:
                mid_ret = calAtomExp(atom_exp)
                exp = exp.replace(atom_exp, mid_ret)
        else:
            break
    # 使用serch
    #使用serch while  就能循环出整个的结果,如果一开始用findall,还是得使用while,否则将导致替换后的结果,无法正确被计算
    # while True:
    #     one_result = re.search(r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp)
    #     if one_result:
    #         atom_exp = one_result.group()
    #         mid_ret = calAtomExp(atom_exp)
    #         #exp.replace( mid_ret,atom_exp)
    #         exp = exp.replace(atom_exp,mid_ret)
    #     else:
    #       break
    return exp
def calAddSub(exp):
    exp = formatExp(exp)
    exp_sum = calAtomExp(exp)
    return exp_sum
def calOneExp(exp):
    '''
    计算表达式内乘除法子项的结果
    :param exp: 要计算的表达式
    :return: 计算后的字符串型表达式
    '''
    exp = calMulDivExp(exp)
    ret = calAddSub(exp)
    return ret

#calOneExp('9-10.0/3+2.3333333333333335*24.75*2998+5680.0/14')
main()

  

转载于:https://www.cnblogs.com/cellking-xdb/p/11120897.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值