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. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  2. 自己动手写计算器v1.1

    这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与 ...

  3. 自己动手写计算器v1.0

    今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...

  4. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  5. [LeetCode] Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  6. JS-自制提速小工具:开发页面时需要按比例计算宽高值的快速计算器

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...

  7. 由ArcMap属性字段自增引出字段计算器使用Python的技巧

    1.前言       前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...

  8. 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现

    前面的话 本文用面向对象的技术来实现一个简单的图形面积计算器 图形类 //rect.class.php <?php abstract class Shape{ public $name; abs ...

  9. tn文本分析语言(四) 实现自然语言计算器

    tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. github地址:https://github.com/ferventdes ...

随机推荐

  1. vue超出8个字符,显示省略号

    显示的数据

  2. 如何win7安装tomcat

    首先安装jdk,查看当前jdk版本. >java -version 显示的是1.8.0_131 为此我们安装的tomcat版本是apache-tomcat-9.0.38-windows-x64. ...

  3. IDEA项目路径初探

    IDEA项目路径 普通Java项目 普通Java项目,标准目录结构src下的路径就是classpath类路径,每次编译都会将src目录下新增的类和资源文件打包进类路径. 如下图,类文件和配置文件都会被 ...

  4. 智能指针(1)-std::unique_ptr

    std::unique_ptr std::unique_ptr是一种几乎和原始指针一样高效的智能指针,对所管理的指针资源拥有独占权.由C++11标准引入,用于替代C++98中过时的std::auto_ ...

  5. Python错误:AssertionError: group argument must be None for now

    运行多线程出现的错误 调试了很久,最后发先 __init__ 写错了,修改后后,运行正确.

  6. C语言必踩神坑,世上本没有坑,摔的人多了,也就有了坑!

    这是一个伤心的故事,有多少小伙伴在写C语言代码时遇到过的情景! 提问:C语言中,未初始化的局部变量到底是多少? 答案往往是: 与编译器有关: 可能但不保证初始化为0: 未确定. 总之,全部都是些一本正 ...

  7. 【学习笔记】Min-max 容斥

    经常和概率期望题相结合. 对于全序集合 \(S\),有: \[\max S=\sum\limits_{T\subseteq S,T\not=\varnothing}(-1)^{\vert T\vert ...

  8. 【数论】HAOI2012 容易题

    题目大意 洛谷链接 有一个数列A已知对于所有的\(A[i]\)都是\(1~n\)的自然数,并且知道对于一些\(A[i]\)不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的 ...

  9. Vagrant系列(一)----win10搭建Vagrant+VirtualBox环境_

      一.Vagrant是什么?     vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.    通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的 ...

  10. javascript arcgis 取区域中心点

    javascript arcgis 取区域中心点 //graphic是绘制完多边形之后返回的对象 //获得多边形的中心点坐标 var centerPoint=graphic.geometry.getE ...