python手写计算器

python手写计算器

说明这个python计算器只是在运行窗口输入数据没有图形化界面,下面是完整代码和每一步的注释,代码还可以进行简化期待大佬的改进:

import re # 导入re模块 正则表达式的模块
#express = '1 - 2*( (6 0 -3 0 +(-40/5)*(9-2*5/3+ 7/3*99/4*2998 +10 * 568/14 ))-(-4*3)/ (16-3*2))'
express = input('>>>')

# 1.去空格
new_express = express.replace(' ','') #去空格
print(1,new_express)

# 5. 算式的整理
def  deal_with(exp):
    #替换返回替换的结果
    exp = exp.replace('+-','-')
    exp = exp.replace('--','+')
    return exp


# 4.计算原子表达式
def cal_exp_son(exp_son):
    if '/' in exp_son:
        a,b = exp_son.split('/') #用/进行划分,同时赋值给a,b
        return str(float(a)/float(b))
    elif '*' in exp_son:
        a,b = exp_son.split('*')  #跟上面同理
        return str(float(a)*float(b))


# 3.计算括号内的表达式
def cal_express_no_bracket(exp):
    while True: #进行循环直到把所有的乘除法表达式全部算完
        # 去括号
        exp = exp.strip('()')
        # 先乘除再加减
        ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',exp) #匹配式子中乘法或者除法表达式
        if ret:      #如果存在乘法或者除法表达式
            exp_son = ret.group()  #拿到匹配到的第一个表达式例如 -40/5
            print(3,exp_son)
            ret = cal_exp_son(exp_son) #调用该函数进行计算并拿到计算后的结果
            exp = exp.replace(exp_son,ret) #将计算好的结果替换回传进来的表达式  -40/5 替换成 -8.0
            exp = deal_with(exp)  #对替换好的表达式进行整理,以免出现bug
        else:
            # 这时说明括号内的表达式没有乘法或者除法表达式了
            list = re.findall('-?\d+\.?\d*',exp) #findall()返回的是一个列表,这里进行正则匹配,将匹配的数字放入列表中
            sum  = 0
            for i in list: #遍历列表进行求和
                sum += float(i)
            return str(sum)  #将括号内的值计算好再以字符串的形式返回出去

#2.找最内层的括号
while True:
    ret = re.search('\([^()]+\)',new_express) #匹配最内侧的括号
    if ret:# 如果匹配到了
        express_no_bracket = ret.group() #找到最内侧括号的第一个括号
        print(2, express_no_bracket)
        ret = cal_express_no_bracket(express_no_bracket) #调用该函数进行计算括号内的值
        new_express = new_express.replace(express_no_bracket,ret) #对整体的表达式进行替换,就是将整个括号内的值替换到原表达式中
        new_express = deal_with(new_express) #对替换后的表达式进行整理
        print(new_express)
    else:
        new_express = cal_express_no_bracket(new_express) #当全部的括号都算完时,这时表达式中只有加减算法,直接调用该函数进行计算
        print(new_express) #输出最终的结果
        break #整个表达式计算完毕
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值