zoukankan      html  css  js  c++  java
  • 7_python之路之python计算器

    7_python之路之python计算器

     

    1.程序说明:Readme.cmd

    1.程序文件及说明:
    calculator.py
    
    2.python版本:python-3.5.3
    
    3.程序使用:python calculator.py "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
        【使用双引号引住需要运算的内容】
        
    4.程序功能解析:
        计算器
    
    5.程序执行结果:请亲自动手执行或者查看我的博客
    
    6.程序博客地址:http://www.cnblogs.com/chenjw-note/p/8523839.html

    2.程序代码:calculator.py

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    # author:chenjianwen
    # email:1071179133@qq.com
    import re
    import sys
    
    ##计算乘除法
    def compute_mutiply_and_dividend(formula):
        operators = re.findall(r'[*/]',formula)
        calc_list = re.split('[*/]',formula)
        calc_res =  None
        for index,i in enumerate(calc_list):
            if calc_res:
                if operators[index - 1] == "*":
                    calc_res *= float(i)
                elif operators[index - 1] == "/":
                    calc_res /= float(i)
            else:
                calc_res = float(i)
        return calc_res
    
    ##计算加减
    def compute_add_and_subt(formula):
        operators = re.findall(r'[+-]',formula)
        calc_list = re.split(r'[+-]',formula)
        calc_res =  None
        for index,i in enumerate(calc_list):
            if calc_res:
                if operators[index - 1] == "+":
                    calc_res += float(i)
                elif operators[index - 1] == "-":
                    calc_res -= float(i)
            else:
                calc_res = float(i)
        return calc_res
    
    ##消除两个符号
    def remove(formula):
        formula = formula.replace("+-","-")
        formula = formula.replace("-+", "-")
        formula = formula.replace("++", "+")
        formula = formula.replace("--", "-")
        formula = formula.replace("- -", "+")
        return formula
    
    ##处理特殊情况1 - 2 * -14969036.7968254   ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254']   ' 2 * '
    def special_done(a,b):
        for index,i in enumerate(b):
            i = i.strip()
            if i.endswith("*") or i.endswith("/"):
                b[index] = b[index] + a[index] + b[index + 1]
                del b[index + 1]
                del a[index]
        return a,b
    
    #具体运算
    def compute(formula):
        #print(formula)
        formula = formula.strip('()')
        a = re.findall(r'[+-]',formula)
        b = re.split(r'[+-]',formula)
        if len(b[0].strip()) == 0:  ##判断如果第一个是减号,值为空了无法运算,将其减号赋下一个值
            b[1] = a[0] + b[1]
            del a[0]
            del b[0]
        #print(a)
        #print(b)
        a,b = special_done(a,b)
        for index,i in enumerate(b):
            if re.search(r'[*/]',i):
                res = compute_mutiply_and_dividend(i)
                b[index] = res
        #print(b)
        ##开始运算+ -
        total_res = None
        for index,i in enumerate(b):
            if total_res:
                if a[index - 1] == "+":
                    total_res += float(i)
                elif a[index - 1] == "-":
                    total_res -= float(i)
            else:
                total_res = float(i)
        #print("33[32;1m[%s]运算结果:33[0m" % formula, total_res)
        return total_res
    
    #主逻辑
    def calc(formula):
        calc_status = True
        calc_res = None
        while calc_status:
            m = re.search(r'([^()]*)',formula)
            if m:
                sub_res = compute(m.group())
                formula = formula.replace(m.group(),str(sub_res))
                formula = remove(formula)
                #print(formula)
            else:
                #print('33[41;1m----没拓号了...---33[0m')
    
                print('
    
    33[42;1m最终结果:33[0m', compute(formula))
                calc_status = False
                print("计算结束")
    
    calc(sys.argv[1])
    print("eval的计算结果:",eval(sys.argv[1]))

    3.程序执行输出

  • 相关阅读:
    VSCode显示多个Tab窗口
    react + antd实现动态菜单
    vue 全局插件封装--提示toast
    ElementUI之el-scrollbar+el-select组合
    vue 滚动条组件对比
    【智能车】NXP_MIMXRT1064库函数
    【模电学习】二极管的特性与参数
    【模电学习】半导体——N与P(2)
    【协议】IIC通信
    【模电学习】半导体——N与P(1)
  • 原文地址:https://www.cnblogs.com/chenjw-note/p/8523839.html
Copyright © 2011-2022 走看看