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读取注册表中值的方法
Apr 08 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
python爬虫爬取快手视频多线程下载功能
Feb 28 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
python实现两张图片的像素融合
Feb 23 Python
浅析python redis的连接及相关操作
Nov 07 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
Django操作session 的方法
Mar 09 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
详解如何用Python实现感知器算法
Jun 18 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中数组的三种排序方法分享
2012/05/07 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
js实现华丽的九九乘法表效果
2017/03/29 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
python实现合并两个数组的方法
2015/05/16 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Python实现Event回调机制的方法
2019/02/13 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
最新自我评价范文
2013/11/16 职场文书
交通安全演讲稿
2014/01/07 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python