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深入学习之特殊方法与多范式
Aug 31 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
python 写的一个爬虫程序源码
Feb 28 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
Apr 20 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
python 实现dict转json并保存文件
Dec 05 Python
python中wx模块的具体使用方法
May 15 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
Python+Tkinter打造签名设计工具
Apr 01 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代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
php进程间通讯实例分析
2016/07/11 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
Vue3为什么这么快
2020/09/23 Javascript
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Python中关于浮点数的冷知识
2019/09/22 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
python基于socket函数实现端口扫描
2020/05/28 Python
详解KMP算法以及python如何实现
2020/09/18 Python
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
电脑教师的自我评价
2013/12/18 职场文书
新闻专业个人求职信
2013/12/19 职场文书
入党积极分子思想汇报范文
2014/01/05 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL
bose降噪耳机音能消除人声吗
2022/04/19 数码科技
Python实现信息管理系统
2022/06/05 Python