1 import re
  2 import functools
  3
  4
  5 def minus_operator_handler(formula):
  6     '''处理一些特殊的减号运算'''
  7     minus_operators = re.split("-",formula)
  8     calc_list= re.findall("[0-9]",formula)
  9     if minus_operators[0] == '': #第一值肯定是负号
 10         calc_list[0] = '-%s' % calc_list[0]
 11     res = functools.reduce(lambda x,y:float(x) - float(y), calc_list)
 12     print("\033[33;1m减号[%s]处理结果:\033[0m" % formula, res )
 13     return res
 14
 15 def remove_duplicates(formula):
 16     formula = formula.replace("++","+")
 17     formula = formula.replace("+-","-")
 18     formula = formula.replace("-+","-")
 19     formula = formula.replace("--","+")
 20     formula = formula.replace("- -","+")
 21     return formula
 22 def compute_mutiply_and_dividend(formula):
 23     '''算乘除,传进来的是字符串噢'''
 24     operators = re.findall("[*/]", formula )
 25     calc_list = re.split("[*/]", formula )
 26     res = None
 27     for index,i in enumerate(calc_list):
 28         if res:
 29             if operators[index-1] == "*":
 30                 res *= float(i)
 31             elif operators[index-1] == "/":
 32                 res /= float(i)
 33         else:
 34             res = float(i)
 35
 36     print("\033[31;1m[%s]运算结果=\033[0m" %formula, res  )
 37     return res
 38 def handle_minus_in_list(operator_list,calc_list):
 39     '''有的时候把算术符和值分开后,会出现这种情况  ['-', '-', '-'] [' ', '14969037.996825399 ', ' ', '12.0/ 10.0 ']
 40        这需要把第2个列表中的空格都变成负号并与其后面的值拼起来,恶心死了
 41     '''
 42     for index,i in enumerate(calc_list):
 43         if i == '': #它其实是代表负号,改成负号
 44             calc_list[index+1] = i + calc_list[index+1].strip()
 45 def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend):
 46     '''有时会出现这种情况 , ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254'],2*...后面这段实际是 2*-14969036.7968254,需要特别处理下,太恶心了'''
 47     for index,i in enumerate(multiply_and_dividend):
 48         i = i.strip()
 49         if i.endswith("*") or i.endswith("/"):
 50             multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
 51             del multiply_and_dividend[index+1]
 52             del plus_and_minus_operators[index]
 53     return plus_and_minus_operators,multiply_and_dividend
 54 def compute(formula):
 55     '''这里计算是的不带括号的公式'''
 56
 57     formula = formula.strip("()") #去除外面包的拓号
 58     formula = remove_duplicates(formula) #去除外重复的+-号
 59     plus_and_minus_operators = re.findall("[+-]", formula)
 60     multiply_and_dividend = re.split("[+-]", formula) #取出乘除公式
 61     if len(multiply_and_dividend[0].strip()) == 0:#代表这肯定是个减号
 62         multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
 63         del multiply_and_dividend[0]
 64         del plus_and_minus_operators[0]
 65
 66     plus_and_minus_operators,multiply_and_dividend=handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)
 67     for index,i in enumerate(multiply_and_dividend):
 68         if re.search("[*/]" ,i):
 69             sub_res = compute_mutiply_and_dividend(i)
 70             multiply_and_dividend[index] = sub_res
 71
 72     #开始运算+,-
 73     print(multiply_and_dividend, plus_and_minus_operators)
 74     total_res = None
 75     for index,item in enumerate(multiply_and_dividend):
 76         if total_res: #代表不是第一次循环
 77             if plus_and_minus_operators[index-1] == '+':
 78                 total_res += float(item)
 79             elif plus_and_minus_operators[index-1] == '-':
 80                 total_res -= float(item)
 81         else:
 82             total_res = float(item)
 83     print("\033[32;1m[%s]运算结果:\033[0m" %formula,total_res)
 84     return total_res
 85
 86 def calc(formula):
 87     '''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''
 88     parenthesise_flag = True
 89     calc_res = None #初始化运算结果为None,还没开始运算呢,当然为None啦
 90     while parenthesise_flag:
 91         m = re.search("\([^()]*\)", formula) #找到最里层的拓号
 92         if m:
 93             #print("先算拓号里的值:",m.group())
 94             sub_res = compute(m.group())
 95             formula = formula.replace(m.group(),str(sub_res))
 96         else:
 97             print('\033[41;1m----没拓号了...---\033[0m')
 98
 99             print('\n\n\033[42;1m最终结果:\033[0m',compute(formula))
100             parenthesise_flag = False #代表公式里的拓号已经都被剥除啦
101
102 if __name__ == '__main__':
103
104     #res = calc("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")
105     res = calc("1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")

转载于:https://www.cnblogs.com/JerryZao/p/8681379.html

python实现计算器相关推荐

  1. python实现计算器代码 博客园_python实现计算器

    python实现计算器 1.题目描述 实现一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算 1.1输入 ...

  2. python -- 计算 平方、乘方、平方根_从零开始学习PYTHON3讲义(二)把Python当做计算器...

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  3. 从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  4. python编写计算器输入1或2代表+或x_Python实现两款计算器功能示例

    本文实例为大家分享了Python实现计算器功能示例代码,供大家参考,具体内容如下 1.简单计算器 #计算一个表达式的时候,首先肯定是先算括号里面的,再算乘除法,后算加减法 import re # 1. ...

  5. python简单计算器下载安装到手机_python计算器app下载

    Python计算器安卓版非常有意思,采用了python语言来为你完成一个不错的内容体验.其中的玩法是比较丰富的,而且还可以为你提供更多的内容.欢迎来当易网下载! python计算器最新版简介: 这是基 ...

  6. 拿Python当作计算器

    目录 介绍 代码示例 技巧 优点 参考文档 介绍 Python 当作计算器是指你可以用 Python 的交互式解释器或者脚本文件来执行一些简单或者复杂的数学运算,比如加减乘除,开方,对数,三角函数等. ...

  7. python数字计算器_Python作为计算器使用(一)——数字

    [摘要]Python作为一种面向对象的动态类型语言,其实用性多种多样,python作为计算器使用就是其中的一种,在很多编程系统中,作为计算器使用都是基础,那么在其中,数字的使用就显得尤为重要,那么今天 ...

  8. python日期计算器 青少年编程电子学会python编程等级考试二级真题解析2021年12月

    目录 python日期计算器 一.题目要求 1.编程实现 2.输入输出 3.评分标准

  9. python编程计算器_python编写计算器功能

    本文实现用python编写一个带界面的计算器小程序,当然这个计算器功能很简单,只能进行一些简单的数学运算,很适合初学者,希望能给大家带来一些启发 实验前提 因为是带图形界面的,所以用的版本是在wind ...

  10. python数字计算器,Python 简单计算器实现

    Python 简单计算器实现 以下代码用于实现简单计算器实现,包括两个数基本的加减乘除运输: # Filename : test.py # author by : www.w3cschool.cn # ...

最新文章

  1. Hololens2-Unity3D开发(一)
  2. android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧
  3. SideFX Houdini FX中文版
  4. html中亮度怎么写,html – 使用CSS更改背景的亮度
  5. java 微信证书文件_JAVA微信企业付款如何使用证书、证书调用实例
  6. WP7 WMAppManifest.xml各个属性作用
  7. c语言二维数组初始化_6.2 C语言二维数组
  8. Android Material Design之Toolbar与Palette
  9. django的admin界面删除因为外键约束导致失败
  10. linux 安装python-opencv
  11. 精益或六西格玛已经不易了,为啥还需要“精益六西格玛”?
  12. 刚刚,三位科学家获得2019年诺贝尔物理学奖!
  13. 工作流实战_02_flowable 流程模板导入
  14. java 图片服务器 上传_Java实现把图片上传到图片服务器(nginx+vsftp)
  15. HDU-1753-大明A+B
  16. 耶鲁大学公开课:哲学-死亡
  17. 四个数学软件主要特点
  18. Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)
  19. linux硬链接与软链接的联系与区别
  20. hexo建站之yilia主题diy

热门文章

  1. 嵌入式linux tftp服务的配置
  2. iOS中 最新微信支付/最全的微信支付教程详解 韩俊强的博客
  3. JAVA--虚函数,抽象函数,抽象类,接口
  4. 【一天一个shell命令】好管家-磁盘-du
  5. firefox 复制文本js代码。判断窗口是关闭还是刷新
  6. sql server 修改IDENTITY 字段 的统计当前值
  7. Back 键与Home键
  8. linux下安装nvm进行node的版本的快速切换
  9. JS引擎线程的执行过程的三个阶段
  10. pandas之loc iloc ix