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读取html中指定元素生成excle文件示例
Apr 03 Python
python实现图书馆研习室自动预约功能
Apr 27 Python
redis之django-redis的简单缓存使用
Jun 07 Python
Python 互换字典的键值对实例
Feb 12 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
基于opencv实现简单画板功能
Aug 02 Python
python如何操作mysql
Aug 17 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中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
Python获取央视节目单的实现代码
2015/07/25 Python
python发送邮件功能实现代码
2016/07/15 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
Python yield 使用方法浅析
2017/05/20 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python探索之pLSA实现代码
2017/10/25 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
合作协议书
2014/04/23 职场文书
建设投标担保书
2014/05/13 职场文书
酒会邀请函
2015/01/31 职场文书
羊脂球读书笔记
2015/06/30 职场文书
2016教师国培研修感言
2015/12/08 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
教你怎么用python实现字符串转日期
2021/05/24 Python
JS代码编译器Monaco使用方法
2021/06/11 Javascript
Redis 哨兵集群的实现
2021/06/18 Redis
聊聊redis-dump工具安装问题
2022/01/18 Redis