zoukankan      html  css  js  c++  java
  • python练习-计算器小程序

    一个计算器小程序

    需求

    代码实现

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author : QiuMeng
    
    import re
    
    def replace_func(FormulaChunk):
        '''
        #去除一些会影响运算的符号
        :param FormulaChunk: #传入一个去除括号后的字符串
        :return: 去除这些东西后标准的返回
        '''
        FormulaChunk = FormulaChunk.replace(" ","")
        FormulaChunk = FormulaChunk.replace("+-","-")
        FormulaChunk = FormulaChunk.replace("--","+")
        return FormulaChunk
    
    
    
    def mul_and_div(CombineHandlerList):
        '''
        计算乘法,除法
        :return:返回一个没有任何"*/"字符的列表
        '''
        ChunkPartitionList = CombineHandlerList[1]
        for index,item in enumerate(ChunkPartitionList):
            if "*" in item or "/" in item:  # 判断这个元素中是否有"*/"
                OperatorList = re.findall("[*/]",item)  # 分割出乘除号
                PartitionList = re.split("[*/]",item)   # 根据乘除分割
                SumCount = None
                for i,j in enumerate(PartitionList):
                    if SumCount:  #第一个元素不计算
                        if OperatorList[i-1] == "*":  # 算乘法
                            SumCount *= float(j)
                        elif OperatorList[i-1] == "/":  # 算除法
                            SumCount /= float(j)
                    else:
                        SumCount = float(j)
                ChunkPartitionList[index] = SumCount
        return CombineHandlerList
    
    
    def add_and_subtract(CombineHandlerListMuledAndDived):
        '''
        [['-', '-', '-', '-', '-', '-', '+'], ['-9', '2', '5', -6.0, 1.6666666666666667, 80.0, 0.6, 18.0]]
        计算加减法
        :param CombineHandlerListMuledAndDived: 经过正负聚合且完成乘除的list
        :return: 返回一个只有一个float字符串的list
        '''
        # ['-', '-', '-', '-', '-', '-', '+']
        ChunkOperationList = CombineHandlerListMuledAndDived[0] # 加减操作符列表
        # ['-9', '2', '5', -6.0, 1.6666666666666667, 80.0, 0.6, 18.0]  # 注意其中的字符串和float
        ChunkPartitionList = CombineHandlerListMuledAndDived[1] # 按加减分割后元素列表
        SumCount = None
        for index,item in enumerate(ChunkPartitionList):
            if SumCount:
                if ChunkOperationList[index-1] == "-":  # 算减法
                    SumCount -= float(item)
                elif ChunkOperationList[index-1] == "+":  # 算加法
                    SumCount += float(item)
            else:
                SumCount = float(item)
        return SumCount
    
    
    
    def combine(HandlerList):
        '''
        将ChunkPartitionList中类似于"2*"和"-"+"3"放在一起
        :param HandlerList: 已经处理过的两个列表
        :return:
        '''
        ChunkOperationList = HandlerList[0]  # 操作符列表
        ChunkPartitionList  = HandlerList[1] # 按加减分割后元素列表
        for index,item in enumerate(ChunkPartitionList):
            if item.endswith("/") or item.endswith("*"):
                ChunkPartitionList[index] = item + ChunkOperationList[index] + ChunkPartitionList[index+1] # 合并
                del ChunkOperationList[index]  # 合并完成后删除对应的元素
                del ChunkPartitionList[index+1]
    
        CombineHandlerList = []
        CombineHandlerList.insert(0,ChunkOperationList)
        CombineHandlerList.insert(1,ChunkPartitionList)
    
        return CombineHandlerList
    
    
    def handler_list(FormulaChunk):
        '''
        '(-9-2-5-2*-3-5/3-40*4/2-3/5+6*3)'
        将这样的一个括号内的快转化为固定的列表返回
        :param UserInput:
        :return:
        '''
        FormulaChunk = re.sub("[()]", "", FormulaChunk)  # 去掉字符串前后的括号
        FormulaChunk = replace_func(FormulaChunk)
        # '-9-2-5-2*-3-5/3-40*4/2-3/5+6*3'
        ChunkOperationList = re.findall("[+-]",FormulaChunk)  # 获取这个块的所有加减法运算符号来获取一个list
        # ['-', '-', '-', '-', '-', '-', '-', '-', '+']
        ChunkPartitionList = re.split("[+-]",FormulaChunk)  # 通过加减符号将Chunk分隔开来获取一个list
        # ['', '9', '2', '5', '2*', '3', '5/3', '40*4/2', '3/5', '6*3']
        if not ChunkPartitionList[0]:  #ChunkPartitionList列表第一个是否为空,该块则以+-开始
            if ChunkOperationList[0] == "-":  # 是负号要加到第二个里面,删除两个列表的第一个元素
                ChunkPartitionList[1] = ChunkOperationList[0] + ChunkPartitionList[1]
                del ChunkPartitionList[0]
                del ChunkOperationList[0]
            elif ChunkOperationList[0] == "+": # 是正号去除两个列表的第一个元素
                del ChunkPartitionList[0]
                del ChunkOperationList[0]
        # ['-', '-', '-', '-', '-', '-', '-', '+']
        # ['-9', '2', '5', '2*', '3', '5/3', '40*4/2', '3/5', '6*3']
        #  这样的列表元素要进行再次处理将"2*"和"-"+"3"放在一起
        HandlerList  = []
        HandlerList.insert(0,ChunkOperationList)
        HandlerList.insert(1,ChunkPartitionList)
        return HandlerList
    
    
    def calculate(UserInput):
        '''
        主函数
        :param formula:
        :return:
        '''
        # TODO 这块可以使用递归来写
        while UserInput: #输入不为空
            UserInput = UserInput.replace(" ", "")  # 去掉空格
            if re.findall("[()]",UserInput):  # 是否有括号
                FormulaChunk = re.search("([^()]+)",UserInput).group()  # 获取一个括号
                # 要把括号中的一些东西给去除掉
                HandlerList = handler_list(FormulaChunk) # 按照加减符号进行第一个分割
                CombineHandlerList = combine(HandlerList)  # 将ChunkPartitionList中类似于"2*"和"-"+"3"放在一起后list
                CombineHandlerListMuledAndDived = mul_and_div(CombineHandlerList) # 计算完成后乘除法的list
                SumCount = add_and_subtract(CombineHandlerListMuledAndDived)  # 计算完成加减法后的结果
                UserInput = UserInput.replace(FormulaChunk,str(SumCount))
    
            else: # 如果没有的话将其转化成对应的列表格式进行计算
                HandlerList = handler_list(UserInput)
                CombineHandlerList = combine(HandlerList)
                CombineHandlerListMuledAndDived = mul_and_div(CombineHandlerList)
                SumCount = add_and_subtract(CombineHandlerListMuledAndDived)
                print(SumCount)
                break
    
    
    if __name__ == '__main__':
        #formula = "1 - 2 * (30+ (60-30 +(-9-2- 5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )"
        formula = input(">")
        calculate(formula)
    
  • 相关阅读:
    Oracle EBS 初始化用户密码
    Oracle EBS FND User Info API
    linux ERROR: ld.so: object '/lib/libcwait.so' from /etc/ld.so.preload cannot be preloaded: ignored.
    linux解压cpio.gz类型文件
    linux删除乱码文件
    linux使用man命令后退出
    linux字符图形界面
    Red Hat linux 如何增加swap空间
    Linux删除文件夹命令
    Linux本地无法登录,远程却可以登录
  • 原文地址:https://www.cnblogs.com/forsaken627/p/6607176.html
Copyright © 2011-2022 走看看