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 ...
随机推荐
- ubuntu19.10 系统需要安装的软件
将ubuntu18 升级到ubuntu19 期间好几次卡在启动界面,比较担心要不要重装系统,有幸后来正常了.明显感觉操作快了不少.下半年稳定版就出来,到时候免不了再折腾一番,提前把安全记录做好. 下面 ...
- Oracle报错>记录被另外一个用户锁定
原因 当一个用户对数据进行修改时,若没有进行提交或者回滚,Oracle不允许其他用户修改该条数据,在这种情况下修改,就会出现:"记录被另外一个用户锁定"错误. 解决 查询用户.数据 ...
- SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源码
页面展现 后台任务处理:恢复任务 15s执行一次后台打印消息 不BB了,直接上代码 import... /** * 调度工厂类 * Created by jinyu on 2018/4/14/014. ...
- Python数据类型--列表(list)
Python中列表对应的表示形式是"[]".列表中的元素可以是任何数据类型. 本文以List=[i for i in range(20)]为例进行论述:等价于List=[0, 1, ...
- 从Linux源码看Socket(TCP)的bind
从Linux源码看Socket(TCP)的bind 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看下Server ...
- day64 Pyhton 框架Django 07
day67 内容回顾 视图 1. CBV 定义 from django.views import View class Addpub(View): def get(self,request): sel ...
- go ioutial 读取写入文件
package main import ( "fmt" "io/ioutil" "os" ) func main() { // 读取文件 / ...
- goland 注册
注意:本教程已过期 请使用其他人教程激活最新版 https://www.789zhao.com/blog/JC08EIFBS9TM.html https://shimo.im/docs/dKYC ...
- linux 压缩 tar命令
linux中tar命令用法 总结 *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 tar –xzf 解压 *.bz2 ...
- composer慢 设置阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer