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

要求:不使用eval、exec函数。

实现思路:找到当前字符串优先级最高的表达式,在算术运算中,()优先级最高,则取出算式最底层的(),再进行加减乘除运算。对于加减乘除,也要确立一个优先级,可以使用一个运算符列表,用for循环逐个处理运算符,并且要考虑同级情况(如for遍历至*时,也要考虑同级别的\是否要提前运算)。不断循环上述过程,直到最终得到一个结果。

关键点:使用re模块匹配出当前状态下优先级最高的算式。

result = re.search('\([^()]+\)',s)

实现代码:

  1. import re
  2. '''根据本逻辑,‘-’必须早于‘+’循环 否则特殊情况会报错
  3. 原因是若出现符号--,会被处理为+,若+优先遍历,最后+将无法被处理'''
  4. oper_char = ['^','*','/','-','+']
  5. def format_str(s):
  6. '''除去空格和两边括号'''
  7. return s.replace(' ','').replace('(','').replace(')','')
  8.  
  9. def handle_symbol(s):
  10. '''处理多个运算符并列的情况'''
  11. return s.replace('+-','-').replace('--','+').replace('-+','-').replace('++','+')
  12.  
  13. def cal(x,y,opertor):
  14. '''加减乘除开方'''
  15. if opertor == '^':return x**y
  16. elif opertor == '*':return x*y
  17. elif opertor == '/':return x/y
  18. elif opertor == '+':return x+y
  19. elif opertor == '-':return x-y
  20.  
  21. def Bottom_operation(s):
  22. '''无括号运算 返回一个浮点数
  23. symbol用于判断返回值是正还是负'''
  24. symbol = 0
  25. s = handle_symbol(s)
  26. for c in oper_char:
  27. while c in s:
  28. id,char = (s.find(c),c)
  29. if c in ('*','/') and '*' in s and '/' in s:
  30. ids,idd = (s.find('*'),s.find('/'))
  31. id,char = (ids,'*') if ids <= idd else (idd,'/')
  32. if c in ('+','-') and '+' in s and '-' in s:
  33. ida,idd = (s.find('+'),s.find('-'))
  34. id,char = (ida,'+') if ida <= idd else (idd,'-')
  35. if id == -1:break
  36. left,right = ('','')
  37. for i in range(id - 1,-1,-1):
  38. if s[i] in oper_char:break
  39. left = s[i] + left
  40. for i in range(id + 1,len(s)):
  41. if s[id+1] == '-':
  42. right += s[i]
  43. continue
  44. if s[i] in oper_char:break
  45. right += s[i]
  46. if right == '' or left == '':
  47. if s[0] in ('-','+'):
  48. if '+' not in s[1:] and '-' not in s[1:]:break
  49. s = s[1:].replace('-','负').replace('+','-').replace('负','+')
  50. symbol += 1
  51. continue
  52. else:return '输入算式有误'
  53. old_str = left + char + right
  54. new_str = str(cal(float(left),float(right),char))
  55. s = handle_symbol(s.replace(old_str,new_str))
  56. return float(s) if symbol % 2 == 0 else -float(s)
  57.  
  58. def get_bottom(s):
  59. '''获取优先级最高的表达式'''
  60. res = re.search('\([^()]+\)',s)
  61. if res != None:return res.group()
  62.  
  63. if __name__ == '__main__':
  64. while True:
  65. s1 = input('请输入您要计算的表达式(支持加减乘除开方): ')
  66. while get_bottom(s1) != None:
  67. source = get_bottom(s1)
  68. result = Bottom_operation(format_str((source)))
  69. s1 = s1.replace(source,str(result))
  70. print(Bottom_operation(format_str(s1)))

