formula 返回list_python正则实现计算器功能

本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*-

# Author :Gogh

# @Time :2017/12/4 20:16

# @Email :361910002@qq.com

import re

def operator_update(formula):

# 对formula公式进行 去除空字符,更新运算符处理

formula = formula.replace(" ", "") # 去除空字符

formula = formula.replace("+-", "-")

formula = formula.replace("--", "+")

return formula

def calc_muldiv(formula_list):

'''''

计算公式里面的乘除

:param formula: 列表

:return:

'''

for index, element in enumerate(formula_list):

if "*" in element or "/" in element:

operators = re.findall("[*/]", element)

calc_list = re.split("[*/]", element)

num = None

for i, e in enumerate(calc_list):

if num:

if operators[i - 1] == "*":

num *= float(e)

elif operators[i - 1] == "/":

num /= float(e)

else:

num = float(e)

formula_list[index] = num

return formula_list

def calc_plumin(operators, num_list):

'''''

计算列表数字的加减

:param operators: 运算符列表

:param num_list: 进行运算的数字列表

:return: 返回计算结果

'''

num = None

for i, e in enumerate(num_list):

if num:

if operators[i - 1] == "+":

num += float(e)

elif operators[i - 1] == "-":

num -= float(e)

else:

num = float(e)

return num

def merge(plus_minus_operator, multiply_divide_list):

'''''

把列表中这样的形式'2*' '-3*' '5/3*' '4/2'合并到一块

:param formula_list:

:return:

'''

for index, element in enumerate(multiply_divide_list):

if element.endswith("*") or element.endswith("/"):

multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index + 1]

del multiply_divide_list[index + 1]

del plus_minus_operator[index]

return merge(plus_minus_operator, multiply_divide_list)

return plus_minus_operator, multiply_divide_list

def bracket_calc(formula):

'''''

对括号最内层的formula公式进行计算

:param formula:

:return:

'''

formula = re.sub("[()]", "", formula) # 去除两边的()

formula = operator_update(formula)

plus_minus_operator = re.findall("[+-]", formula) # 列表 '+' '-' 运算符

multiply_divide_list = re.split("[+-]", formula) # 列表 有'*' '/'

if multiply_divide_list[0] == "": # multiply_divide_list列表第一个字符为空的话,表示一个数字为负号

multiply_divide_list[1] = "-" + multiply_divide_list[1]

del plus_minus_operator[0]

del multiply_divide_list[0]

res = merge(plus_minus_operator, multiply_divide_list)

plus_minus_operator = res[0] # 列表 '+' '-' 运算符 进行合并处理

multiply_divide_list = res[1]

plus_minus_list = calc_muldiv(multiply_divide_list) # 生成只进行加减运算的列表

res = calc_plumin(plus_minus_operator, plus_minus_list)

return res

def calculate(formula):

