import re
remove_parentheses = re.compile('\([^()]+\)') def Remove_Parentheses(obj, s): # 找到内层的括号并且返回单个括号
while obj.search(s):
ret = obj.search(s).group()
if ('*'in ret) or ('/' in ret): # 判断括号里是否有乘法 除法
ret1 = ride_div(ret)      # 有则调用 ride_div() 函数
s = s.replace(ret, ret1)    # 把乘法后的返回值进行重新赋值, 在乘法的函数里 还调用了加减法的函数, 详情看往下看.
else:
ret2 = add_sub(ret)      # 若没有 乘除法 则直接调用 加减法的函数 add_sub()
s = s.replace(ret, ret2)    #把加减法后的返回值 重新赋值.
return s def ride_div(s): # 求乘除法的值
while re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', s): #用 search判断 若不是None则继续进行
minus(s)                          # 此函数是为了把 -- -+ +- ++ 替换成 单个的
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', s).group()
a, d ,b = re.split('([/*])', ret)
if d == '*':
sum = float(a) * float(b)
s = s.replace(ret, str(sum))      # 把得到的积 重新赋值
elif d == '/':
sum = float(a) / float(b)
s = s.replace(ret, str(sum)) # 把得到的商 重新赋值
else:
ret_new = add_sub(s) # 此处是为了当while 条件为None时 调用加减法, 把值相加或相减
return ret_new.strip('(').strip(')') # 最后得到一个数字 进行返回 def add_sub(s): # 求加减的值
while re.search('-?\d+(\.\d+)?[+-]-?\d+(\.\d+)?', s):
s = minus(s)
ret = re.search('(?P<a>-?\d+(\.\d+)?)(?P<d>[+-])(?P<b>-?\d+(\.\d+)?)', s) # 此处,因为用切割的话 会有bug, 所以选择了用 分组的命名
a = ret.group('a')
d = ret.group('d')
b = ret.group('b')
if d == '+':
sum = float(a) + float(b)
elif d == '-':
sum = float(a) - float(b)
s = s.replace(ret.group(0), str(sum))
s = s.strip('(').strip(')')
return s def minus(s): #更改 不和谐的 符号
while ('--' in s) or ('-+' in s) or ('+-' in s) or ('++' in s) :
s = s.replace('--','+')
s = s.replace('-+','-')
s = s.replace('+-','-')
s = s.replace('++','+')
return s def main(): # 主函数
while 1:
s = input('请输入你要计算的式子,输入回车退出程序:').strip().replace(' ', '')
if not s:
break
if "(" in s:
ret1 = Remove_Parentheses(remove_parentheses, s)
ret2 = ride_div(ret1)
ret3 = add_sub(ret2)
print(ret3)
else:
ret2 = ride_div(s)
ret3 = add_sub(ret2)
print(ret3) main()

计算器-- 利用re模块 利用函数封装 第二版的更多相关文章

  1. 瞎j8封装第二版之数据层的封装

    看了以前写的代码,对就是下面这个 手把手封装数据层之DataUtil数据库操作的封装 觉得以前写的代码好烂啊!!!,重新理了一下思路,写得更规范和简练,应该效率也会高很多,用了一下下午写的连接池(半废 ...

  2. 在SQL SERVER中实现RSA加解密函数(第二版)

    /*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.5 注: 转载请保留此信息 更 ...

  3. 瞎j8封装第二版之用xml文件来代理dao接口

    也是重新整理了之前的那篇 模仿Mybatis用map per.xml实现Dao层接口的功能 话不多说直接上代码 首先是结构 依赖pom.xml <?xml version="1.0&q ...

  4. 瞎j8封装第二版之数据库连接池

    写得很蛋疼,本来想支持多线程的,奈何对多线程和连接池理解着实太菜: 所以,起码是能拿到连接了... 但是还是不太懂这个连接池 我也是半抄别人的,以后再搞一搞这个吧. 先是配置文件 理想是很丰满的,奈何 ...

  5. 利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版)

    利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JS ...

  6. nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证

    http模块内部封装了http服务器和客户端,因此Node.js不需要借助Apache.IIS.Nginx.Tomcat等传统HTTP服务器,就可以构建http服务器,亦可以用来做一些爬虫.下面简单介 ...

  7. python:利用pymssql模块操作SQL server数据库

    python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以.这篇博客,介绍下如何在Windows下安装pymssql库并进行连接使用... 环境:Windows ...

  8. python:利用configparser模块读写配置文件

    在自动化测试过程中,为了提高脚本的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可. 这篇博客,介绍下python中利用configpars ...

  9. 利用Jquery的load函数实现页面的动态加载

    利用Jquery的load函数实现页面的动态加载  js的强大功能相信大家都知晓,今天通过jquery的库函数load可以更加方便的实现页面的动态刷新,经过几天的研究与探索,终于有所成效!吾心甚蔚! ...

随机推荐

  1. caffe for python (官方翻译)

    导言 本教程中,我们将会利用Caffe官方提供的深度模型——CaffeNet(该模型是基于Krizhevsky等人的模型的)来演示图像识别与分类.我们将分别用CPU和GPU来进行演示,并对比其性能.然 ...

  2. linux下python3源码安装及卸载

    Linux下Python3的源码编译安装和卸载方法 [日期:2019-06-21] 来源:博客园  作者:wuli潇萧 [字体:大 中 小]     (一)Linux下软件的源码编译安装和卸载方法 L ...

  3. [Bug]Python3.x AttributeError: libtest.so: undefined symbol: fact

    写kNN,需要在python中实现kd-tree 思考了一下,在python下写这种算法类的东西,还是十分别扭 于是希望用ctypes调用一下c++动态加载库 于是尝试实现一下 // test.cpp ...

  4. NOIP 2012 疫情控制(二分+贪心+倍增)

    题解 二分时间 然后一个显然的事是一个军队向上爬的越高它控制的点越多 所以首先军队尽量往上爬. 当一个军队可以爬到根节点我们记录下它的剩余时间T和它到达根结点时经过的根节点的子节点son. 当一个军队 ...

  5. Kubernetes本地私有仓库配置

    实验环境 master 10.6.191.181 node1 10.6.191.182 node2 10.6.191.183 本地私有仓库 10.6.191.184 一.安装本地私有仓库 1.安装do ...

  6. 题解 CF1037D 【Valid BFS?】

    不管怎么说,这都不是道紫题吧... 这里采用的思想有点类似轻重链剖分. 我们按照每个节点在序列里面出现的顺序,把每一个节点连出去的边都排一个序. 这样(如果序列没错)肯定会按照序列的方式遍历完全图. ...

  7. 基于Java的开源CMS系统选择

    CMS概述 对于网站CMS系统而言,基于PHP的是主流,如Drupal/Joomla在各个主流虚拟机提供商上都是标准配置,也被广泛使用. 但如果你拥有Java团队,或者项目目标是想建立一个企业网使用的 ...

  8. codevs——T2806 红与黑

    http://codevs.cn/problem/2806/  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 白银 Silver 题解       题目描述 Descriptio ...

  9. ArcGIS api for javascript——显示多个查询结果

    描述 本例展示了在重叠的多边形处理查询的一种方式.单击一个石油和天然气的字段来查看地图上的高亮显示.如果仅仅点击一个要素,能够在单击一次来查看包含一些属性的InfoWindow.如果偶然单击到重叠的要 ...

  10. KNN分类器

    KNN学习(K-Nearest Neighbor algorithm,K最邻近方法 )是一种统计分类器,对数据的特征变量的筛选尤其有效. 基本原理 KNN的基本思想是:输入没有标签(标注数据的类别), ...