计算器-- 利用re模块 利用函数封装 第二版
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模块 利用函数封装 第二版的更多相关文章
- 瞎j8封装第二版之数据层的封装
看了以前写的代码,对就是下面这个 手把手封装数据层之DataUtil数据库操作的封装 觉得以前写的代码好烂啊!!!,重新理了一下思路,写得更规范和简练,应该效率也会高很多,用了一下下午写的连接池(半废 ...
- 在SQL SERVER中实现RSA加解密函数(第二版)
/*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.5 注: 转载请保留此信息 更 ...
- 瞎j8封装第二版之用xml文件来代理dao接口
也是重新整理了之前的那篇 模仿Mybatis用map per.xml实现Dao层接口的功能 话不多说直接上代码 首先是结构 依赖pom.xml <?xml version="1.0&q ...
- 瞎j8封装第二版之数据库连接池
写得很蛋疼,本来想支持多线程的,奈何对多线程和连接池理解着实太菜: 所以,起码是能拿到连接了... 但是还是不太懂这个连接池 我也是半抄别人的,以后再搞一搞这个吧. 先是配置文件 理想是很丰满的,奈何 ...
- 利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版)
利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JS ...
- nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证
http模块内部封装了http服务器和客户端,因此Node.js不需要借助Apache.IIS.Nginx.Tomcat等传统HTTP服务器,就可以构建http服务器,亦可以用来做一些爬虫.下面简单介 ...
- python:利用pymssql模块操作SQL server数据库
python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以.这篇博客,介绍下如何在Windows下安装pymssql库并进行连接使用... 环境:Windows ...
- python:利用configparser模块读写配置文件
在自动化测试过程中,为了提高脚本的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可. 这篇博客,介绍下python中利用configpars ...
- 利用Jquery的load函数实现页面的动态加载
利用Jquery的load函数实现页面的动态加载 js的强大功能相信大家都知晓,今天通过jquery的库函数load可以更加方便的实现页面的动态刷新,经过几天的研究与探索,终于有所成效!吾心甚蔚! ...
随机推荐
- Android项目实战(四十四):浅谈Postman (网络请求调试插件)
前言: Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 在项目开发中,可以依赖此工具模拟API测试. 使用详解: 各种情况Api的模拟请求的Postman使用方 ...
- [ SQLServer ] 數字類型的欄位細節 - 轉載
[MSSQL] 欄位開立(2) - decimal, numeric, float, real, money 的抉擇 https://dotblogs.com.tw/henryli/2015/06/1 ...
- PostgreSQL Replication之第四章 设置异步复制(5)
4.5 使流复制更健壮 当连接到master时,slave要做的第一件事情是赶上master.但是,这会一直工作吗?我们已经看到,我们可以使用由基于流和基于文件组成的混合设置.这给了我们一些额外的安全 ...
- js实现图片上传后即时预览
//关于FileReader对象 http://blog.csdn.net/zk437092645/article/details/8745647 <!DOCTYPE html> < ...
- php时间戳转化成时间相差8小时问题
php时间戳 转化成时间的时候 $mytime=time(); echo $mytime.'<br />'; echo date('Y-m-d H:i:s',$mytime); 会产生8个 ...
- 运营商 WLAN
运营商 WLAN 运营商 WLAN 是 Android 9 中引入的一项功能,该功能可让设备自动连接到运营商实现的 WLAN 网络.在高度拥塞或信号覆盖范围较小的区域(如体育场或地铁站),运营商 WL ...
- Linux VNC Viewer客户端
1.realvnc-vnc-viewer 这个我感觉应该是做的做好用的VNC Viewer客户端了,毕竟是商业软件,但是VNC Viewer客户端是免费的.使用前 需要到官网下载对应发行版的软件包进行 ...
- CF85E Guard Towers(二分答案+二分图)
题意 已知 N 座塔的坐标,N≤5000 把它们分成两组,使得同组内的两座塔的曼哈顿距离最大值最小 在此前提下求出有多少种分组方案 mod 109+7 题解 二分答案 mid 曼哈顿距离 >mi ...
- etTimeout来实现setInterval
etTimeout来实现setInterval <script type="text/javascript"> function interval(func, w, t ...
- ArcGIS api for javascript——图形-增加图形到地图
描述 本例展示了如何使用Draw工具栏在地图上描绘许多种类的几何体.ArcGIS JavaScript API包含工具栏. 工具栏不是一个在页面上自动地可见的用户界面组件.相反,工具栏是一个助手类,可 ...