python 四則運算計算器


剛開始只是為了實現某個功能,中間需要對表達式進行計算,想着寫個四則運算計算器也很簡單就順手寫了, 寫到后面發現需要考慮的問題還挺多的,囧。

現在把代碼貼出來記錄一下這辛苦的過程吧,畢竟寫得挺長的= =
不做解釋了,單純為了記錄,畢竟寫的也挺菜的,也就能基本實現功能2333

def calculate(in_formula: str) -> int:
    """
    對字符串類型的數學表達式進行計算,返回計算結果
    數學表達式可包含加減乘除、括號
    :param in_formula: 數學表達式 如'2*(-5+3)/-1+20/(3+1)+2+(-9-2)*2'
    :return: 計算結果
    """
    if '(' in in_formula:
        result_in_brackets = []
        reg_formula_in_brackets = re.compile(r'\([^(]+\)')
        formula_in_brackets = reg_formula_in_brackets.findall(in_formula)
        else_formula = reg_formula_in_brackets.split(in_formula)
        for i in formula_in_brackets:
            result_in_brackets.append(simple_arithmetic(re.sub(r"[()]", '', i)))
        for i in range(0, int(len(else_formula)) + 1, 2):
            else_formula.insert(i + 1, str(result_in_brackets[int(i / 2)]))
        result = simple_arithmetic(''.join(else_formula))
    else:
        result = simple_arithmetic(''.join(in_formula))
    return result


def simple_arithmetic(in_formula: str) -> int:
    """
    不含括號的簡單公式計算(加減乘除)
    :param in_formula: 只包含加減乘除不含括號的計算公式
    :return: 計算結果
    """
    result = 0
    if '+' in in_formula or '-' in in_formula:

        reg = re.compile(r"(?<![+*/\-])[+\-]")
        operators = reg.findall(in_formula)
        sub_formulas = reg.split(in_formula)

        for ind, sub_formula in enumerate(sub_formulas):
            if ind == 0 and sub_formula == '':
                sub_formulas[0] = 0
                sub_formulas[1] = operators[0] + sub_formulas[1]
                operators[0] = '+'
                continue
            if '/' in sub_formula or '*' in sub_formula:
                val = multiply_divide(sub_formula)
            else:
                val = int(sub_formula)
            sub_formulas[ind] = val
        result = sub_formulas[0]
        for ind, i in enumerate(operators):
            if i == '+':
                result += int(sub_formulas[ind + 1])
            elif i == '-':
                result -= int(sub_formulas[ind + 1])

    elif '/' in in_formula or '*' in in_formula:
        result = multiply_divide(in_formula)

    else:
        return result
    return result


def multiply_divide(in_formula: str) -> int:
    """
    乘除法的計算
    :param in_formula:只含有乘除法的計算公式
    :return: 計算結果
    """
    result = 1
    if '/' not in in_formula:
        sub_formulas = in_formula.split('*')
        for i in sub_formulas:
            result = result * int(i)
    elif '*' not in in_formula:
        sub_formulas = in_formula.split('/')
        for ind, i in enumerate(sub_formulas):
            result = int(i) if ind == 0 else result / int(i)
    else:
        reg = re.compile(r'[*/]')
        operators = reg.findall(in_formula)
        sub_formulas = reg.split(in_formula)
        result = int(sub_formulas[0])
        for ind, i in enumerate(operators):
            if i == '*':
                result = int(sub_formulas[ind + 1]) * result
            elif i == '/':
                result = result / int(sub_formulas[ind + 1])
    return result


def addition_subtraction(formula: str) -> int:
    """
    加減法運算
    :param formula:只含有加減法的運算公式
    :return: 運算結果
    """
    result = 0
    if '+' not in formula:
        sub_formulas = formula.split('-')
        result = int(sub_formulas[0])
        for i in sub_formulas[1:]:
            result = result - int(i)
    elif '-' not in formula:
        sub_formulas = formula.split('+')
        for i in sub_formulas:
            result = int(i) + result

    elif '+' in formula or '-' in formula:
        reg = re.compile(r'[+\-]')
        operators = reg.findall(formula)
        sub_formulas = reg.split(formula)
        result = int(sub_formulas[0])
        for ind, i in enumerate(operators):
            if i == '+':
                result += int(sub_formulas[ind + 1])
            elif i == '-':
                result -= int(sub_formulas[ind + 1])
    else:
        return formula
    return result


if __name__ == '__main__':
    print(calculate('2*(-5+3)/-1+20/(3+1)+2+(-9-2)*2'))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM