个人项目地址是:https://gitee.com/yeyishenzz/personal_project41678/tree/master/Python/2016035107307/srchtml
这是个人PSP表格。python
拿到这个题目, 首先想到的是如何进行加减乘除运算,由于最开始写须要测试成功,因此直接写了个类,直接赋值进去。由于每一个模块都须要对应的调用,因此须要输入的问题能够最后用input设置一下。 而后是进行括号的运算,而后进行输入行的整理和测试。git
最后对特殊状况进行处理。正则表达式
分为4个类,具体变量为括号前,括号里,括号后......(主要的这3个) 算法类 分为2种状况有括号和没括号,有括号为一种算法(Calculatemain),没有括号为另一种算法(Calculatemain2),第二种算法须要另外写一个类来对表达式进行处理。(Calculate2)算法
最后一个类为Calculate 计算类。 写了加减乘除的逻辑关系。由于Python自己识别运算的前后顺序,因此只须要考虑括号。本次写的代码一共分为了5个部分,第一个部分为最开始的简单的逻辑运算(First),第二个部分为添加括号运算(Second),第三个部分为ide
给正常运算以及带有括号的运算添加表达式(Third),第四个部分为代码中出现的一些Bug 如:输入的不是数字应该提示错误,除法运算的时候分母不该该等于0,负数运算的时候应该有另一种逻辑关系(没有实现)。(Fourth)。第五个部分为给代码加入能够从函数
cmd直接传入参数的模块及代码。性能
许多性能的代码并不知道在网上借鉴了许多Python中模块的用法,一点一点的本身进行Print输出实验,看输出的是什么东西。用了差很少1个多小时。单元测试
关键函数流程图学习
说明实现算法的关键部分:
def Calculatemain2(String1): if(String1.__contains__("*")): String1 = Calculate2(String1,"*") return Calculatemain2(String1) if(String1.__contains__("/")): String1 = Calculate2(String1,"/") return Calculatemain2(String1) if(String1.__contains__("+")): String1 = Calculate2(String1,"+") return Calculatemain2(String1) if(String1.__contains__("-")): String1 = Calculate2(String1,"-") return Calculatemain2(String1) return String1 def Calculate2(String1,fuhao): start = String1.index(fuhao) left = String1[0:start] right = String1[start + 1:] if(left.isdigit() and right.isdigit() ): leftnum = re.search('\d+$',left).group() rightnum = re.search('\d',right).group() newnum = left.rstrip(leftnum) + str(Calculate(leftnum,rightnum,fuhao)) + right.lstrip(rightnum) return newnum else: print ("error:请输入正数不能输入特殊符号")
这段代码是非括号运算的 对传入的数据放进列表中,进行运算。 嗯...这段代码其实并非很难,上网查了正则和对字符串中内容判断的知识点。也就OK了,由于以前加了对负数等等进行操做逻辑关系有点混乱(加上懒)就没写,毕竟能够用eval直接写出来(哈哈啊哈哈,不要扣我分)。
单元测试: 每一个模块进行实例化 用最常规的实例进行测试。
from main import * import unittest class Testyunsuan(unittest.TestCase): def test_add(self): ta = yunsuan("3+1") self.assertEqual(ta,'4') def test_reduce(self): ta = yunsuan("6-2") self.assertEqual(ta,'4') def test_ride(self): ta = yunsuan("6*2") self.assertEqual(ta,'12') def test_except(self): ta = yunsuan("6/3") self.assertEqual(ta,'2.0') def test_kuohao(self): ta = yunsuan("(6-3)*2") self.assertEqual(ta,'6') def test_kuohao(self): ta = yunsuan("6/0") self.assertEqual(ta,'分母不能为0') def test_add1(self): self.assertRaises(BaseException,yunsuan,("-1+2")) def test_reduce1(self): self.assertRaises(BaseException,yunsuan,("-1-2")) def test_ride1(self): self.assertRaises(BaseException,yunsuan,("-1*2")) def test_except(self): self.assertRaises(BaseException,yunsuan,("-1/2")) if __name__ == "__main__": unittest.main()
对加减乘除,进行了测试测试所有经过,分母为0,以及错误报出的异常所有经过,而且有提示。
http://www.runoob.com/python/att-string-rindex.html 这是查询如何肯定算法中括号位置的网址。
http://www.cnblogs.com/dplearning/p/5834628.html 这是查询正则表达式如何把算数式表达出来的网址。
https://www.cnblogs.com/wangboqi/p/7455240.html 这是判断字符串中内容的网址。
结合在构建之法中学习到的相关内容与我的项目的实践经历,撰写解决项目的心路历程与收获。
我以为在本次的学习中,首先学会了Git的用法,命令行如何获取参数,以及根据做业须要的知识本身所学到的一些知识,心路历程就是看到这个题目,再看到不让用eval函数,“就很开心”。怎么办我不知道,想了一夜,那就先把最简单的写了算了,写完了次日就查
资料,如何找括号,由于以前写计算器还有一点点印象因此就把算式放在了最后写(哈哈哈哈哈)。总而言之,这次项目让我以为本身仍是有些差距的,有的大佬可能几十分钟就写完了,还得继续努力! 加油!