Python实现简单的计算器 教学项目之-通过Python实现简单的计算器

废话写在前面:

本人小白初学Python,个人觉得自学编程有些知识点或是语法看的时候很明白,然鹅过了几天不用就会忘,所以打算做点儿小项目来加深印象以便把知识点记牢。

如果只是无脑的照着别人的代码敲,慢慢你会发现其实并没有什么卵用,你只是把代码敲上去了但是却不懂别人为什么要这么写。

自己如果一点儿都不动脑思考那是不行的,当一个具体的需求拿出来让你去实现的时候,你就会发现一点儿思路也没有。

自学最好是自己找个小需求来实现一下,在实现的过程中就会遇到很多问题,这个时候首先找出问题出现在哪里,然后一步一步调试解决问题,最后最后一定要记录整理。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

简单计算器开发需求:

实现简单的加减乘除运算,以及带括号的优先级解析,并能输出正确的计算结果。

参考Alex大哥的:教学项目之-通过Python实现简单的计算器

分析:

1.首先需要检测用户的输入是否合法,如括号匹配问题

2.由于输入的是字符串,所以需要进行字符串解析,解析出" + - * / ( ) "等符号

3.优先级解析,先计算括号里的内容,在计算乘除运算,最后算加减

  1 #! -*- coding utf-8 -*-
  2 #! @Time   :$[DATE] $[TIME]
  3 #! @Author :gg
  4 
  5 import re
  6 
  7 def comupute_mut_and_div(formula):
  8     '''算乘除'''
  9     operators = re.findall("[*/]", formula)
 10     calc_list = re.split("[*/]", formula)
 11     res = None    # 细节赋值,第一遍for循环轮空
 12     for index, i in enumerate(calc_list):
 13         if res:    # 第一次这里不执行,所以列表索引不会超出范围
 14             if operators[index-1] == "*":
 15                 res *= float(i)
 16             elif operators[index-1] == "/":
 17                 res /= float(i)
 18         else:
 19             res = float(i)
 20     print("\033[31;1m[%s]运算结果=\033[0m" % formula, res)
 21     return res
 22 
 23 def handle_special_sign(plus_and_sub_operators, mul_and_div):
 24     """
 25     有时会遇到这种情况:1-2*-2/1
 26     plus_and_sub_operators:['-', '-']
 27     mul_and_div:['1', '2*', '2/1']
 28     :param plus_and_sub_operators:
 29     :param mul_and_div:
 30     :return:
 31     """
 32     for index, i in enumerate(mul_and_div):
 33         i = i.strip()
 34         if i.endswith("*") or i.endswith("/"):
 35             mul_and_div[index] = mul_and_div[index] + plus_and_sub_operators[index] + mul_and_div[index+1]
 36             del mul_and_div[index+1]
 37             del plus_and_sub_operators[index]
 38     return plus_and_sub_operators, mul_and_div
 39 
 40 def handle_minus_inlist(operators_list, calc_list):
 41     """
 42     处理加减带负号的运算,1--4 = 1-(-4) = 1+4
 43     operators_list: ['-']
 44     calc_list: ['1', '', '4.0']
 45     :param operators_list:
 46     :param calc_list:
 47     :return:
 48     """
 49     for index, i in enumerate(calc_list):
 50         if i == '':
 51             calc_list[index+1] = "-" + calc_list[index+1]
 52             del calc_list[index]
 53     return operators_list, calc_list
 54 
 55 def compute(formula):
 56     '''
 57     解析字符串
 58     :param formula: 输入的为字符串
 59     :return: 计算结果
 60     '''
 61     formula = formula.strip("()")  # 去括号,这里是(1+2-2*3+3/6)
 62     plus_and_sub_operators = re.findall("[+-]", formula)
 63     mul_and_div = re.split("[+-]", formula)  # 取出乘除公式
 64 
 65     plus_and_sub_operators, mul_and_div = handle_special_sign(plus_and_sub_operators, mul_and_div)
 66     for i in mul_and_div:
 67         if len(i) > 1:
 68             print(i)
 69             res = comupute_mut_and_div(i)
 70             formula = formula.replace(i, str(res))
 71         else:
 72             continue
 73     calc_list = re.split("[+-]", formula)  # 去除乘除公式
 74     plus_and_sub_operators, calc_list = handle_minus_inlist(plus_and_sub_operators, calc_list)
 75     total_res = None
 76     for index, i in enumerate(calc_list):
 77         if total_res:
 78             if plus_and_sub_operators[index - 1] == "-":
 79                 total_res -= float(i)
 80             elif plus_and_sub_operators[index - 1] == "+":
 81                 total_res += float(i)
 82         else:
 83             total_res = float(i)
 84     print("\033[32;1m[%s]运算结果:\033[0m" % formula, total_res)
 85     return total_res
 86 
 87 def calc(formula):
 88     '''去括号'''
 89     brackets_flag = True
 90     while brackets_flag:
 91         m = re.search("\([^()]*\)", formula)  
 92         if m:
 93             sub_res = compute(m.group())    # 替换
 94             formula = formula.replace(m.group(), str(sub_res))
 95         else:
 96             print("最终结果:", compute(formula))
 97             brackets_flag = False
 98 
 99 if __name__ == '__main__':
100     # formula = "-1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
101     formula = input("请输入:")
102     calc(formula)

这里没有实现输入非法检测,其他的都实现了,主要用的是正则表达式的提取、替换和分割,以及在for循环中使用enumerate函数。

后续再更新,完善其他更高级的运算以及图形界面显示。

猜你喜欢

转载自www.cnblogs.com/ggds2694/p/11259408.html