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作为一种轻量级编程语言,语言简洁开发快,没那么多技巧,受到众多追 ...
随机推荐
- BaseAdapter教程(1) 最简单地使用BaseAdapter
Adapter就是适配器,而设计模式里也有Adapter Pattern. 而BaseAdapter就是设计模式里的思维,把一些不相关的东西放进去,经过适配器,最终都会出产同一样的东西. 就像Base ...
- linux 上安装 keepalive
1.keepalive 单机安装 1.1 安装环境 yum -y install kernel-devel* openssl-* popt-devel lrzsz openssh-clients li ...
- python学习笔记(15)pymysql数据库操作
pymysql数据库操作 1.什么是PyMySQL 为了使python连接上数据库,你需要一个驱动,这个驱动是用于与数据库交互的库. PyMySQL : 这是一个使Python连接到MySQL的库,它 ...
- log4j2.xml 配置
动态生成日志, 日志路径: log4j2.xml 配置如下: <?xml version="1.0" encoding="UTF-8"?> < ...
- numpy模块介绍
import numpy as np np.array([1,2,3]) array([1, 2, 3]) np.array([[1,2,3],[4,5,6]]) array([[1, 2, 3], ...
- [LC] 434. Number of Segments in a String
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
- MOOC(12) - 安装连接数据库的第三方库
1.连接数据库需要mysql-python驱动,可以官网下载离线安装包 安装 检查是否导入成功
- 吴裕雄 python 神经网络——TensorFlow 卷积神经网络手写数字图片识别
import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_N ...
- 吴裕雄--天生自然 HADOOP大数据分布式处理:安装配置JAVA
tar -xzvf jdk-8u151-linux-x64.tar.gz -C /usr/local/src sudo vim /etc/profile .编辑/etc/profile # JAVA ...
- HttpClient系统日志配置
详细介绍在:http://hc.apache.org/httpclient-3.x/logging.html 一般使用context logging基本够用,context logging解释原文如下 ...