zoukankan      html  css  js  c++  java
  • 开发一个简单的Python计算器

    # -*- coding:utf-8 -*-
    # @Time    : 2019/x/x
    # @Author  : root
    
    import re
    
    
    operatorDict = {
        '+': lambda a, b: float(a) + float(b),
        '-': lambda a, b: float(a) - float(b),
        '*': lambda a, b: float(a) * float(b),
        '/': lambda a, b: float(a) / float(b),
    }
    
    def calculator(expression='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + '
                              '7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'):
        '''
        计算器
        总逻辑:
            1.先找出内层括号,然后计算其内的终值,用终值替换原表达式
            2.然后重复以上过程
        无括号部分计算逻辑:
            1.先截断为数字和运算符的列表,数字可包含负号;
            2.运算列表中的值并替换,先乘除后加减;
        :param expression: 字符串表达式
        :return:表达式计算值
        '''
    
        print("正确答案为: ",eval(expression))
    
    
        def calWithOutBrackets(expression='-1+2*3/4-5*-3'):
            # 截断为数字和运算符的列表
            for i in operatorDict:
                expression = expression.replace(i,'s'+i+'s')
            l =expression.split('s')
            l2 = []
            i =0
            while i <len(l):
                if l[i] == '':
                    l2.append(l[i+1]+l[i+2])
                    i +=2
                else:
                    l2.append(l[i])  # 不带负号的数字和运算符
                i += 1
            # 运算乘除
            i = 1
            while i<len(l2):
                if l2[i] in ['*','/']:
                    l2[i-1:i+2] = [operatorDict[l2[i]](l2[i-1],l2[i+1])]
                else:
                    i+=2
            # 运算加减
            while len(l2)>1:
                l2[0:3] = [operatorDict[l2[1]](l2[0], l2[2])]
            return str(l2[0])
    
        expression=expression.replace(' ','')
        check = re.search('([^()]+)', expression)
        while check:
            checkValue = check.group()
            # print(checkValue)
            expression = expression.replace(checkValue, calWithOutBrackets(checkValue[1:-1]))
            check = re.search('([^()]*)', expression)
        else:
            return calWithOutBrackets(expression)
    
    
    if __name__ == '__main__':
        re = calculator()
        print("实际结果为: ",re)
    

      

  • 相关阅读:
    并发编程 进程
    计算机的发展史和操作系统简介
    subprocess和struct模块
    socket编程
    面向对象进阶 反射
    类的内置方法
    常用模块(hashlib,configparser,logging)

    面向对象封装 classmethod和staticmethod方法
    面向对象 继承补充和多态
  • 原文地址:https://www.cnblogs.com/codecca/p/11991410.html
Copyright © 2011-2022 走看看