python_计算器
import re
from functools import reduce
# 定义一个只计算两个数的乘法或除法的函数:
def multiply_division(exp):
if "*" in exp:
# first=exp.split("*")[0]
# second=exp.split("*")[1]
first,second=exp.split("*")
return float(first)*float(second)
if "/" in exp:
first,second=exp.split("/")
return float(first) / float(second)
# 定义一个只计算两个数的加法或减法的函数:
def add_sub(exp):
if "-" in exp:
# first=exp.split("*")[0]
# second=exp.split("*")[1]
first,second=exp.split("-")
return float(first)-float(second)
if "/" in exp:
first,second=exp.split("+")
return float(first) + float(second)
# 对于加减法要处理正负号 while循环处理所有的正负号
def exp_fmt(exp):
while re.search('[+-]{2,}',exp): # 循环终止条件是re.search(pattern)为空
exp = exp.replace('--','+')
exp = exp.replace('+-','-')
exp = exp.replace('-+','-')
exp = exp.replace('++','+')
return exp
# ret=multiply_division("-1/4")
# print(ret)
# ret=add_sub("1-4")
# print(ret)
def multiply_division_replace(exp):
# exp=exp_fmt(exp)
while True:
ret = re.search('\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?', exp)
# ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', exp)
if ret:
res=multiply_division(ret.group(0))
exp=exp.replace(ret.group(0),str(res))
else:
break
return exp
# def add_sub_replace(exp):
# while True:
# exp = exp_fmt(exp)
# ret = re.search('\d+(\.\d+)?[+-]\d+(\.\d+)?', exp)
# print(ret.group(0))
# if ret:
# res=add_sub(ret.group(0))
# exp=exp.replace(ret.group(0),str(res))
# else:
# break
# return exp
#
# exp="1—5+2+3" --> -4+2+3 负号没法处理 最终报错
# exp=add_sub_replace(exp)
# print(exp)
def remove_addsub(exp):
print(exp)
ret = re.findall('[-+]?\d+(?:\.\d+)?',exp) # (?:\.\d+)
# (?:\.\d+)? 表示一个匹配不用保存的分组,要不然,findall返回的将是括号内的值的列表。
print(ret)
res = reduce(lambda a,b:float(a)+float(b),ret) # 聚合求ret列表内的所有元素的和
return res
# count = 0
# for i in ret:
# count += float(i)
# print(count)
exp="1--3*+5/-5+2+3"
# exp="1—5+2+3" --> -4+2+3 负号没法处理
exp=multiply_division_replace(exp)
# exp=add_sub_replace(exp)
print(exp)
老师答案
import re
from functools import reduce
def mul_div(exp): # 计算两个数的乘法或者除法
if '*' in exp:
a, b = exp.split('*')
return float(a)*float(b)
if '/' in exp:
a, b = exp.split('/')
return float(a) / float(b)
def exp_fmt(exp):
while re.search('[+-]{2,}',exp):
exp = exp.replace('--','+')
exp = exp.replace('+-','-')
exp = exp.replace('-+','-')
exp = exp.replace('++','+')
return exp
def remove_addsub(exp):
ret = re.findall('[-+]?\d+(?:\.\d+)?',exp)
res = reduce(lambda a,b:float(a)+float(b),ret)
return res
def remove_muldiv(exp): # 计算表达式中的所有的乘除法
while True:
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp)
if ret:
son_exp = ret.group() # 3*4 12*5
res = mul_div(son_exp)
exp = exp.replace(son_exp,str(res))
else:return exp
def cal(exp):
res = remove_muldiv(exp) # 计算乘除
res = exp_fmt(res) # 符号整理
ret = remove_addsub(res) # 计算加减
return ret
def main(exp):
exp = exp.replace(' ','')
while True:
ret = re.search('\([^()]+\)', exp)
if ret:
res = cal(ret.group())
exp = exp.replace(ret.group(), str(res))
else: return cal(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 = main(exp)
print(ret)
python_计算器的更多相关文章
- 1.C#WinForm基础制作简单计算器
利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...
- 自己动手写计算器v1.1
这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与 ...
- 自己动手写计算器v1.0
今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...
- 【IOS开发笔记03-视图相关】简单计算器的实现
UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...
- [LeetCode] Basic Calculator 基本计算器
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- JS-自制提速小工具:开发页面时需要按比例计算宽高值的快速计算器
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
1.前言 前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...
- 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现
前面的话 本文用面向对象的技术来实现一个简单的图形面积计算器 图形类 //rect.class.php <?php abstract class Shape{ public $name; abs ...
- tn文本分析语言(四) 实现自然语言计算器
tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. github地址:https://github.com/ferventdes ...
随机推荐
- 多测师讲解自动化测试 _RF分配id_高级讲师肖sir
1.Assign Id To Element.
- 添加Google网络地图功能
在MeteoInfo中添加了Google网络地图功能.打开MeteoInfo软件,选中图层管理区的一个Map Frame(New Map Frame),点击鼠标右键,在弹出菜单中点击Add Web L ...
- 【转载】opencvVS2019配置方法
环境: 系统:win10系统截至2020920版本 opencv版本:3.0.0版本 IDE:宇宙最强IDEA最新版本2019社区版 教程: 1.下载opencv安装包官网下载链接:https://o ...
- 数据查询语句:DQL(Data Query Language)
一.基础查询 1.语法:select 查询列表 from 表名; 2.特点:1.通过select查询完的结果,是一个虚拟的表格,不是真实存在 2.查询列表可以是:字段.表达式.常量.函数等 3 ...
- 运行bee run之后出现的错误以及解决方法Failed to build the application:
运行bee run之后出现的错误以及解决方法 创建一个beego项目 bee new myapp 在该项目执行下面的代码 bee run 出现的问题 2020/04/22 21:12:07 INF ...
- appium_android-常见的问题
po模型的原则: 用公共方法代表UI所提供的功能 方法应该返回其他的PageObject或者返回用于断言的数据 同样的行为不同的结果可以建模为不同的方法 不要在方法内加断言 字段意义 不要暴露页面内部 ...
- Elasticsearch(5):添加文档
1 ES数据读写流程¶ ES中,每个索引都将被划分为若干分片,每个分片可以有多个副本.这些副本共同组成复制组,复制组中的分片在添加或删除文档时必须保持同步,否则,从一个副本中读取的数据将与从另一个 ...
- zookeeper核心之ZAB协议就这么简单!
背景 我们都知道 Zookeeper 是基于 ZAB 协议实现的,在介绍 ZAB 协议之前,先回顾一下 Zookeeper 的起源与发展. Zookeeper 究竟是在什么样的时代背景下被提出?为了解 ...
- IDEA出现Error Loading Project: Cannot load module xxx报错
IDEA出现Error Loading Project: Cannot load module xxx报错,是因为IDEA不能找到模块xxx加载,应该是添加/新建了xxx模块,之后又删除了该模块,但没 ...
- abstract关键字的说法
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必 ...