1. 程式人生 > >使用python開發一個能夠計算帶括號的複雜表示式的計算器(只支援加減乘除)

使用python開發一個能夠計算帶括號的複雜表示式的計算器(只支援加減乘除)

使用到了模組re,正則,字典等

# 實現簡單的加減乘除括號等運算
# Calculator


def calculator(expression):
    print(expression)
    import re
    # 操作字典,目前只支援加減乘除
    operatorDict ={
        '+': lambda a, b: float(a)+float(b),
        '-': lambda a, b: float(a)+float(b),
        '*': lambda a, b: float(a)+float(b),
        '/': lambda a, b: float(a)+float(b),
    }
    # 計算去括號後表示式的值
    def calBrackets(expre):
        for i in operatorDict:
            expre = expre.replace(i, 's'+i+'s')
        l = expre.split('s')  # 表示式轉化為數字運算子列表
        # 將-和數字組合在一起
        l2, i = [], 0
        while i < len(l):
            # 處理負數
            if l[i] == '':  # 負號開頭或者負號與其他運算子連在一起,splite後會為'',例如 -5*-2  ['','-','5','*','','-','2']
                l2.append(l[i+1]+l[i+2])   # 將符號和數字合一起  -2
                i += 2
            else:
                l2.append(l[i])
            i += 1
        # l2為新數字運算子列表(處理符號後,例['-1', '+', '*', '-3'])
        # 運算乘除
        i = 1
        while i < len(l2):  # 計算乘除
            if l2[i] in ['*', '/']:
                # 將符號左右以及符號三個元素替換為運算結果,必須是個列表, list[m:n] :切片取值連續,不包括n
                l2[i-1:i+2] = [operatorDict[l2[i]](l2[i-1], l2[i+1])]  # 運算
            else:
                i += 2
        # 運算加減,直接按順序計算替換
        while len(l2) > 1:
            l2[0:3] = [operatorDict[l2[1]](l2[0], l2[2])]
        return str(l2[0])
    # 去除空格
    expression = expression.replace(' ', '')
    # 正則匹配表示式是否包含括號    [^\(\)] : 匹配不是( 或者) 的內容,即非括號內容
    check = re.search('\([^\(\)]+\)', expression)  # 返回匹配到的內容,帶括號,只返回一個
    # 去掉括號
    while check:
        checkValue = check.group()
        # 將匹配到的括號表示式替換成值,括號去掉使用函式求值
        expression = expression.replace(checkValue, calBrackets(checkValue[1:-1]))
        check = re.search('\([^\(\)]*\)', expression)
    else:
        return calBrackets(expression)
# 測試
result = calculator('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )')
print(result)

  主要邏輯部分做了註釋,參考了d_k的一篇評論,主要是計算部分與正則部分!!!