python写的计算器程序
模拟加减乘除,用正则和递归实现,效率有点低,主要目的是练习正则。
执行效果如下:
1 2 3 4 5 6 7 8 9 | 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 * ( ( 60 - 30 + ( - 40 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2 ) ) #原始计算公式 1 - 2 * (( 60 - 30 + - 8.0 * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2 )) #提取(-40/5)进行计算,去除了所有的空白字符 1 - 2 * (( 60 - 30 + - 8.0 * 173545.88095238098 ) - ( - 4 * 3 ) / ( 16 - 3 * 2 )) #提取(9-2*5/3+7/3*99/4*2998+10*568/14)进行计算 1 - 2 * ( - 1388337.0476190478 - ( - 4 * 3 ) / ( 16 - 3 * 2 )) #提取(60-30+-8.0*173545.88095238098)进行计算 1 - 2 * ( - 1388337.0476190478 - - 12.0 / ( 16 - 3 * 2 )) #提取(-4*3)进行处理 1 - 2 * ( - 1388337.0476190478 - - 12.0 / 10.0 ) #提取(16-3*2)进行处理 1 - 2 * - 1388335.8476190479 #提取(-1388337.0476190478--12.0/10.0)进行处理 2776672.6952380957 #最终结果,与计算器结果执行一致 |
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 # @Time : 2017/11/6 15:37 4 # @Author : lichuan 5 # @File : calcu.py 6 7 8 import re 9 import time 10 # s='3 * 10+9/3+2 * 6' 11 # re.compile('[-+]') 12 13 #做乘法除法 14 def mul(strings): 15 ''' 16 乘法加法 17 :param s: 18 :return: 19 ''' 20 # print('this is add_del function') 21 pattern=re.compile('\d+\.?\d*[\*\/]+[-+]?\d+\.?\d*') 22 match=pattern.search(strings) 23 if not match: 24 return strings 25 s=match.group() 26 if '*' in s: 27 value1=s.split('*')[0] 28 value2=s.split('*')[1] 29 value=float(value1)*float(value2) 30 elif '/' in s: 31 value1 = s.split('/')[0] 32 value2 = s.split('/')[1] 33 value = float(value1) / float(value2) 34 new_s=pattern.sub(str(value),strings,count=1) 35 # print(new_s) 36 return mul(new_s) 37 38 #做加法减法 39 def add_del(strings): 40 # print('this is add_del function') 41 strings=clear(strings) 42 pattern = re.compile('[-]?\d+\.?\d*\s*[-+]+\s*\d+\.?\d*') 43 match = pattern.search(strings) 44 if not match: 45 return strings 46 s=match.group() 47 if '+' in s: 48 value1 = s.split('+')[0] 49 value2 = s.split('+')[1] 50 value = float(value1) + float(value2) 51 new_s = pattern.sub(str(value), strings, count=1) 52 return add_del(new_s) 53 elif '-' in s : 54 if re.match('^-',s): 55 value1 = s.split('-')[1] 56 value2 = s.split('-')[2] 57 value = -float(value1) - float(value2) 58 else: 59 value1 = s.split('-')[0] 60 value2 = s.split('-')[1] 61 value = float(value1) - float(value2) 62 new_s = pattern.sub(str(value), strings, count=1) 63 # print(new_s) 64 return add_del(new_s) 65 66 #提取括号内容进行操作 67 def brackets(strings): 68 # print('this is brackets function') 69 print(strings) 70 strings = re.sub('\s', '', strings) 71 # strings=clear(strings) 72 pattern = re.compile('\([-]?\d+\.?\d*\s*([-+*/]*\s*\d+\.?\d*\s*){1,}\)') 73 match = pattern.search(strings) 74 if not match: 75 s=mul(strings) 76 r=add_del(s) 77 return r 78 else: 79 s=match.group() 80 new_s=s.replace('(','') 81 new_s=new_s.replace(')','') 82 m_s=mul(new_s) 83 a_s=add_del(m_s) 84 # print(a_s) 85 # print(strings) 86 r=pattern.sub(a_s,strings,count=1) 87 return brackets(r) 88 89 #合并--、-+、+-、++等重复的运算符 90 def clear(strings): 91 # print('this is clear function') 92 s=strings 93 pattern_1 = re.compile('[-+]+[-+]+') 94 m = pattern_1.search(strings) 95 if not m: 96 return strings 97 else: 98 strings=re.sub('--','+',s) 99 strings=re.sub('-+','-',strings) 100 strings=re.sub('\+\+','+',strings) 101 strings=re.sub('\+\-','-',strings) 102 return clear(strings) 103 104 105 if __name__ == '__main__': 106 start=time.time() 107 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998+10 * 568/14 )) - (-4*3)/ (16-3*2) )' 108 print(s) 109 b=brackets(s) 110 print(b) 111 end=time.time()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!