'''''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''

while True:

formula_depth = re.search("[()]+", formula)

if formula_depth:

formula_depth = formula_depth.group()

res = bracket_calc(formula_depth)

formula = formula.replace(formula_depth, str(res))

print("\33[34;1m%s\33[0m" % (formula))

else:

res = bracket_calc(formula)

print("\33[31;1m结果:%s\33[0m" % (res))

exit()

if __name__ == '__main__':

formula = "1 - 2 * ( (60-30 +(-9-2- 5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )"

calculate(formula)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook上的一道题,超过50万的评论和1万3500次分享

全世界只有3.14 % 的人关注了数据与算法之美近日,有网友在Facebook发了一道数学题:发布以后,目前已经收到超过50万的评论和1万3500次分享,图中包含四个等式,前面三个已经有答案了,最后一个问题要求你得出相…

闲聊linux中的input设备(转)

转自:http://blog.csdn.net/lmm670/article/details/6080998 用过linux的哥们都知道,linux所有的设备都是以文件的形式实现的,要访问一个设备,我们只需要以open、read、write的形式对设备的进行操作就可以了。在linux系统的/dev目…

Polly的7种策略

概念Polly是一个被.net基金会支持认可的框架,Polly是一个.NET弹性和瞬态故障处理库,允许开发人员以流畅和线程安全的方式表达策略,如重试、断路器、超时、舱壁隔离和回退。Polly的7种策略1、重试(Retry):当程序发生短暂…

从数学入手,3招打破机器学习的边界

全世界只有3.14 % 的人关注了数据与算法之美本文约2007余字,阅读需要约6分钟;系统资料领取见文末;关键词:人工智能,机器学习,深度学习,数学,学习建议01.机器学习工程师的边界是什么&…

mysql not exists 效率高_mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

语句一:select count(*) from A where A.a not in (select a from B)语句二:select count(*) from A left join B on A.a B.a where B.a is null语句三:select count(*) from A where not exists (select a from B where A.a B.a)知道以上三…

POJ 3981(字符串替换)

字符串替换Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 7290 Accepted: 3451Description 编写一个C程序实现将字符串中的所有"you"替换成"we"Input 输入包含多行数据 每行数据是一个字符串,长度不超过1000 数据以EOF结束Output…

.NET Core 基于 Grafana Loki 日志初体验

介绍Loki: like Prometheus, but for logs.Loki是一个轻量级的日志系统,受到Prometheus项目的启发,由Grafana团队设计和开发,所以在Grafana中是原生支持的,具有可水平扩展,高度可用等特性,通过存储压缩的、…

mysql80重置密码_MySQL8.0修改密码问题

MySQL5.7和之前的用户修改密码方式:mysql -uroot -e "Set passwordpassword(‘123’);"mysql -uroot -p123.com -e "use mysql;update user set authentication_stringpassword(456) where userroot;"update mysql.user set authentication_str…

基于开源流程引擎Activiti5的工作流开发平台BPMX3

2019独角兽企业重金招聘Python工程师标准>>> BPMX3平台是宏天软件在ESTBPM2的基础上,追随开源工作流平台Activiti5,由原班开发团队,历时一年,现重新推出一套解决中国政府及企业的业务流程的开发平台。 相对商业的工作流…

通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定...

如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了。我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础。最开始接触dapr的时候,会在其官方首页看到这么一句话“Dapr is a portabl…

三位一体,用游戏打通孩子记忆力、认知和双语启蒙的学前神器

对于孩子学习知识,现在父母多表现有2个极端,一种完全不让小小孩学硬知识,一种又希望孩子从很小开始就学硬知识。小木比较反对在孩子6岁前就给他们生硬地灌输知识,一定得认识多少个字,背多少个单词,但只要做…

mysql在线快速修改密码_MySQL修改密码的几种方式

这篇文章主要介绍了MySQL修改密码的几种方式,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下前言:在日常使用数据库的过程中,难免会遇到需要修改账号密码的情景,比如密码太简单需要修改、密码过期需要修改、忘…

分享一个CSS3的网格系统架构 - ResponsiveAeon

日期:2012-7-30 来源:GBin1.com 在线演示 本地下载 曾经介绍过其它类型的CSS3网格系统,今天我们介绍一款能够帮助你快速创建基于HTML5/CSS3的响应式布局框架 - ResponsiveAeon。 它拥有一个宽度为1104px并且基于12个列的网格框架系统&#…

网络协议,没有想象中那么难

十个人程序员里面,有十个都会说自己学过网络协议,九个人都会说自己懂网络协议。但是面试的时候,问几个问题,能回答的可能只有两三个。不信?来,我问你几道。1、TCP 协议跟 UDP 协议有什么区别?你…

Mysql实现幂等_阿里面试官:接口的幂等性怎么设计?

大家好,我是狂聊。自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。一、什么是幂等?看一下维基百科怎么说的:幂等性:多次调用方法或者接口不会改变业务状态&a…

谷歌搜索揭示人性最黑暗的秘密

全世界只有3.14 % 的人关注了数据与算法之美《卫报》网站发布文章指出,我们能够从我们在网上问的问题获得对自己更多的了解呢。美国数据科学家塞斯斯蒂芬斯-大卫多维茨(Seth Stephens-Davidowitz)通过分析谷歌的匿名搜索数据,揭示…

杂集

为什么80%的码农都做不了架构师?>>> 符号相关快捷键: 千分符号:alt 0137 (小键盘) 回车符号:alt 10(小键盘) 查看目录结构:进入windows concole,执行命令tree 转载于:https://my.o…

接口管理平台YApi

介绍YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的…

saiku 连接 MySQL_Saiku连接mysql数据库(二)

Saiku连接Mysql数据库展示数据参考链接:https://www.cnblogs.com/shirui/p/8573491.html前提:Saiku已安装好,mysql已安装好1.添加Saiku的数据库驱动: mysql-connect-java-5.1.17.jar下载相应的数据库驱动放到 saiku-server\tomcat…

TreeView控件应用--访问文件或文件夹(一)

C#用TreeView访问文件或文件夹,通过递归,展开所有文件夹(类似资源管理器的树形窗体) 首先,算法是用递归算法,不断的递归文件。以此来遍历整个电脑的磁盘内容,过程也很简单。这种算法的时间复杂度…