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学习之asyncore模块用法实例教程
Sep 29 Python
在centos7中分布式部署pyspider
May 03 Python
浅析Python数据处理
May 02 Python
python编写简易聊天室实现局域网内聊天功能
Jul 28 Python
python对日志进行处理的实例代码
Oct 06 Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
python写一个随机点名软件的实例
Nov 28 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
Python绘图之二维图与三维图详解
Aug 04 Python
Python绘制数码晶体管日期
Feb 19 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 调用远程url的六种方法小结
2009/11/02 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
js计算精度问题小结
2013/04/22 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
Vue中props的详解
2019/05/16 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
Python pip配置国内源的方法
2020/02/14 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
python Timer 类使用介绍
2020/12/28 Python
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
中药专业自荐信范文
2014/03/18 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
房产协议书范本2014
2014/09/30 职场文书
信访稳定工作汇报
2014/10/27 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