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 CSV模块使用实例
Apr 09 Python
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
用python中的matplotlib绘制方程图像代码
Nov 21 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
Python request中文乱码问题解决方案
Sep 17 Python
浅析Django接口版本控制
Jun 26 Python
python三子棋游戏
May 04 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
PHP 高手之路(一)
2006/10/09 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
利用python提取wav文件的mfcc方法
2019/01/09 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
Python爬取梨视频的示例
2021/01/29 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
自考自我鉴定范文
2013/10/30 职场文书
餐厅考勤管理制度
2014/01/28 职场文书
财务担保书范文
2014/04/02 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
暑期培训班招生方案
2014/08/26 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
员工教育培训协议书
2014/09/27 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
给客户的感谢信
2015/01/21 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js