使用到了模块re,正则,字典等

# 实现简单的加减乘除括号等运算
# Calculator def calculator(expression):
print(expression)
import re
# 操作字典,目前只支持加减乘除
operatorDict ={
'+': lambda a, b: float(a)+float(b),
'-': lambda a, b: float(a)+float(b),
'*': lambda a, b: float(a)+float(b),
'/': lambda a, b: float(a)+float(b),
}
# 计算去括号后表达式的值
def calBrackets(expre):
for i in operatorDict:
expre = expre.replace(i, 's'+i+'s')
l = expre.split('s') # 表达式转化为数字运算符列表
# 将-和数字组合在一起
l2, i = [], 0
while i < len(l):
# 处理负数
if l[i] == '': # 负号开头或者负号与其他运算符连在一起,splite后会为'',例如 -5*-2 ['','-','5','*','','-','2']
l2.append(l[i+1]+l[i+2]) # 将符号和数字合一起 -2
i += 2
else:
l2.append(l[i])
i += 1
# l2为新数字运算符列表(处理符号后,例['-1', '+', '*', '-3'])
# 运算乘除
i = 1
while i < len(l2): # 计算乘除
if l2[i] in ['*', '/']:
# 将符号左右以及符号三个元素替换为运算结果,必须是个列表, list[m:n] :切片取值连续,不包括n
l2[i-1:i+2] = [operatorDict[l2[i]](l2[i-1], l2[i+1])] # 运算
else:
i += 2
# 运算加减,直接按顺序计算替换
while len(l2) > 1:
l2[0:3] = [operatorDict[l2[1]](l2[0], l2[2])]
return str(l2[0])
# 去除空格
expression = expression.replace(' ', '')
# 正则匹配表达式是否包含括号 [^\(\)] : 匹配不是( 或者) 的内容,即非括号内容
check = re.search('\([^\(\)]+\)', expression) # 返回匹配到的内容,带括号,只返回一个
# 去掉括号
while check:
checkValue = check.group()
# 将匹配到的括号表达式替换成值,括号去掉使用函数求值
expression = expression.replace(checkValue, calBrackets(checkValue[1:-1]))
check = re.search('\([^\(\)]*\)', expression)
else:
return calBrackets(expression)
# 测试
result = calculator('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )')
print(result)

  主要逻辑部分做了注释,参考了d_k的一篇评论,主要是计算部分与正则部分!!!

最新文章

  1. Linux虚拟化学习笔记&lt;一&gt;
  2. 旧文备份:CANopen协议PDO的几种传输方式
  3. Html之head部分详解
  4. js继承精益求精之寄生式组合继承
  5. Core Data数据操作
  6. 条件控制(if ) ( case)
  7. IOS UITabelView的cell
  8. java学习之路---线程(重点)
  9. 【JPA】表达条件查询的关键字
  10. 高效的VS调试技巧
  11. muduo网络库使用心得
  12. Flash与DIV的层叠顺序问题
  13. ASP.NET - Eval数据绑定
  14. 随想录(移动app下的生活)
  15. Bootstrap3 多个模态对话框无法显示的问题
  16. 419 JQuery and BootStrap
  17. nvm的使用
  18. LoadRunner(四)——深度了解LR相关功能
  19. position:fixed 兼容浏览器低版本
  20. css 控制文字超出部分显示省略号

热门文章

  1. 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
  2. ZOJ3435_Ideal Puzzle Bobble
  3. Yarn源码分析1(Hadoop2.7.2)
  4. BZOJ3267/3272 KC采花/Zgg吃东西(线段树)
  5. hdu 3307 简单的指数循环节
  6. LINUX第四周学习
  7. linux内核分析 第六周读书笔记
  8. QNX下进程间通信
  9. 【Asp.net入门3-01】使用jQuery-创建示例项目
  10. MySQL 快速入门