1 业务需求

1.1 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致。

2 业务逻辑

2.1 首先获取用户输入,处理非法字符,处理空格

2.2 匹配括号,找到括号内部计算公式

2.3 先计算乘除,再计算加减

2.4 最后返回结果与eval()相互比较

3 代码实现

 import re

 def calculator(formula_1):
'''
此函数为主函数
:param formula: 传入的是不规则公式字符串
:return:
'''
print(formula_1)
expression = ''
for s in formula_1: # 去除空格
if s == ' ':
continue
expression = expression + s
while True: # 寻找括号
is_match = re.search('\([^()]+\)', expression)
if is_match:
match_result = is_match.group()
content = match_result[1:-1]
result = judge(formula_2=content) # 调用函数
expression = expression.replace(match_result,result[0])
else: # b如果匹配为空,即没有括号
result = judge(formula_2=expression)
return result[0] def judge(formula_2):
'''
此函数是先调用乘除
:param formula_2: 取出括号的字符串类型
:return: 返回计算乘除后的字符串
'''
num_list = re.split('[*/+-]', formula_2)
operator_list = re.findall('[*/+-]', formula_2)
for k, i in enumerate(num_list):
if len(i) == 0:
num_list[k+1] = operator_list[k] + num_list[k+1] #
del num_list[k]
del operator_list[k]
result = mul_div(formula_3=num_list, yunsuanfu=operator_list)
return result def mul_div(formula_3, yunsuanfu):
'''
此函数计算乘除
:param formula_3: 数字列表
:param yunsuanfu: 符号列表
:return: 计算结果
'''
flag = True
while flag:
for num, mark in enumerate(yunsuanfu):
if mark == "*" or mark == '/':
if mark == "*":
b = float(formula_3[num]) * float(formula_3[num+1])
formula_3[num] = str(b)
del formula_3[num+1]
del yunsuanfu[num]
break
else:
b = float(formula_3[num])/float(formula_3[num+1])
formula_3[num] = str(b)
del formula_3[num+1]
del yunsuanfu[num]
break
else:
flag = False
if len(yunsuanfu) == 0:
return formula_3
else:
result = add_sub(formula_4=formula_3, yunsuanfu_2=yunsuanfu)
return result def add_sub(formula_4, yunsuanfu_2):
'''
此函数计算加减
:param formula_4: 数字列表
:param yunsuanfu_2: 符号列表
:return: 计算结果
'''
flag = True
while flag:
for num, mark in enumerate(yunsuanfu_2):
if mark == '+' or mark == '-':
if mark == '+':
b = float(formula_4[num]) + float(formula_4[num+1])
formula_4[num] = str(b)
del formula_4[num+1]
del yunsuanfu_2[num]
break
else:
b = float(formula_4[num]) - float(formula_4[num + 1])
formula_4[num] = str(b)
del formula_4[num + 1]
del yunsuanfu_2[num]
break
else: # 使用break不执行此表达式
flag = False
return formula_4 string = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) "
result = calculator(string)
print(result)
print('-----------------')
print(eval(string))

4 思路来源

http://www.cnblogs.com/WuYongQi/p/5520592.html

python开发计算器的更多相关文章

  1. Python开发——利用正则表达式实现计算器算法

    Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...

  2. 用Python开发实用程序 – 计算器

    一段时间前,自己制作了一个库 “sui-math”.这其实是math的翻版.做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于 ...

  3. 从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  4. Python开发 第01课 Python 简介

    一.Python 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  5. Python 开发版本指导与资源

    Python 文档:https://docs.python.org/3/ 下载 下载这些文件 文档版本 Python 3.9(开发中) Python 3.8(稳定) Python 3.7(稳定) Py ...

  6. Windows 平台做 Python 开发的最佳组合

    在 Windows 上怎样做 Python 开发?是像大神那样使用纯文本编辑器,还是用更加完善的 IDE?到底是用自带的命令行工具,还是需要装新的 Terminal?本文将带你了解如何利用微软官方维护 ...

  7. 作为一名Python开发,我谈Linux和mac的使用体验

    我是一名Python开发,在2018.7~2021.6使用的是Linux系统 Deepin OS 作为自己的开发系统:在2022.7-至今使用的是 mac OS 系统作为开发系统. Deepin OS ...

  8. python开发环境搭建

    虽然网上有很多python开发环境搭建的文章,不过重复造轮子还是要的,记录一下过程,方便自己以后配置,也方便正在学习中的同事配置他们的环境. 1.准备好安装包 1)上python官网下载python运 ...

  9. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

随机推荐

  1. 菜鸟脱壳之脱壳的基础知识(四)——利用ESP定律来寻找OEP

    .上节说的是单步跟踪法,这节讲的是利用堆栈平衡(ESP定律)来进行脱壳!想必大家都听说过ESP定律这个大名吧!ESP定律运用的就是堆栈平衡原理!一般的加壳软件在执行时,首先要初始化,保存环境(保存各个 ...

  2. python----常用模块(random,string,time&datetime,os,sys,xpinyin(拼音))

    一.模块.包 1.1 什么是模块  在python中,一个.py文件就构成一个模块,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 1.2 什么是包 ...

  3. Vim 安装、配置及复制粘贴操作

    1.安装:sudo apt-get install vim 2.配置:cd ~ #进入用户主目录 touch .vimrc #.后缀文件不可见 vi .vimrc #打开文件 输入: set cind ...

  4. linux下mysql多实例安装

    1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过不同的socket监听不同的 ...

  5. serial front_door signment and gps signment

    import socketimport serialimport osimport sysimport struct#serial ser_intf = serial.Serial(port='/de ...

  6. 过滤器(filter),监听器(listener),与servlet的执行顺序

    创建: 加载顺序 监听器-->过滤器-->Servlet.项目启动后,容器会首先创建声明的各种监听器,为后继的各个事件监听做准备,然后创建过滤器,最后是Servlet.销毁的时候是反序进行 ...

  7. spring对bean的高级装配之profile机制

    最近在读spring实战一书,个人感觉内容通俗易懂,学到了一些之前并不知道的知识,于是打算在博客里记录一下这些知识点便于后期记忆: 今天要记录的就是spring的条件化创建bean,针对条件化创建be ...

  8. Spring 源码学习(4)—— bean的加载part 1

    前面随笔中,结束了对配置文件的解析工作,以及将配置文件转换成对应的BeanDefinition存储在容器中.接下来就该进行bean的加载了. public Object getBean(String ...

  9. 运维grep语法

    grep的语法和用法 grep命令的格式: grep   [options]   PATTERN  [FILE] 其中:1,pattern是用正则表达式书写的模式.2,FILE是要查找的文件,可以是用 ...

  10. SLEUTH 城市扩张模型

    3.19号准备试着运行一下SLEUTH模型,但是好不容易没报错出了一个test的结果,我就再也没看过了,导致现在我竟然差不多忘记当时怎么搞出来的了... 这也提醒我了,,,以后解决一个什么东西一定要立 ...