Python 70行代码实现简单算式计算器解析


Posted in Python onAugust 30, 2019

描述:用户输入一系列算式字符串,程序返回计算结果。

要求:不使用eval、exec函数。

实现思路:找到当前字符串优先级最高的表达式,在算术运算中,()优先级最高,则取出算式最底层的(),再进行加减乘除运算。对于加减乘除,也要确立一个优先级,可以使用一个运算符列表,用for循环逐个处理运算符,并且要考虑同级情况(如for遍历至*时,也要考虑同级别的\是否要提前运算)。不断循环上述过程,直到最终得到一个结果。

关键点:使用re模块匹配出当前状态下优先级最高的算式。

result = re.search('\([^()]+\)',s)

实现代码:

import re
'''根据本逻辑,‘-'必须早于‘+'循环 否则特殊情况会报错
  原因是若出现符号--,会被处理为+,若+优先遍历,最后+将无法被处理'''
oper_char = ['^','*','/','-','+']
def format_str(s):
  '''除去空格和两边括号'''
  return s.replace(' ','').replace('(','').replace(')','')
 
def handle_symbol(s):
  '''处理多个运算符并列的情况'''
  return s.replace('+-','-').replace('--','+').replace('-+','-').replace('++','+')
 
def cal(x,y,opertor):
  '''加减乘除开方'''
  if opertor == '^':return x**y
  elif opertor == '*':return x*y
  elif opertor == '/':return x/y
  elif opertor == '+':return x+y
  elif opertor == '-':return x-y
 
def Bottom_operation(s):
  '''无括号运算 返回一个浮点数
    symbol用于判断返回值是正还是负'''
  symbol = 0
  s = handle_symbol(s)
  for c in oper_char:
    while c in s:
      id,char = (s.find(c),c)
      if c in ('*','/') and '*' in s and '/' in s:
        ids,idd = (s.find('*'),s.find('/'))
        id,char = (ids,'*') if ids <= idd else (idd,'/')
      if c in ('+','-') and '+' in s and '-' in s:
        ida,idd = (s.find('+'),s.find('-'))
        id,char = (ida,'+') if ida <= idd else (idd,'-')
      if id == -1:break
      left,right = ('','')
      for i in range(id - 1,-1,-1):
        if s[i] in oper_char:break
        left = s[i] + left
      for i in range(id + 1,len(s)):
       if s[id+1] == '-':
         right += s[i]
        continue
        if s[i] in oper_char:break
        right += s[i]
      if right == '' or left == '':
        if s[0] in ('-','+'):
          if '+' not in s[1:] and '-' not in s[1:]:break
          s = s[1:].replace('-','负').replace('+','-').replace('负','+')
          symbol += 1
          continue
        else:return '输入算式有误'
      old_str = left + char + right
      new_str = str(cal(float(left),float(right),char))
      s = handle_symbol(s.replace(old_str,new_str))
  return float(s) if symbol % 2 == 0 else -float(s)
 
def get_bottom(s):
  '''获取优先级最高的表达式'''
  res = re.search('\([^()]+\)',s)
  if res != None:return res.group()
 
if __name__ == '__main__':
  while True:
    s1 = input('请输入您要计算的表达式(支持加减乘除开方): ')
    while get_bottom(s1) != None:
      source = get_bottom(s1)
      result = Bottom_operation(format_str((source)))
      s1 = s1.replace(source,str(result))
    print(Bottom_operation(format_str(s1)))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python数据结构之图的实现方法
Jul 08 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
python实现发送form-data数据的方法详解
Sep 27 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
什么是python的函数体
Jun 19 Python
python获取linux系统信息的三种方法
Oct 14 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Python多个MP4合成视频的实现方法
Jul 16 Python
Python类中方法getitem和getattr详解
Aug 30 #Python
Python paramiko模块使用解析(实现ssh)
Aug 30 #Python
django中上传图片分页三级联动效果的实现代码
Aug 30 #Python
python实现生成Word、docx文件的方法分析
Aug 30 #Python
python解析yaml文件过程详解
Aug 30 #Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 #Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 #Python
You might like
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
javascript 一些用法小结
2009/09/11 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
PHP守护进程实例
2015/03/06 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
python使用Tesseract库识别验证
2018/03/21 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
python2 对excel表格操作完整示例
2020/02/23 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
平面设计师的工作职责
2013/11/21 职场文书
作弊检讨书1000字
2014/02/01 职场文书
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
庆六一活动总结
2014/08/29 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
总结Python使用过程中的bug
2021/06/18 Python