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 相关文章推荐
wxPython学习之主框架实例
Sep 28 Python
Python中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
Sanic框架配置操作分析
Jul 17 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
基于pytorch的保存和加载模型参数的方法
Aug 17 Python
如何利用python给图片添加半透明水印
Sep 06 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
vue实现购物车案例
2020/05/30 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
Python实现在线程里运行scrapy的方法
2015/04/07 Python
详解Python编程中包的概念与管理
2015/10/16 Python
Python 迭代器与生成器实例详解
2017/05/18 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
详解python with 上下文管理器
2020/09/02 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
如何写出好的Java代码
2014/04/25 面试题
历史系自荐信范文
2013/12/24 职场文书
避暑山庄导游词
2015/02/04 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
担保贷款承诺书
2015/04/30 职场文书
怎么用Python识别手势数字
2021/06/07 Python
Java字符串逆序方法详情
2022/03/21 Java/Android