個人項目地址是: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函數,「就很開心」。怎麼辦我不知道,想了一夜,那就先把最簡單的寫了算了,寫完了次日就查
資料,如何找括號,由於以前寫計算器還有一點點印象因此就把算式放在了最後寫(哈哈哈哈哈)。總而言之,這次項目讓我以爲本身仍是有些差距的,有的大佬可能幾十分鐘就寫完了,還得繼續努力! 加油!