python自己做计算器
题目:
exp = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
如题自己写计算器,算出以上str中的结果,注意不能用eval函数,哈哈。
大致思路:定义3个函数,
函数1:计算+-*/,最终正则匹配的记过,都要使用此函数计算。
函数2:计算类似1-2+3*4/5,正则先匹配*/,在匹配+-,然后调用函数1算,得出来结果replace掉正则匹配,然后掉函数2递归,
函数3:搞最后的大的exp,先正则匹配出括号内的,去调函数2计算,计算的结果在replace,然后调用函数3递归。 使用到的方法:递归、正则
实现代码如下:最终计算的结果和eval结果比较一致,说明没问题
import re
def jianfa(exp):
'''此函数:用于减法计算'''
if exp.count("-")>2:
exp=exp.replace("--","+")
a,b=exp.split("+")
a,b=float(a),float(b)
return a+b
elif exp.count("-")>1:
if "--" in exp:
exp=exp.replace("--","+")
a,b=exp.split("+")
a,b=float(a),float(b)
return a+b
else:
exp=exp.strip("-")
a,b=exp.split("-")
a,b=float(a),float(b)
return 0-(a+b)
else:
exp=exp.strip("-")
a,b=exp.split("-")
a,b=float(a),float(b)
return a-b def jisuanqi(exp):
'''此函数:用于加减乘除计算'''
if "*" in exp:
a,b=exp.split("*")
a,b=float(a),float(b)
return a*b
elif "/" in exp:
a,b=exp.split("/")
a,b=float(a),float(b)
return a/b
elif "+" in exp:
a,b=exp.split("+")
a,b=float(a),float(b)
return a+b
elif "-" in exp:
return jianfa(exp)
def compute_replace(exp,ret):
'''此函数:用于调用jisuanqi,然后得出的记过然后替换正则匹配的结果'''
new_ret = jisuanqi(ret)
new_ret = str(new_ret)
new_exp = exp.replace(ret, new_ret)
return new_exp
def fmt(exp):
'''此函数:用于去除以下特殊的符号,避免正则匹配出错'''
while "++" in exp or "--" in exp or "+-" in exp or "-+" in exp:
exp= exp.replace("++","+")
exp= exp.replace("--","+")
exp= exp.replace("+-","-")
exp= exp.replace("-+","-")
return exp
def func_compute(exp):
'''此函数:用于计算如1+2*/5这样的连续算法,先匹配*/在匹配+-,然后调用jisuanqi计算,并递归'''
exp=fmt(exp)
if "*" in exp or "/" in exp:
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp).group()
new_exp=compute_replace(exp,ret)
t_n_exp = func_compute(new_exp) #计算出的结果,再去递归调用本函数
return t_n_exp
elif "+" in exp or "-" in exp:
if exp.startswith("-") and exp.count("-") ==1 and exp.count("+")==0: #考虑如果最后结果为负数,走这个判断
return exp
ret = re.search('-?\d+(\.\d+)?[+-]\d+(\.\d+)?',exp).group()
new_exp = compute_replace(exp, ret)
t_n_exp = func_compute(new_exp) #计算出的结果,再去递归调用本函数
return t_n_exp
else:
return exp
def match(exp):
'''此函数:正则匹先配出括号内的公式,然后去调用上面函数计算,并递归'''
exp=exp.replace(" ","")
if "(" in exp:
match_exp=re.search("\([^()]+\)",exp).group()
n_match_exp=match_exp.strip("(")
n_match_exp = n_match_exp.strip(")")
ret=func_compute(n_match_exp)
new_exp=exp.replace(match_exp,ret)
c_new_exp=match(new_exp)
return c_new_exp
else:
return func_compute(exp)
exp = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
ret=match(exp)
print(ret)
python自己做计算器的更多相关文章
- Python来做应用题及思路
Python来做应用题及思路 最近找工作头疼没事就开始琢磨python解应用题应该可以,顺便还可以整理下思路当然下面的解法只是个人理解,也欢迎大佬们给意见或者指点更好的解决办法等于优化代码了嘛,也欢迎 ...
- 可以用 Python 编程语言做哪些神奇好玩的事情?
作者:造数科技链接:https://www.zhihu.com/question/21395276/answer/219747752 使用Python绘图 我们先来看看,能画出哪样的图 更强大的是,每 ...
- Python能做些什么?
前言 网上搜集到的一些python能做什么的资料,利用python能做很多事情,我们可以在多门课程中都使用Python作为我们的教学语言.比如,计算机网络.数据结构.人工智能.图像处理.软件分析与测试 ...
- Python 能做什么?
Python 能做什么? Python具有简单.易学.免费.开源.可移植.可扩展.可嵌入.面向对象等优点,我所关注的是网络爬虫方面,2018即将到来,我准备步入python的世界. Hello,wor ...
- 学了Python可以做什么工作
学了Python可以做什么工作 用 Python 写爬虫 据我所知很多初学 Python 的人都是使用它编写爬虫程序.小到抓取一个小黄图网站,大到一个互联网公司的商业应用.通过 Python 入门爬虫 ...
- 你都用python来做什么?
首页发现话题 提问 你都用 Python 来做什么? 关注问题写回答 编程语言 Python 编程 Python 入门 Python 开发 你都用 Python 来做什么? 发现很 ...
- python + unittest 做单元测试之学习笔记
单元测试在保证开发效率.可维护性和软件质量等方面有很重要的地位,所谓的单元测试,就是对一个类,一个模块或者一个函数进行正确性检测的一种测试方式. 这里主要是就应用 python + unitest 做 ...
- 一篇文章告你python能做什么,该不该学?好不好学?适不适合学?
一.python好学吗?简单吗?容易学吗?没有编程的领取能学吗? 最近有很多小伙伴都在问我这些问题.在这里,我想说,python非常简单易学. 1,简单, Python 非常易于读写,开发者可以把更多 ...
- Python能做什么,自学Python效果怎么样?
短时间掌握一门技能是现代社会的需求.生活节奏越来越快,现在不是大鱼吃小鱼,而是快鱼吃慢鱼的时代,人的时间比机器的时间更值钱.Python作为一种轻量级编程语言,语言简洁开发快,没那么多技巧,受到众多追 ...
随机推荐
- linux操作提示:“Can't open file for writing”或“operation not permitted”的解决办法
在linux上使用vi命令修改一个文件内容的时候,发现无法保存,每次写完使用":q!"命令可以正常退出但是使用":wq!"命令保存文件并退出时出现一下信息提示: ...
- 编译原理_P1001
1 绝大部分软件使用高级程序设计语言来编写.用这些语言编写的软件必须经过编译器的编译,才能转换为可以在计算机上运行的机器代码.编译器所生成代码的正确性和质量会直接影响成千上万的软件.虽然大部分人不会参 ...
- Log4J基础
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度: ...
- [APIO2009-C]抢掠计划
题:https://www.cometoj.com/problem/0461 分析:求边双,最后求多汇点最长路 #include<iostream> #include<cstring ...
- sql 新增随机数
update RemoteDetection set humidity=round((rand()*3+29),0),TEMPERATURE=round((rand()*3+16),0),atmosp ...
- 把Java代码转成c#可用的dll
1.首先你需要到 IKVM官网 下载IKVM.http://sourceforge.net/projects/ikvm/files/,需要注意的是如果你用的是.net framework2.0,那么最 ...
- EX_KMP算法总结
EX_KMP算法总结 By viv 2014-8-9 0:30 吐槽1:字符串神马的我最讨厌了,但不学不行啊.TAT 吐槽2:写这东西差点错过CF(codeforces). 今天学了ex_kmp,故总 ...
- [LC] 541. Reverse String II
Given a string and an integer k, you need to reverse the first k characters for every 2k characters ...
- python语法基础-函数-迭代器和生成器-长期维护
############### 迭代器 ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...
- put out|smashed|As soon as|provided
CONJ-SUBORD 如果:假如:只要If you say that something will happen provided or provided that something else h ...