教学项目之-通过Python实现简单的计算器
教学项目之-通过Python实现简单的计算器
计算器开发需求
- 实现加减乘除及拓号优先级解析
- 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
import reimport functoolsdef minus_operator_handler(formula): '''处理一些特殊的减号运算''' minus_operators = re.split("-",formula) calc_list= re.findall("[0-9]",formula) if minus_operators[0] == '': #第一值肯定是负号 calc_list[0] = '-%s' % calc_list[0] res = functools.reduce(lambda x,y:float(x) - float(y), calc_list) print("\033[33;1m减号[%s]处理结果:\033[0m" % formula, res ) return resdef remove_duplicates(formula): formula = formula.replace("++","+") formula = formula.replace("+-","-") formula = formula.replace("-+","-") formula = formula.replace("--","+") formula = formula.replace("- -","+") return formuladef compute_mutiply_and_dividend(formula): '''算乘除,传进来的是字符串噢''' operators = re.findall("[*/]", formula ) calc_list = re.split("[*/]", formula ) res = None for index,i in enumerate(calc_list): if res: if operators[index-1] == "*": res *= float(i) elif operators[index-1] == "/": res /= float(i) else: res = float(i) print("\033[31;1m[%s]运算结果=\033[0m" %formula, res ) return resdef handle_minus_in_list(operator_list,calc_list): '''有的时候把算术符和值分开后,会出现这种情况 ['-', '-', '-'] [' ', '14969037.996825399 ', ' ', '12.0/ 10.0 '] 这需要把第2个列表中的空格都变成负号并与其后面的值拼起来,恶心死了 ''' for index,i in enumerate(calc_list): if i == '': #它其实是代表负号,改成负号 calc_list[index+1] = i + calc_list[index+1].strip()def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend): '''有时会出现这种情况 , ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254'],2*...后面这段实际是 2*-14969036.7968254,需要特别处理下,太恶心了''' for index,i in enumerate(multiply_and_dividend): i = i.strip() if i.endswith("*") or i.endswith("/"): multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1] del multiply_and_dividend[index+1] del plus_and_minus_operators[index] return plus_and_minus_operators,multiply_and_dividenddef compute(formula): '''这里计算是的不带括号的公式''' formula = formula.strip("()") #去除外面包的拓号 formula = remove_duplicates(formula) #去除外重复的+-号 plus_and_minus_operators = re.findall("[+-]", formula) multiply_and_dividend = re.split("[+-]", formula) #取出乘除公式 if len(multiply_and_dividend[0].strip()) == 0:#代表这肯定是个减号 multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1] del multiply_and_dividend[0] del plus_and_minus_operators[0] plus_and_minus_operators,multiply_and_dividend=handle_special_occactions(plus_and_minus_operators,multiply_and_dividend) for index,i in enumerate(multiply_and_dividend): if re.search("[*/]" ,i): sub_res = compute_mutiply_and_dividend(i) multiply_and_dividend[index] = sub_res #开始运算+,- print(multiply_and_dividend, plus_and_minus_operators) total_res = None for index,item in enumerate(multiply_and_dividend): if total_res: #代表不是第一次循环 if plus_and_minus_operators[index-1] == '+': total_res += float(item) elif plus_and_minus_operators[index-1] == '-': total_res -= float(item) else: total_res = float(item) print("\033[32;1m[%s]运算结果:\033[0m" %formula,total_res) return total_resdef calc(formula): '''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减''' parenthesise_flag = True calc_res = None #初始化运算结果为None,还没开始运算呢,当然为None啦 while parenthesise_flag: m = re.search("\([^()]*\)", formula) #找到最里层的拓号 if m: #print("先算拓号里的值:",m.group()) sub_res = compute(m.group()) formula = formula.replace(m.group(),str(sub_res)) else: print('\033[41;1m----没拓号了...---\033[0m') print('\n\n\033[42;1m最终结果:\033[0m',compute(formula)) parenthesise_flag = False #代表公式里的拓号已经都被剥除啦if __name__ == '__main__': #res = calc("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )") res = calc("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) )") |
教学项目之-通过Python实现简单的计算器的更多相关文章
- python实现简单的计算器功能
如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...
- 用python实现简单的计算器(加减乘除小括号等)
需求:实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ...
- 在大型项目上,Python 是个烂语言吗
Robert Love, Google Software Engineer and Manager on Web Search. Upvoted by Kah Seng Tay, I was the ...
- Python实现简单的四则运算
GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...
- python 的排名,已经python的简单介绍
我在今天看了一篇文章,是简书的全网程序猿写的,Java已经退出神坛,python稳居第一. python是由龟叔写的,它在英文的意思是蟒蛇. 根据编程语言流行指数排行榜2019年2月的榜单 据了解,目 ...
- python scrapy简单爬虫记录(实现简单爬取知乎)
之前写了个scrapy的学习记录,只是简单的介绍了下scrapy的一些内容,并没有实际的例子,现在开始记录例子 使用的环境是python2.7, scrapy1.2.0 首先创建项目 在要建立项目的目 ...
- python创建简单网站
前言 本方法基于web2py框架,使用web2py的完整网站数据包创建简单网站. web2py 是一个为Python语言提供的全功能Web应用框架,旨在敏捷快速的开发Web应用,具有快速.安全以及可移 ...
- Python爬虫简单实现CSDN博客文章标题列表
Python爬虫简单实现CSDN博客文章标题列表 操作步骤: 分析接口,怎么获取数据? 模拟接口,尝试提取数据 封装接口函数,实现函数调用. 1.分析接口 打开Chrome浏览器,开启开发者工具(F1 ...
- Python 实现简单的 Web
简单的学了下Python, 然后用Python实现简单的Web. 因为正在学习计算机网络,所以通过编程来加强自己对于Http协议和Web服务器的理解,也理解下如何实现Web服务请求.响应.错误处理以及 ...
随机推荐
- PHP常用函数和常量
PHP常用系统常量 __FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名.自 PHP 4.0.2 起,总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在 ...
- 一次性安装src.rpm编译所依赖的软件包
yum-builddep SRPMS/fcitx-4.2.8.4-4.1.cgdl21.src.rpm NAME yum-builddep - install missing depend ...
- unix-环境高级编程-读书笔记与习题解答-第三篇
第一章 第五节 进程与控制 该小节比较粗略的阐述了unix操作系统中用于进程控制的三个函数,分别为 : fork , exec, waitpid, 其中 exec 有五种变体, 这些变体实现的功能全部 ...
- iOS 多线程详解
iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其 ...
- 阿里云的esc
云服务器ecs作用如下:1.完全管理权限:对云服务器的操作系统有完全控制权,用户可以通过连接管理终端自助解决系统问题,进行各项操作:2.快照备份与恢复:对云服务器的磁盘数据生成快照,用户可使用快照回滚 ...
- Jcrop 做图片剪裁 在IE中无法显示问题解决办法
我遇到的Jcrop做剪裁无法显示的问题 是在IE8下发生的(在 firfox he chrome 中是显示正常的) 解决办法 是在一个图片加载完成后在 初始化 Jcrop:1.预加载图片的方法 var ...
- 这个知识点不错,,学习一下先。。。无状态服务(stateless service)(转)
这样的应用,显得高级一些哟~~:) +================== http://kyfxbl.iteye.com/blog/1831869 ========================= ...
- Struts2 文件上传,下载,删除
本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用Fi ...
- Linux&shell 之Linux文件权限
写在前面:案例.常用.归类.解释说明.(By Jim) Linux文件权限用户useradd test (添加用户test)userdel test (删除用户test)passwd test(修改用 ...
- 「Poetize9」礼物运送
3055: 礼物运送 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 18 Solved: 12[Submit][Status] Description ...
