zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/zhangxinxiao/p/7345607.html
Copyright © 2011-2022 走看看