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)
posted @ 2017-03-23 20:37  我的胡子有点扎  阅读(590)  评论(0编辑  收藏  举报