Python 70行代码实现简单算式计算器的更多相关文章

  1. python实战:用70行代码写了一个山炮计算器!

    python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...

  2. Python 5 行代码的神奇操作

    Python 语言实现功能直接了当,简明扼要,今天咱们就来一起看看 Python 5 行代码的神奇操作! 1.古典兔子问题 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语 ...

  3. Python第一行代码

    Python版本:Python 3.6.1 0x01 命令行交互 在交互式环境的提示符>>>下,直接输入代码,按回车,就可以立刻得到代码执行结果.现在,试试输入100+200,看看计 ...

  4. Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果

    Python 1行代码实现文本分类(实战笔记),含代码详细说明及运行结果 一.详细说明及代码 tc.py =============================================== ...

  5. Python几行代码实现邮件发送

    话不多说直接进入正题 首先我们需要安装一个名为'zmail'的包,终端执行'pip install zmail'即可实现安装. 直接上代码 import zmail mail = { 'subject ...

  6. 51行代码实现简单的PHP区块链

    本文原始地址:php区块链demo 今年区块链特别火,我也很火啊.我火什么呢.前几年,公众平台出现,还得花时间去学去看,后来小程序出现,又得花时间精力去学去看.现在比特币.以太坊等去中心化货币带起了区 ...

  7. Python 3 行代码 5 秒抠图的 AI 神器,根本无需 PS

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 苏克1900 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  8. python——5行代码采集3000+上市公司信息

    毕业季也到了找工作的季节了,很多小伙伴都会一家一家的公司去看,这得多浪费时间啊.今天用Python教大家怎么采集公司的信息,相信大家会很喜欢这个教程的,nice! 基本环境配置 版本:Python3 ...

  9. jquery轮播图详解,40行代码即可简单解决。

    我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jq ...

随机推荐

  1. 原生js实现图片懒加载+加入节流

    这两天在学习图片的懒加载实现,看了很多大佬的博客,终于有了点成果.现在用了其中一位大佬的文章中的代码实现了图片懒加载并且在其基础上加入了节流函数. 原理就不多讲了,有需要的可以去大佬的文章看看.大佬文 ...

  2. 【Java例题】2.6 三角形的面积

    6. 用海伦公式计算三角形的面积. 设边长分别时a,b和c,s=(a+b+c)/2, 则三角形面积area=sqrt(s*(s-a)*(s-b)*(s-c)). package study; impo ...

  3. 天气预报APP(1)

    一个天气预报APP至少应该具备以下功能: *可以罗列出全国所有的省.市.县: *可以查看全国任意城市的天气信息: *可以自由的切换城市,去查看其他城市的天气: *提供手动更新以及后台自动更新天气的功能 ...

  4. Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)

    Zookeeper是开源的,如果想多了解Zookeeper或看它的源码,最好是能找到它的源码并在 IDE 里启动,可以debug看它咋执行的,能够帮助你理解其原理. 准备源码 所以我们很容易搞到它的源 ...

  5. 关于阿里云Mysql分页查询不走索引的问题

    需要修改阿里云中的MYSQL 配置参数 : eq_range_index_dive_limit 阿里云上默认是 10 , 这个参数 表示 in 查询 条件超过 10 个 就不走索引,走全表扫描.如果我 ...

  6. Sqlserver 锁表查询代码记录

    --方法1WITH CTE_SID ( BSID, SID, sql_handle ) AS ( SELECT blocking_session_id , session_id , sql_handl ...

  7. python学习笔记(6)--面向对象学习

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.   引言 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做(人狗大战)的游戏,你就思 ...

  8. Zabbix添加windows主机监控

    zabbix监控windows主机 1.官网下载zabbix的windows-agent(选择相应版本): https://www.zabbix.com/cn/download_agents 2.将下 ...

  9. python paramiko外部传参和内部调用命令的方法

    学习了很久的python,但在工作中使用的时候,却发现不知道怎么传参进入到python中执行,所以这两天就研究 了python args怎么将外部参数传入到python中执行 1.首先使用python ...

  10. 利用WxJava实现网站集成微信登录功能,核心代码竟然不超过10行

    最近网站PC端集成微信扫码登录,踩了不少坑,在此记录下实现过程和注意事项. 本文目录 一.微信开放平台操作步骤1.创建“网站应用”2.获取AppID和AppSecret二.开发指南三.开发实战1.po ...