Python计算器实操
要求:
开发一个简单的python计算器
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式
后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计
算器所得出的结果一致。
import re
def chengchu(num):
'''乘除操作'''
while re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num): #当有*/运算时循环
ret = re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num).group() #获取包含*/运算的算式
if re.search("-?\d+\.?\d*\*-?\d+\.?\d*",ret): #是乘的时候
n1,n2 = re.split("\*",ret) #以*分割两边的数字
ji = float(n1)*float(n2) #得到数字进行运算
if re.search("-\d+\.?\d*\*-\d+\.?\d*",num): #特殊情况,两负相乘的正,得加上+
num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*",("+"+str(ji)),num,1) #替换刚算的公式
return chengchu(num) #继续递归
else:
num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*", str(ji), num, 1) #一般正常情况下替换
return chengchu(num) #继续递归
else: #是/的时候
n1,n2 = re.split("\/",ret) #以/分割两边的数字
shang = float(n1)/float(n2) #得到数字进行运算
num = re.sub("-?\d+\.?\d*\/-?\d+\.?\d*",str(shang),num,1) #一般正常情况下替换
return chengchu(num) #继续递归
else: #没有*/的时候
return num #返回算的结果
def jiajian(num):
'''加减操作'''
while re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num): #当有+-运算时循环
ret = re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num).group() #获取包含+-*运算的算式
if re.search("-?\d+\.?\d*\+-?\d+\.?\d*",ret): #是+的时候
n1,n2 = re.split("\+",ret) #以+分割两边的数字
he = float(n1)+float(n2) #得到数字进行运算
num = re.sub("-?\d+\.?\d*\+-?\d+\.?\d*",str(he),num,1) #替换刚算的公式
return jiajian(num) #继续递归
else:
n1, n2 = re.split("-", ret,1) # 以-分割两边的数字
if n1 == "": #n1分割为空时,说明-号在开头
n1,n2 = re.split("-",n2) #重新分割上面n2的结果
cha = -float(n1)-float(n2) #得到数字进行运算,注意前面得加上-号
else : #不是-开头的时候
cha = float(n1) - float(n2) # 得到数字进行运算
num = re.sub("-?\d+\.?\d*--?\d+\.?\d*",str(cha),num,1) #替换刚算的公式
return jiajian(num) #继续递归
else: #没有+-的时候
return num #返回算的结果
def form(res,sums1):
'''格式输出'''
res = re.sub("\(|\)", "", res) #去掉括号
ret = re.sub("\([^()]+\)",res,sums1,1) #把括号里的公式替换成结果
ret = re.sub("\+\+|--", "+", ret) #统一运算符,++为+,--为+
ret = re.sub("\+-|-\+", "-", ret) #统一运算符,+-为-,-+为-
return ret #返回结果
def sear(num):
'''运算规则'''
if re.search("\([^()]+\)",num): #有括号先算
ret = re.search("\([^()]+\)", num).group() #获取括号里的公式
res = jiajian(chengchu(ret)) #在括号里先算乘除,后算加减
return sear(form(res, num)) #将格式化后的结果传给函数sear递归
else: #没有括号的时候
res = jiajian(chengchu(num)) #也是先算乘除,后算加减
return res #返回结果
while True: #用户交互模式
sums = input("请输入您要计算的内容q(quit):") #输入内容
if sums.lower() == "q": #输入q时,退出
break
ret = sear(re.sub(" ","",sums)) #防止公式里有空格,替换空格后,调用函数
print("最终结果:",ret) #打印最终返回的运算结果
-------------------输出结果--------------------
最终结果: 2776672.6952380957
Python计算器实操的更多相关文章
- Python关于类的实操
实操一:总结 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性? 2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性? 3.什么是解除绑定的函数,如何定义,如何调用,给 ...
- 动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?
当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的 AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛 SDK 简单的实现人 ...
- Python相关分析—一个金融场景的案例实操
哲学告诉我们:世界是一个普遍联系的有机整体,现象之间客观上存在着某种有机联系,一种现象的发展变化,必然受与之关联的其他现象发展变化的制约与影响,在统计学中,这种依存关系可以分为相关关系和回归函数关系两 ...
- 如何练习python?有这五个游戏,实操经验就已经够了
现在学习python的人越来越多了,但仅仅只是学习理论怎么够呢,如何练习python?已经是python初学者比较要学会的技巧了! 其实,最好的实操练习,就是玩游戏. 也许你不会信,但这五个小游戏足够 ...
- Python实操二
实操一: 1.用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao'] name=['alex','wupeiqi' ...
- 决策树算法的Python实现—基于金融场景实操
决策树是最经常使用的数据挖掘算法,本次分享jacky带你深入浅出,走进决策树的世界 基本概念 决策树(Decision Tree) 它通过对训练样本的学习,并建立分类规则,然后依据分类规则,对新样本数 ...
- 72 个网络应用安全实操要点,全方位保护 Web 应用的安全
原文地址:Web Application Security Checklist 原文作者:Teo Selenius(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Selenium之unittest测试框架详谈及实操
申明:本文是基于python3.x及selenium3.x. unittest,也可以称为PyUnit,可以用来创建全面的测试套件,可以用于单元自动化测试(模块).功能自动化测试(UI)等等. 官方文 ...
随机推荐
- scrapy(网络爬虫)———CrawlSpider(规则爬虫)
CrawlSpider(规则爬虫) 一 .简介:它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进 ...
- 将sublime添加到鼠标右键
1.win+R 输入regedit ,打开注册表. 2.找到HKEY_CLASSES_ROOT/*/shell目录,在此目录下 ①新建项,命名为“sublime Text”(也可以是其他名字),双击右 ...
- LOJ #2026「JLOI / SHOI2016」成绩比较
很好的锻炼推柿子能力的题目 LOJ #2026 题意 有$n$个人$ m$门学科,第$ i$门的分数为不大于$U_i$的一个正整数 定义A「打爆」B当且仅当A的每门学科的分数都不低于B的该门学科的分数 ...
- LOJ#2127「HAOI2015」按位或
用$ Min-Max$容斥之后要推的东西少了好多 无耻的用实数快读抢了BZOJ.Luogu.LOJ三个$ OJ$的Rank 1 即将update:被STO TXC OTZ超了QAQ 题意:集合$ [0 ...
- python 08
函数 函数定义: 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于 ...
- Flask网页模板的入门
#网页模板需要导入render_template from flask import Flask,render_template 方法一: #使用render_template模块来渲染模板文件 ...
- 对象转换为json格式,类似中间层API
<一头扎进SpringMvc视频教程\<一头扎进SpringMvc>第四讲 源码\> 对象自动转换为json格式要在 spring-mvc.xml添加一个东西 ,和对应的命名空 ...
- pwnable.kr fb
fb-1 pt 连接到服务器,发现 有三个文件,fd脚本,fd.c脚本的源程序,flag是要看的东西,无权限 来我们分析一下源码 如果只传进去一个值,print” pass argv[1] a num ...
- MySql cmd下的学习笔记 —— 有关修饰器的知识(trigger)
关于触发器的理解: 进行数据库应用软件的开发时,有时我们碰到表的某些数据的改变时,希望同时 引起其他相关数据改变的需求,利用触发器就能满足这样的需求. 触发器能在表中的某些特定数据变化时自动完成某些查 ...
- 在Apache Struts中利用OGNL注入
前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...