描述:用户输入一系列算式字符串,程序返回计算结果。

要求:不使用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 70行代码实现简单算式计算器解析相关推荐

  1. python 拆分excel工作表_Python几行代码轻松拆分表格

    Python几行代码轻松拆分表格 作者:梅朵 微信公众号:实用办公编程技能 微信号:Excel-Python 什么?,Python几行代码竟然可以按指定轻松拆分表格? 将test.xls中的数据按地区 ...

  2. python 判断图片中物体位置_Python 10行代码搞定图片中物体检测

    使用Python, 如何编程实现图片中的物体检测[也叫对象检测/object detection]? 怎么知道图像中有哪些物体? 或许您想要计算图像中苹果的数量? 在这篇文章中,我将向您展示如何使用P ...

  3. python用户输入算式并计算_Python 70行代码实现简单算式计算器

    描述:用户输入一系列算式字符串,程序返回计算结果. 要求:不使用eval.exec函数. 实现思路:找到当前字符串优先级最高的表达式,在算术运算中,()优先级最高,则取出算式最底层的(),再进行加减乘 ...

  4. python自动填写问卷代码_python 30行代码自动填写问卷(单选题和多选题)

    运行代码的条件 谷歌浏览器 下载好你的谷歌浏览器对应版本的chromedriver.exe解压到你的python.exe目录下 python3版本(我用的是3.7) 在python中安装好seleni ...

  5. aspx网页背景图片设置代码_python 30行代码自动填写问卷(单选题和多选题)

    运行代码的条件 谷歌浏览器 下载好你的谷歌浏览器对应版本的chromedriver.exe解压到你的python.exe目录下 python3版本(我用的是3.7) 在python中安装好seleni ...

  6. python按行拆分表格_Python几行代码轻松拆分表格

    Python几行代码轻松拆分表格 作者:梅朵 微信公众号:实用办公编程技能 微信号:Excel-Python 什么?,Python几行代码竟然可以按指定轻松拆分表格? 将test.xls中的数据按地区 ...

  7. Python科学计算库核心知识点总结_代码篇(ML/DL依赖语法)

    Python科学计算库核心知识点总结_代码篇(ML/DL依赖语法)                                                                    ...

  8. Python从入门到高手的80行代码

    文章目录 基础入门 菜鸟提升 基础晋级 高手之路 内置包库 奇技淫巧 最新版: Python从入门到入土的90行代码 基础入门 1 python 即在命令行输入python,进入Python的开发环境 ...

  9. 用70行代码实现日志分析程序​

    python又一力作,感受python的强大.用70行代码实现日志分析程序 功能介绍:可直接对文本日至进行分组和排序功能,完了输出结果粘贴到excel里就可以直接生成图表,对于排查一些生产环境问题有很 ...

最新文章

  1. Linux网络路由简介-查看网络路由
  2. DataReader和DataSet区别
  3. Android学习:自定义ViewGroup方法总结
  4. 微信JS-SDK使用步骤(以微信扫一扫为例)
  5. 刨根问底——Handler
  6. Struts2中配置默认Action
  7. [转]iOS5 ARC学习笔记:strong、weak等详解
  8. Git 添加空文件夹的方法
  9. e语言通用进销存源码_Go 语言设计哲学之五:代码风格的唯一标准
  10. cocos2d-x AssetsManager libcurl使用心得
  11. php 高并发接口,接口高并发解决方案
  12. Android半透明对话框实现
  13. 如何将文件PDF格式转换成Word格式
  14. 招投标信息爬虫 (只上最简单的版本,仅用于技术交流)
  15. python的sysfont_pygame.font.SysFont游戏文字交互
  16. 稍加改进的Switch/Case扩展方法
  17. 全网最详细,宿主机ping虚拟机的主机名失败,但ping虚拟机的ip成功
  18. 未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要!
  19. qiime2-2022.8基于ubuntu的安装教程
  20. 人工智能的前世今生,别被满大街的人工智能所迷惑

热门文章

  1. html中链接不自动变色,HTML 点击 标签 链接 点击之后变色-转发【已解决】
  2. C语言fread和fwrite的用法详解
  3. 更换计算机桌面背景的教案,桂科版三年级下册任务一 美化桌面背景免费教学设计...
  4. php中reset函数,PHP reset()函数
  5. emmet使用(HTML)
  6. oracle中orand使用,Postgres兼容Oracle研究——orafce调研
  7. python的字符编码叙述_Python: 熟悉又陌生的字符编码
  8. python升级版本命令_如何在python中安装和配置kivy库
  9. 面试后要请你吃饭_面试问同事请吃饭唯独不叫你咋办?小伙说这是好机会,当场被录取...
  10. arm9 中断向量 重定位_关于STM32中断向量表的位置 、重定向问题