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的PIL模块来进行图片对比
Feb 18 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
Python单例模式的两种实现方法
Aug 14 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
python2.7实现邮件发送功能
Dec 12 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
python实现图像拼接
Mar 05 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
文本加密解密
2006/06/23 Javascript
如何实现动态删除javascript函数
2007/05/27 Javascript
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
iostream与iostream.h的区别
2015/01/16 面试题
Linux的文件类型
2016/07/05 面试题
商务英语专业自荐信
2013/10/14 职场文书
社区母亲节活动方案
2014/03/05 职场文书