python简易计算器字典_通过Python实现简单的计算器

import reimportfunctoolsdefminus_operator_handler(formula):'''处理一些特殊的减号运算'''minus_operators= re.split("-",formula)

calc_list= re.findall("[0-9]",formula)if minus_operators[0] == '': #第一值肯定是负号

calc_list[0] = '-%s' %calc_list[0]

res= functools.reduce(lambda x,y:float(x) -float(y), calc_list)print("\033[33;1m减号[%s]处理结果:\033[0m" %formula, res )returnresdefremove_duplicates(formula):

formula= formula.replace("++","+")

formula= formula.replace("+-","-")

formula= formula.replace("-+","-")

formula= formula.replace("--","+")

formula= formula.replace("- -","+")returnformuladefcompute_mutiply_and_dividend(formula):'''算乘除,传进来的是字符串噢'''operators= re.findall("[*/]", formula )

calc_list= re.split("[*/]", formula )

res=Nonefor index,i inenumerate(calc_list):ifres:if operators[index-1] == "*":

res*=float(i)elif operators[index-1] == "/":

res/=float(i)else:

res=float(i)print("\033[31;1m[%s]运算结果=\033[0m" %formula, res )returnresdefhandle_minus_in_list(operator_list,calc_list):'''有的时候把算术符和值分开后,会出现这种情况 ['-', '-', '-'] [' ', '14969037.996825399 ', ' ', '12.0/ 10.0 ']

这需要把第2个列表中的空格都变成负号并与其后面的值拼起来,恶心死了'''

for index,i inenumerate(calc_list):if i == '': #它其实是代表负号,改成负号

calc_list[index+1] = i + calc_list[index+1].strip()defhandle_special_occactions(plus_and_minus_operators,multiply_and_dividend):'''有时会出现这种情况 , ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254'],2*...后面这段实际是 2*-14969036.7968254,需要特别处理下,太恶心了'''

for index,i inenumerate(multiply_and_dividend):

i=i.strip()if i.endswith("*") or i.endswith("/"):

multiply_and_dividend[index]= multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]del multiply_and_dividend[index+1]delplus_and_minus_operators[index]returnplus_and_minus_operators,multiply_and_dividenddefcompute(formula):'''这里计算是的不带括号的公式'''formula= formula.strip("()") #去除外面包的拓号

formula = remove_duplicates(formula) #去除外重复的+-号

plus_and_minus_operators = re.findall("[+-]", formula)

multiply_and_dividend= re.split("[+-]", formula) #取出乘除公式

if len(multiply_and_dividend[0].strip()) == 0:#代表这肯定是个减号

multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]delmultiply_and_dividend[0]delplus_and_minus_operators[0]

plus_and_minus_operators,multiply_and_dividend=handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)for index,i inenumerate(multiply_and_dividend):if re.search("[*/]",i):

sub_res=compute_mutiply_and_dividend(i)

multiply_and_dividend[index]=sub_res#开始运算+,-

print(multiply_and_dividend, plus_and_minus_operators)

total_res=Nonefor index,item inenumerate(multiply_and_dividend):if total_res: #代表不是第一次循环

if plus_and_minus_operators[index-1] == '+':

total_res+=float(item)elif plus_and_minus_operators[index-1] == '-':

total_res-=float(item)else:

total_res=float(item)print("\033[32;1m[%s]运算结果:\033[0m" %formula,total_res)returntotal_resdefcalc(formula):'''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''parenthesise_flag=True

calc_res= None #初始化运算结果为None,还没开始运算呢,当然为None啦

whileparenthesise_flag:

m= re.search("\([^()]*\)", formula) #找到最里层的拓号

ifm:#print("先算拓号里的值:",m.group())

sub_res =compute(m.group())

formula=formula.replace(m.group(),str(sub_res))else:print('\033[41;1m----没拓号了...---\033[0m')print('\n\n\033[42;1m最终结果:\033[0m',compute(formula))

parenthesise_flag= False #代表公式里的拓号已经都被剥除啦

if __name__ == '__main__':#res = calc("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")

res = calc("1 - 2 * ( (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) )")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值