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. python 利用selectors实现异步I/O

    它的功能与linux的epoll,还是select模块,poll等类似:实现高效的I/O multiplexing,  常用于非阻塞的socket的编程中: 简单介绍一下这个模块,更多内容查看 pyt ...

  2. 使用blas做矩阵乘法

      #define min(x,y) (((x) < (y)) ? (x) : (y)) #include <stdio.h> #include <stdlib.h> # ...

  3. logging模块使用

    日志介绍 日志级别: 默认显示级别为warning,(critical>error>warning>info>debug>notset) 日志格式配置,测试使用 impo ...

  4. C++解析九-数据抽象

    数据抽象 数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节.数据抽象是一种依赖于接口和实现分离的编程(设计)技术.让我们举一个现实生活中的真实例子,比如一台电 ...

  5. day063 form 和modelform组件

    注册功能: (写一个简单的注册功能,要求用户名长度不得小于6位.) 普通方式写注册功能  views视图下: def register(request): error_msg=' ' if reque ...

  6. HTML5:表格相关标记及其属性

    表格相关标记及其属性 <table>:表格,包括以下属性 属性 说明 width 宽度(有像素和百分比两种表示方法) height 高度(有像素和百分比两种表示方法) border 边框粗 ...

  7. 剑指Offer 4. 重建二叉树 (二叉树)

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  8. acrgis导出成tiff图片,全是黑色

    任务:将北京道路矢量数据转成栅格然后导出成tiff格式图片. 1. 北京道路有很多种,矢量合并---用到了merge工具 arcgis位置:data management----general---- ...

  9. 【Java】字符串工具类

    import android.annotation.SuppressLint; import java.io.UnsupportedEncodingException; import java.uti ...

  10. latex之插入向量、图片、编号

    1.向量 $\vec a$\qquad $\overleftarrow{AB}$\qquad $\overleftrightarrow{AB}$\qquad $\overrightarrow{AB}$ ...