专栏首页python3Python之简易计算器

Python之简易计算器

  思路:学会运用正则表达式把需要先进行计算的匹配出来,然后再一步步的去算,把先算出来的值替换原来的值,再进一步的把++,--等号变成我们正常的数学上的符号,然后再进行一步步的替换,最终把带括号的都计算出来,再调用一次加减函数进行计算

import re

def atom_cal(exp):      #计算乘除法
    if "*" in exp:
        a,b = exp.split("*")    #以*作切割,把切出来的两个值分别赋给a,b
        return str(float(a) * float(b)) #用float计算ab相乘的值并转换成字符串格式,便于计算
    else:
        a,b = exp.split("/")    #以/作切割,把切出来的两个值分别赋给a,b
        return str(float(a) / float(b))

def mul_div(exp):   #乘除
    while 1:
        ret = re.search("\d+(\.\d+)?[*/]-?\d+(\.\d+)?",exp)     #把乘除法匹配出来
        if ret:
            atom_exp = ret.group()  #取第一个组匹配出来的乘除法
            res = atom_cal(atom_exp)    #调用atom_cal函数计算乘除法
            exp = exp.replace(atom_exp,res)     #替换  将计算出来的值与原式子替换
        else:return exp     #当没有相匹配的乘除法时,返回exp

def format_exp(exp):    #改变符号
    exp = exp.replace("--","+")
    exp = exp.replace("-+","-")
    exp = exp.replace("+-","-")
    exp = exp.replace("++","+")
    return exp

def add_sub(exp):   #计算加减
    ret = re.findall("[+-]?\d+(?:\.\d+)?",exp)  #把能加减的匹配出来,包括小数,负数等
    exp_sum = 0
    for i in ret:
        exp_sum += float(i)     #累加至exp_sum中返回
    return exp_sum

def cal(exp):
    exp = mul_div(exp)  #乘除
    exp = format_exp(exp) #变号
    exp_sum = add_sub(exp)  #加减
    return exp_sum      #float

def main(exp):
    exp = exp.replace(" ","")#去空格
    while 1:
        ret = re.search("\([^()]+\)",exp)    #括号最里面的数
        if ret:
            inner_bracket = ret.group()     #取正则表达式匹配到的第一个组数
            res = str(cal(inner_bracket))       #调用cal计算
            exp = exp.replace(inner_bracket,res)           #把算出来的值返回给括号
            exp = format_exp(exp)   #调用函数,变号
        else:break
    return cal(exp)
s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
print(main(s))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python深度学习库系列教程——pyt

    和Python一样,当前的OpenCV也有两个大版本,OpenCV2和OpenCV3。相比OpenCV2,OpenCV3提供了更强的功能和更多方便的特性。不过考...

    py3study
  • Python 计算当真因子个数为偶数个时

    若一个正整数有偶数个不同的真因子,则称该数为幸运数。如4含有2个真因子为 1 和 2 。故4是幸运数。求【2,100】之间的全部幸运数之和。

    py3study
  • python数据结构和GIL及多进程

    py3study
  • 生信技能树R语言作业-高级

    数据包: ALL, CLL, pasilla, airway 软件包:limma,DESeq2,clusterProfiler 工具包:reshape2 ...

    Y大宽
  • “优雅”的Linux漏洞:用罕见方式绕过ASLR和DEP保护机制

    最近国外研究人员公布的一段exp代码能够在打完补丁的Fedora等Linux系统上进行drive-by攻击,从而安装键盘记录器、后门和其他恶意软件。 这次的ex...

    FB客服
  • 简单计算器(栈的变种)- HDU 1237

    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输...

    ACM算法日常
  • 人为了什么留在一个平台?

    作者:eka,腾讯产品经理 近有三件事让我思考同一个问题。 第一件事:一直刷朋友圈,也一度一直刷空间,发现自己产生了依赖,所以在想是什么让我依赖这些平台? 第二...

    腾讯大讲堂
  • 如何用代码填充S/4HANA销售订单行项目的数量字段

    我的任务是用代码生成S/4HANA销售订单(Sales Order)的行项目,并且填充对应的quantity(数量)值。

    Jerry Wang
  • 如何用代码填充S/4HANA销售订单行项目的数量字段

    我的任务是用代码生成S/4HANA销售订单(Sales Order)的行项目,并且填充对应的quantity(数量)值。

    Jerry Wang
  • OpenCV Code Snippets——BGR与YUV转换

    OpenCV BGR 图 转 YUV 图的代码,网上没有比较完整的示例,使用的时候搜索比较费劲。这里写一个代码片段和例子,方便查找。

    王云峰

扫码关注云+社区

领取腾讯云代金券