zoukankan      html  css  js  c++  java
  • python_计算器

    import re
    from functools import reduce
    
    
    # 定义一个只计算两个数的乘法或除法的函数:
    def multiply_division(exp):
        if "*" in exp:
            # first=exp.split("*")[0]
            # second=exp.split("*")[1]
            first,second=exp.split("*")
            return float(first)*float(second)
        if "/" in exp:
            first,second=exp.split("/")
            return float(first) / float(second)
    
    # 定义一个只计算两个数的加法或减法的函数:
    def add_sub(exp):
        if "-" in exp:
            # first=exp.split("*")[0]
            # second=exp.split("*")[1]
            first,second=exp.split("-")
            return float(first)-float(second)
        if "/" in exp:
            first,second=exp.split("+")
            return float(first) + float(second)
    
    # 对于加减法要处理正负号  while循环处理所有的正负号
    def exp_fmt(exp):
        while re.search('[+-]{2,}',exp):  # 循环终止条件是re.search(pattern)为空
            exp = exp.replace('--','+')
            exp = exp.replace('+-','-')
            exp = exp.replace('-+','-')
            exp = exp.replace('++','+')
        return exp
    
    # ret=multiply_division("-1/4")
    # print(ret)
    # ret=add_sub("1-4")
    # print(ret)
    
    def multiply_division_replace(exp):
        # exp=exp_fmt(exp)
        while True:
            ret = re.search('d+(.d+)?[*/][+-]?d+(.d+)?', exp)
            # ret = re.search('d+(.d+)?[*/]-?d+(.d+)?', exp)
            if ret:
                res=multiply_division(ret.group(0))
                exp=exp.replace(ret.group(0),str(res))
            else:
                break
        return exp
    
    # def add_sub_replace(exp):
    #     while True:
    #         exp = exp_fmt(exp)
    #         ret = re.search('d+(.d+)?[+-]d+(.d+)?', exp)
    #         print(ret.group(0))
    #         if ret:
    #             res=add_sub(ret.group(0))
    #             exp=exp.replace(ret.group(0),str(res))
    #         else:
    #             break
    #     return exp
    #
    # exp="1—5+2+3"  --> -4+2+3  负号没法处理  最终报错
    # exp=add_sub_replace(exp)
    # print(exp)
    
    def remove_addsub(exp):
        print(exp)
        ret = re.findall('[-+]?d+(?:.d+)?',exp)  # (?:.d+)
        # (?:.d+)? 表示一个匹配不用保存的分组,要不然,findall返回的将是括号内的值的列表。
        print(ret)
        res = reduce(lambda a,b:float(a)+float(b),ret)  # 聚合求ret列表内的所有元素的和
        return res
        # count = 0
        # for i in ret:
        #     count += float(i)
        # print(count)
    
    
    exp="1--3*+5/-5+2+3"
    # exp="1—5+2+3"  -->  -4+2+3  负号没法处理
    exp=multiply_division_replace(exp)
    # exp=add_sub_replace(exp)
    print(exp)
    
    
    
    老师答案
    
    import re
    from functools import reduce
    
    def mul_div(exp): # 计算两个数的乘法或者除法
        if '*' in exp:
            a, b = exp.split('*')
            return float(a)*float(b)
        if '/' in exp:
            a, b = exp.split('/')
            return float(a) / float(b)
    
    def exp_fmt(exp):
        while re.search('[+-]{2,}',exp):
            exp = exp.replace('--','+')
            exp = exp.replace('+-','-')
            exp = exp.replace('-+','-')
            exp = exp.replace('++','+')
        return exp
    
    def remove_addsub(exp):
        ret = re.findall('[-+]?d+(?:.d+)?',exp)
        res = reduce(lambda a,b:float(a)+float(b),ret)
        return res
    
    def remove_muldiv(exp):   # 计算表达式中的所有的乘除法
        while True:
            ret = re.search('d+(.d+)?[*/]-?d+(.d+)?',exp)
            if ret:
                son_exp = ret.group()   # 3*4  12*5
                res = mul_div(son_exp)
                exp = exp.replace(son_exp,str(res))
            else:return exp
    
    def cal(exp):
        res = remove_muldiv(exp)   # 计算乘除
        res = exp_fmt(res)                  # 符号整理
        ret = remove_addsub(res)            # 计算加减
        return ret
    
    def main(exp):
        exp = exp.replace(' ','')
        while True:
            ret = re.search('([^()]+)', exp)
            if ret:
                res = cal(ret.group())
                exp = exp.replace(ret.group(), str(res))
            else: return cal(exp)
    
    exp = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    ret = main(exp)
    print(ret)
    
    
  • 相关阅读:
    优化tableView加载cell与model的过程
    java.net.UnknownHostException: master
    Give root password for maintenance(or type control -D to continue)
    软件自动化部署脚本
    关于yum网络版仓库(本地yum仓库的安装配置,如果没网了,做一个局域网内的yum仓库)
    一脸懵逼学习keepalived(对Nginx进行热备)
    一脸懵逼学习Nginx及其安装,Tomcat的安装
    一脸懵逼学习Linux的Shell编程
    一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)
    一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)
  • 原文地址:https://www.cnblogs.com/Collin-pxy/p/13034166.html
Copyright © 2011-2022 走看看