1. #s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
  2. #第一步 分步实现 ("2-1*-22+3-10/-5")
  3. # 1. 实现一个乘除法 两两相乘/相除
  4. # 2. 实现一个加减法 两两相加/相减
  5. # 3. 把计算结果 替换原来的表达式
  6. # 4. 替换完成后 处理整体表达式的符号
  7. # 5. 五个函数: 计算atom_cal() format() mul_div() add_sub() cal()
  8. #第二步 去括号 计算括号内的
  9.  
  10. import re
  11.  
  12. def format(exp):
  13. exp = exp.replace("-+","-")
  14. exp = exp.replace("+-","-")
  15. exp = exp.replace("--","+")
  16. exp = exp.replace("++","+")
  17. return exp
  18.  
  19. def atom_cal(exp):
  20. if "*" in exp:
  21. a,b = exp.split("*")
  22. return str(float(a) * float(b))
  23.  
  24. elif "/" in exp:
  25. a, b = exp.split("/")
  26. return str(float(a) / float(b))
  27.  
  28. def mul_div(exp):
  29. while True:
  30. ret = re.search("\d+(\.\d+)?[*/]-?\d+(\.\d+)?",exp) #拿到乘除表达式 #从左到右拿结果,拿不到返回None
  31. if ret:
  32. atom_exp = ret.group()
  33. res = atom_cal(atom_exp)
  34. # print(atom_exp,res)
  35. exp = exp.replace(atom_exp,res)
  36. else:
  37. return exp
  38.  
  39. def add_sub(exp):
  40. ret = re.findall("[+-]?\d+(?:\.\d+)?", exp) # 取出数字和数字前面的符号 findall返回的是一个列表 查找所有项
  41. exp_sum = 0
  42. for i in ret:
  43. exp_sum = exp_sum + float(i) # 取出来的是字符串
  44. return exp_sum
  45.  
  46. def cal(exp):
  47. exp = mul_div(exp)
  48. exp = format(exp)
  49. exp_sum = add_sub(exp)
  50. return exp_sum
  51.  
  52. def main(exp):
  53. exp = exp.replace(" ","")
  54. while True:
  55. ret = re.search("\([^()]+\)",exp)
  56. if ret:
  57. inner_bracket = ret.group()
  58. res = str(cal(inner_bracket))
  59. exp = exp.replace(inner_bracket,res)
  60. exp = format(exp)
  61. else:break
  62. return cal(exp)
  63. s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
  64. ret = main(s)
  65. print(ret)

python 实现一个计算器功能的更多相关文章

  1. 如何用Python写一个计算器软件 附带效果图

    该计算器使用Python  tkinter模块开发 效果如下图 import tkinter #导入tkinter模块 root = tkinter.Tk() root.minsize(280,500 ...

  2. Python+Tkinter 实现计算器功能

    #=================================================================================== import tkinter ...

  3. 用python编写一个计算器

    # 1 - 2 * ((60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2)))# 通过Pyt ...

  4. C# 一个计算器功能实现引发的思考

    一.需求 计算器功能需求,这个众所周知,很明确了. 二.步骤分析 1)初级实现计算器 static int Calculator(int a,int b,string str) { switch(st ...

  5. python造一个计算器

    正则表达式之简易计算器 关注公众号"轻松学编程"了解更多. 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:12((1+2)/(2+3)+1)*5.1- ...

  6. Python定做一个计算器,小而美哒~

    使用qt designer ,按装anaconda后,在如下路径找到: conda3.05\Library\bin designer.exe文件,双击启动: ​ 创建窗体,命名为XiaoDing,整个 ...

  7. 用python实现一个计算器

    import re def atom_cal(exp): # 计算乘除法 if '*' in exp: a,b = exp.split('*') return str(float(a) * float ...

  8. 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

    #!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...

  9. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

随机推荐

  1. Angular常用指令

    安装Node 先去Node官网下载并安装Node.js Install the Angular CLI(安装Angular CLI) npm install -g @angular/cli Creat ...

  2. WPF编游戏系列 之六 动画效果(1)

    原文:WPF编游戏系列 之六 动画效果(1)        本篇主要针对界面进行动画效果处理.首先在打开或关闭界面时,使其产生动态效果而不是生硬的显示或消失(如下图).其次在鼠标放到关闭窗口图标上时, ...

  3. Win8Metro(C#)数字图像处理--2.25二值图像距离变换

    原文:Win8Metro(C#)数字图像处理--2.25二值图像距离变换  [函数名称] 二值图像距离变换函数DistanceTransformProcess(WriteableBitmap sr ...

  4. C#数字图像处理时注意图像的未用区域

    原文:C#数字图像处理时注意图像的未用区域 图1. 被锁定图像像素数组基本布局         如图1所示,数组的宽度并不一定等于图像像素数组的宽度,还有一部分未用区域.这是为了提高效率,系统要确定每 ...

  5. GzipStream的简单使用压缩和解压

    压缩和解压都需要用到三个流实例,分别是文件读取流.文件写入流.压缩流. 读取流和写入流有多种形式,压缩流就一种GzipStream. 不同的是对于压缩,是需要用文件写入流作为创建压缩流实例的参数, 压 ...

  6. c# HttpWebRequest https的一些处理

    先看下请求方法 public string Get_Request( string strUrl, CookieContainer _cookie = null, string strHost = & ...

  7. 用 jQuery.getJSON() 跨域请求 JSON 数据

    $.getJSON()可以理解为特殊形式的$.ajax(),手册里的说明好复杂,这里只记录一下用到的跨域请求. 先说在同一域名下,js发送数据到php,php返回JSON数据: $.getJSON(' ...

  8. Spectre小计

    今天安装了vs2017,而后又安装了wdk,随便写了一个控制台测试程序,居然报错.网上也查了一圈,也没有得到解决.报错内容如下: MSB8038:已启用Spectre缓解,但找不到Spectre缓解库 ...

  9. Linux软件安装及基本概念

    apt 基本用法 apt-get [options] install/remove/source 软件包1 [软件包2...] 注意:软件包不要带后缀.deb 常用命令及解释如下: apt下载软件是根 ...

  10. 深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...