基本信息
源码名称:python 计算器示例(入门级,实现了加减乘除等功能)
源码大小:6.44KB
文件格式:.py
开发语言:Python
更新时间:2019-01-03
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author : QiuMeng print("欢迎使用计算机") 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)