zoukankan      html  css  js  c++  java
  • Python 练习: 计算器

    import re
    
    def format_string(s):             # 对表达式进行格式化
        s = s.replace(' ', '')
        s = s.replace("--", "+")
        s = s.replace("++", "+")
        s = s.replace("+-", "-")
        s = s.replace("*+", "*")
        s = s.replace("/+", "/")
        return s
    
    
    def check_expression(s):          # 对表达式进行检测
        flag = True
        if not s.count("(") == s.count(")"):
            print("括号没有闭合")
            flag = False
        if re.findall('[a-z]+', s.lower()):
            print("有非法字符")
            flag = False
    
        return flag
    
    
    def calc_mul_div(s):
        regular = '[-]?d+.?d*[*/][-]?d+.?d*'
    
        while re.findall(regular, s):
            expression = re.search(regular, s).group()
    
            if expression.count("*"):          # 判断是否是乘法
                x, y = expression.split("*")
                mul_result = str(float(x) * float(y))
                s = s.replace(expression, mul_result)
                s = format_string(s)
    
            if expression.count("/"):          # 判断是否是除法
                x, y = expression.split('/')
                div_result = str(float(x) / float(y))
                s = s.replace(expression, div_result)
                s = format_string(s)
    
        return s
    
    
    def calc_add_sub(s):                       # 判断加减法
        add_regular = '[-]?d+.?d*+[-]?d+.?d*'
        sub_regular = '[-]?d+.?d*-[-]?d+.?d*'
    
        while re.findall(add_regular, s):
            add_list = re.findall(add_regular, s)
            for add_str in add_list:
                x, y = add_str.split("+")
                add_result = "+" + str(float(x) + float(y))
                s = s.replace(add_str, add_result)
            s = format_string(s)
    
        while re.findall(sub_regular, s):
            sub_list = re.findall(sub_regular, s)
            for sub_str in sub_list:
                numbers = sub_str.split("-")
                if len(numbers) == 3:      # 如果表达式类似 -1-1,则 list 是 ['', '1', '1'] ,
                                           # 如果表达式类似 8-2, 则 list 是 ['8', '2']
                    result = 0
                    for v in numbers:
                        if v:
                            result -= float(v)
                else:
                    x, y = numbers
                    result = float(x) - float(y)
                s = s.replace(sub_str, "+" + str(result))
            s = format_string(s)
    
        return s
    
    
    if __name__ == "__main__":
        s = '(( 2 /1 * 7 ) - ( 3 *4 ) )'
    
        if check_expression(s):
            s = format_string(s)
    
            while s.count("(") > 0:
                strs = re.search('([^()]*)', s).group()
                replace_str = calc_mul_div(strs)
    
                replace_str = calc_add_sub(replace_str)
    
                s = format_string(s.replace(strs, replace_str[1:-1]))  # 去掉多余的括号
    
            else:
                replace_str = calc_mul_div(s)
    
                replace_str = calc_add_sub(replace_str)
    
                s = s.replace(s, replace_str)
    
            print("result: ", s.replace("+", ""))
    
    
    运行结果:
    result:  2.0
    
  • 相关阅读:
    conda包手动下载 本地安装
    Effective C++这书很好
    jquery mobile 教程
    ASP.NET Core 3.1 + Swagger UI 的实际运用笔记
    textarea 里面输入的内容有换行,在页面用 js 展示时需要转义
    JS总结
    08、iframe、div、span标签
    07、表单
    06、表格
    05、列表序列
  • 原文地址:https://www.cnblogs.com/klvchen/p/8961467.html
Copyright © 2011-2022 走看看