Python 计算器

Python 计算器实现:

实现加减乘除及拓号优先级解析
用户输入
1 - 2 * ((60 - 30 + (-40 / 5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))
等类似公式后,必须自己解析里面的(), +, -, *, / 符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

需求:
1.编写一个计算器。
2.可以自动计算括号。
4.不使用eavl函数。

实现:
1.先取出第一个最里面括号的值进行计算。
2.把第一个值返回计算的表达式,进行先一个括号的计算。

core:
1.定义个main主函数,并取出最里括号的传给count函数。
2.count函数负责判断是加减,还是乘除运算并传给对应的mul,add_main,div函数进行计算,
3.计算完成后返回主函数,进行下一个括号的预算。
import re

def add_min(a):
    '''
    计算加减法
    :param:
    :return:
    '''

    if '--' in a:
        a = a.replace('--', '+')

    c = re.findall(r'-?d+.?d*', a)
    ls = []
    for i in c:
        ls.append(float(i))
    rest = sum(ls)
    return rest

def mul(a):
    '''
    计算剩数
    :param ct:
    :return:
    '''


    b = re.search(r'd+.?d*(*-?d+.?d*)+', a)
    if b is not None:
        b = b.group()
        rest = 1
        c = re.findall(r'-?d+.?d*', b)
        ls =[]
        for item in c:
            ls.append(float(item))
        for i1 in range(len(ls)):
            rest = rest * ls[i1]
        a = re.sub(r'd+.?d*(*-?d+.?d*)+', str(rest), a, 1)
        return a

def div(a):
    '''
    计算出发
    :param a:
    :return:
    '''

    b = re.search(r'd+.?d*(/-?d+.?d*)+', a)
    if b is not None:
        b = b.group()
        c = re.findall(r'-?d+.?d*', b)
        ls =[]
        for i in c:
            ls.append(float(i))
        rest = ls[0]
        for i1 in range(1,len(ls)):
            rest = rest / ls[i1]
        a = re.sub(r'd+.?d*(/-?d+.?d*)+', str(rest), a, 1)
        return a

def count(b):
    '''
    计算结果
    :return:
    '''
    while True:
        if '*' in b:
            c = b.split('*')
            if '/' in c[0]:
                b = div(b)
            else:
                b = mul(b)
        elif '/' in b:
            b = div(b)

        elif '+' or '-' in b:
            b = add_min(b)
            return b
        else:
            return b

def main():

    while True:

        a = ''.join(input('33[53;1m请输入需要计算的算式:33[0m').split())
        if len(a)==0:continue

        while True:
            if '(' in a:
                ct = re.search(r'(([^()]+))', a)
                if ct is not None:
                    b = ct.groups()[0]
                    c = count(b)
                    a = re.sub(r'(([^()]+))', str(c), a, 1)
            else:
                c = count(a)
                print('33[43;1m计算的结果:33[0m',c)
                break

if __name__ == '__main__':

    main()
View Code
原文地址:https://www.cnblogs.com/zhangxinxiao/p/7345607.html