python开发计算器
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开发计算器的更多相关文章
- Python开发——利用正则表达式实现计算器算法
Python开发--利用正则表达式实现计算器算法 (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运 ...
- 用Python开发实用程序 – 计算器
一段时间前,自己制作了一个库 “sui-math”.这其实是math的翻版.做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于 ...
- 从零开始学习PYTHON3讲义(二)把Python当做计算器
<从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...
- Python开发 第01课 Python 简介
一.Python 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...
- Python 开发版本指导与资源
Python 文档:https://docs.python.org/3/ 下载 下载这些文件 文档版本 Python 3.9(开发中) Python 3.8(稳定) Python 3.7(稳定) Py ...
- Windows 平台做 Python 开发的最佳组合
在 Windows 上怎样做 Python 开发?是像大神那样使用纯文本编辑器,还是用更加完善的 IDE?到底是用自带的命令行工具,还是需要装新的 Terminal?本文将带你了解如何利用微软官方维护 ...
- 作为一名Python开发,我谈Linux和mac的使用体验
我是一名Python开发,在2018.7~2021.6使用的是Linux系统 Deepin OS 作为自己的开发系统:在2022.7-至今使用的是 mac OS 系统作为开发系统. Deepin OS ...
- python开发环境搭建
虽然网上有很多python开发环境搭建的文章,不过重复造轮子还是要的,记录一下过程,方便自己以后配置,也方便正在学习中的同事配置他们的环境. 1.准备好安装包 1)上python官网下载python运 ...
- 【Machine Learning】Python开发工具:Anaconda+Sublime
Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...
随机推荐
- zzw原_环境变量导致date命令显示处理一例
1.显示时间看不懂 [root@localhost ~]# date201790:02:06 CST 2.注释掉环境变量bash_profile的两行配置 [root@localhost ~]# vi ...
- ceph crush的问题
ceph crush的问题看一遍忘一遍,现将<ceph源码分析>一书中相关章节摘抄如下: 4.2.1 层级化的Cluster Map例4-1 Cluster Map定义层级化的Cluste ...
- AngelToken:区块链技术的突破
科技进步,直接捅破了政治.金融.军事领域所有的玩法,让工业革命以来形成的规则变得一钱不值. 而且,当下的最重要的技术趋势——区块链.Token.AngelToken,正在引导我们走向全面的失控和未知. ...
- DevExpress.Mvvm.Free
DevExpress MVVM Framework is a set of components helping to work in the Model-View-ViewModel pattern ...
- 数据库编程加入transaction
TransManager tm = new TransManager(); tm.begin();//开启事物 try { //sql执行代码 // // tm.commit();//更改完sql之后 ...
- 三、fgetc与fputc
fgetc 功能:从流中读取一个字符 原型:int fgetc(FILE *stream); 参数: stream:要读取的流指针 返回:读取到的字符,如果读完则返回EOF,EOF是end of fi ...
- My First Linux Module
My First Linux Module Today, I successfully build my first linux hello module. First of all add a di ...
- thinkphp获取后台所有控制器和action
<?phpnamespace Admin\Controller;use Think\Controller;class AuthorController extends PublicControl ...
- Linux下常用工具
GUI篇 计算器gnome-calculator pdf阅读envince 虚拟机virtualbox vnc tigervnc-server and client 网络连接network-manag ...
- Android开发中Activity状态的保存与恢复
当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...