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黑魔法@property装饰器的使用技巧解析
Jun 16 Python
深入学习Python中的装饰器使用
Jun 20 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
python的常见矩阵运算(小结)
Aug 07 Python
python实现的爬取电影下载链接功能示例
Aug 26 Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
python爬虫爬取某网站视频的示例代码
Feb 20 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python异常处理例题整理
2019/07/07 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python计算auc的方法
2020/09/09 Python
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
就业推荐表自我鉴定
2013/10/29 职场文书
机械专业毕业生自荐信
2013/11/02 职场文书
《和我们一样享受春天》教学反思
2014/02/07 职场文书
双语教学实施方案
2014/03/23 职场文书
合伙经营协议书范本
2014/04/18 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
小学生毕业评语
2014/12/26 职场文书
2015年幼儿园德育工作总结
2015/05/25 职场文书
党支部审查意见
2015/06/02 职场文书
Python基础详解之描述符
2021/04/28 Python
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技