python 简单计算器

一、题目

开发一个简单的python计算器:
1、实现加减乘除及拓号优先级解析
2、用户输入 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、使用递归的思想,利用正则表达式,取出最内层的的括号内容,然后利用1中所设计的函数计算,然后将结果返回。然后循环。大致思路如下图:

三、代码

import re
def get_son(s,operation):
    dig = '-?d+(.d+)?'
    g = re.search(dig +operation + dig, s).group()
    if  s.index(g)!=0 and s[s.index(g)-1].isdigit():g = g[1:]
    ls = g.split(operation[-1])
    if len(ls)==3:ls =['-'+ls[1],ls[2]]
    return g,ls
def cal(s):
    for i in ['/','*']:
        while i in s:
            if i=='*':
                g, ls = get_son(s, '*')
                s = s.replace(g, str(round(float(ls[0]) * float(ls[1]),8)))
            elif i=='/':
                g, ls = get_son(s, '/')
                s = s.replace(g, str(round(float(ls[0]) / float(ls[1]),8)))
    s =s.replace('--','+')
    while not re.match('^-?d+(.d+)?$',s):
        fist_opear = re.search('[^d.]', s[1:]).group()
        if fist_opear == '-':
            g, ls = get_son(s, '-')
            s = s.replace( g, str(float(ls[0]) - float(ls[1])))
        else:
            g, ls = get_son(s, '+')
            s = s.replace(g, str(float(ls[0]) + float(ls[1])))
    return s
def cal_all(s):

    s= s.replace(' ','')
    while '(' in s:
        print(s)
        son = re.search('([^()]+)',s).group()
        s = s.replace(son,cal(son[1:-1]))
    return cal(s)
s = '-3*( 4+ 50 )+(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)'
print(cal_all(s))
print(eval(s))

 最后运行结果如下:结果和eval完全一样

原文地址:https://www.cnblogs.com/linshuhui/p/9643667.html