废话写在前面:
本人小白初学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("3[31;1m[%s]运算结果=3[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("3[32;1m[%s]运算结果:3[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函数。
后续再更新,完善其他更高级的运算以及图形界面显示。
总结以上是内存溢出为你收集整理的Python实现简单的计算器全部内容,希望文章能够帮你解决Python实现简单的计算器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)