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中的标识运算符
May 14 Python
python定时执行指定函数的方法
May 27 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
python中的计时器timeit的使用方法
Oct 20 Python
Python中.join()和os.path.join()两个函数的用法详解
Jun 11 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
Django框架安装方法图文详解
Nov 04 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 Python
Django REST Framework 分页(Pagination)详解
Nov 30 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中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
Python3.6正式版新特性预览
2016/12/15 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
快速查找Python安装路径方法
2020/02/06 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
《中华少年》教学反思
2014/02/15 职场文书
《三峡》教学反思
2014/03/01 职场文书
运动会的口号
2014/06/09 职场文书
党员个人党性分析材料
2014/12/18 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
祝寿主持词
2015/07/02 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
pandas中pd.groupby()的用法详解
2022/06/16 Python