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中操作文件之truncate()方法的使用教程
May 25 Python
利用aardio给python编写图形界面
Aug 21 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
Python微医挂号网医生数据抓取
Jan 24 Python
对python中UDP,socket的使用详解
Aug 22 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
python实现图像外边界跟踪操作
Jul 13 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
Python中使用ipython的详细教程
Jun 22 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中feof()函数实例测试
2014/08/23 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
vue实现树形菜单效果
2018/03/19 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
python实现多线程的两种方式
2016/05/22 Python
一份python入门应该看的学习资料
2018/04/11 Python
python 检查文件mime类型的方法
2018/12/08 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
python实现大学人员管理系统
2019/10/25 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
毕业生怎样写好自荐信
2013/11/11 职场文书
消防安全汇报材料
2014/02/08 职场文书
《散步》教学反思
2014/03/02 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
收款委托书范本
2014/09/11 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
亲戚关系证明
2015/06/24 职场文书
认识实习感想
2015/08/10 职场文书