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 代码实现
1 import re 2 3 4 def calculator(formula_1): 5 ''' 6 此函数为主函数 7 :param formula: 传入的是不规则公式字符串 8 :return: 9 ''' 10 print(formula_1) 11 expression = '' 12 for s in formula_1: # 去除空格 13 if s == ' ': 14 continue 15 expression = expression + s 16 while True: # 寻找括号 17 is_match = re.search('\([^()]+\)', expression) 18 if is_match: 19 match_result = is_match.group() 20 content = match_result[1:-1] 21 result = judge(formula_2=content) # 调用函数 22 expression = expression.replace(match_result,result[0]) 23 else: # b如果匹配为空,即没有括号 24 result = judge(formula_2=expression) 25 return result[0] 26 27 28 def judge(formula_2): 29 ''' 30 此函数是先调用乘除 31 :param formula_2: 取出括号的字符串类型 32 :return: 返回计算乘除后的字符串 33 ''' 34 num_list = re.split('[*/+-]', formula_2) 35 operator_list = re.findall('[*/+-]', formula_2) 36 for k, i in enumerate(num_list): 37 if len(i) == 0: 38 num_list[k+1] = operator_list[k] + num_list[k+1] # 39 del num_list[k] 40 del operator_list[k] 41 result = mul_div(formula_3=num_list, yunsuanfu=operator_list) 42 return result 43 44 45 def mul_div(formula_3, yunsuanfu): 46 ''' 47 此函数计算乘除 48 :param formula_3: 数字列表 49 :param yunsuanfu: 符号列表 50 :return: 计算结果 51 ''' 52 flag = True 53 while flag: 54 for num, mark in enumerate(yunsuanfu): 55 if mark == "*" or mark == '/': 56 if mark == "*": 57 b = float(formula_3[num]) * float(formula_3[num+1]) 58 formula_3[num] = str(b) 59 del formula_3[num+1] 60 del yunsuanfu[num] 61 break 62 else: 63 b = float(formula_3[num])/float(formula_3[num+1]) 64 formula_3[num] = str(b) 65 del formula_3[num+1] 66 del yunsuanfu[num] 67 break 68 else: 69 flag = False 70 if len(yunsuanfu) == 0: 71 return formula_3 72 else: 73 result = add_sub(formula_4=formula_3, yunsuanfu_2=yunsuanfu) 74 return result 75 76 77 def add_sub(formula_4, yunsuanfu_2): 78 ''' 79 此函数计算加减 80 :param formula_4: 数字列表 81 :param yunsuanfu_2: 符号列表 82 :return: 计算结果 83 ''' 84 flag = True 85 while flag: 86 for num, mark in enumerate(yunsuanfu_2): 87 if mark == '+' or mark == '-': 88 if mark == '+': 89 b = float(formula_4[num]) + float(formula_4[num+1]) 90 formula_4[num] = str(b) 91 del formula_4[num+1] 92 del yunsuanfu_2[num] 93 break 94 else: 95 b = float(formula_4[num]) - float(formula_4[num + 1]) 96 formula_4[num] = str(b) 97 del formula_4[num + 1] 98 del yunsuanfu_2[num] 99 break 100 else: # 使用break不执行此表达式 101 flag = False 102 return formula_4 103 104 string = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) " 105 result = calculator(string) 106 print(result) 107 print('-----------------') 108 print(eval(string))
4 思路来源
http://www.cnblogs.com/WuYongQi/p/5520592.html