• Python开发之【简单计算器】


    开发一个简单的python计算器

      1.实现加减乘除及括号优先级解析

      2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )

    等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能实现), 运算后得出结果,结果必须与真实的计算器所得出的结果一致

      分析:

        一、判断用户输入的公式是否正确(下面只做了4条,其它暂无添加)

          1、先去除空格

          2、不能出现字母

          3、"("与")"必须配对

          4、+、-、*、/不能重复

        二、考虑优先级,先算()内部,再算*/,最后算+-

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import re
     4 from functools import reduce
     5 
     6 
     7 # 检查表达式合法性
     8 def check_formula(formula):
     9     tag = True
    10     if re.findall("[a-zA-Z]", formula):  # 包含字母
    11         tag = False
    12     if not len(re.findall("(", formula)) == len(re.findall(")", formula)):  # (与)不匹配
    13         tag = False
    14     if re.findall("()", formula):  # 只出现()
    15         tag = False
    16     return tag
    17 
    18 
    19 # 去掉重复的运算符
    20 def repeat_operator(formula):
    21     formula = formula.replace("++", "+")
    22     formula = formula.replace("-+", "-")
    23     formula = formula.replace("+-", "-")
    24     formula = formula.replace("--", "+")
    25     return formula
    26 
    27 
    28 # 计算乘除运算
    29 def count_mul_div(formula):
    30     is_have_muldiv = re.search("d+.?d*[*/]-?d+.?d*", formula)  # 匹配含有*/运算的表达式
    31     if is_have_muldiv:
    32         bracketin_formula = is_have_muldiv.group()
    33         x, y = re.split("[*/]", bracketin_formula)  # 以*或/分割得到两个数据
    34         mul_or_div = re.search("[*/]", bracketin_formula).group()  # 获取运算符
    35         if mul_or_div == "*":
    36             operation_result = float(x) * float(y)
    37         else:
    38             operation_result = float(x) / float(y)
    39         operation_result = str(operation_result)
    40         formula = formula.replace(bracketin_formula, operation_result)  # 将乘除结果替换上面找到的乘除运算
    41         return count_mul_div(formula)  # 有*/,继续调用自己做乘除
    42     else:
    43         return count_add_sub(formula)  # 没有*/,调用加减计算
    44 
    45 
    46 # 计算加减运算
    47 def count_add_sub(formula):
    48     formula = repeat_operator(formula)
    49     is_have_muldiv = re.search("-?d+.?d*[+-]d+.?d*", formula)  # 匹配含有+-运算的表达式
    50     if is_have_muldiv:
    51         bracketin_formula = is_have_muldiv.group()
    52         nums_list = re.findall("-?d+.?d*", bracketin_formula)  # 匹配除+号外的数字
    53         operation_result = reduce(lambda x, y: float(x) + float(y), nums_list)  # reduce求和
    54         operation_result = str(operation_result)
    55         formula = formula.replace(bracketin_formula, operation_result)  # 将加减结果替换上面找到的加减运算
    56         return count_add_sub(formula)  # 继续调用自己做加减运算
    57     else:
    58         formula = formula.strip("()")  # 将运算结果外面()去掉
    59         return formula  # 没有+-,运算完成,返回运算结果
    60 
    61 
    62 # 主逻辑
    63 while True:
    64     formula = re.sub(" +", "", input("请输入数学表达式或按q退出:"))  # 输入表达式,去除空格
    65     result = None
    66     if formula.lower() == "q":
    67         break
    68     else:
    69         if check_formula(formula):  # 判断表达式合法性
    70             is_bracket_flag = True
    71             while is_bracket_flag:
    72                 formula = repeat_operator(formula)  # 去除重复运算符
    73                 bracket_bestin = re.search("([^()]*)", formula)  # 找最内层括号
    74                 if bracket_bestin:
    75                     bracket_bestin = bracket_bestin.group()
    76                     result = count_mul_div(bracket_bestin)  # 调用乘除计算
    77                     formula = formula.replace(bracket_bestin, result)  # 替换原表达式的内层括号
    78                 else:
    79                     is_bracket_flag = False # 找不到括号
    80                     result = count_mul_div(formula) # 调用乘除计算
    81         else:
    82             print("输入表达式有误!")
    83     if result:
    84         print(result)
    代码
  • 相关阅读:
    nginx 与 lua 开发笔记
    使用openresty + lua 搭建api 网关(一)安装openresty ,并添加lua模块
    Java使用POI接口读写Excel文件方法
    React常用的库安装
    Android手机捉包
    ffmpeg压缩视频
    用 TypeScript 写 React & Redux
    yarn使用
    Angular 组件引入其他css不生效
    Webstrom技巧
  • 原文地址:https://www.cnblogs.com/heilongorz/p/6186634.html
Copyright © 2020-2023  润新知