1、python裝飾器
剛剛接觸python的裝飾器,簡直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍資料,猜有點點開始明白了。總結了一下解釋得比較好的,通俗易懂的來說明一下:
小P閑來無事,隨便翻看自己以前寫的一些函數,忽然對一個最最最基礎的函數起了興趣:
1 def sum1(): 2 sum = 1 + 2 3 print(sum) 4 sum1()
此時小P想看看這個函數執行用了多長時間,所以寫了幾句代碼插進去了:
1 import time 2 3 def sum1(): 4 start = time.clock() 5 sum = 1+2 6 print(sum) 7 end = time.clock() 8 print("time used:",end - start) 9 10 sum1()
運行之后,完美~~
可是隨着繼續翻看,小P對越來越多的函數感興趣了,都想看下他們的運行時間如何,難道要一個一個的去改函數嗎?當然不是!我們可以考慮重新定義一個函數timeit,將sum1的引用傳遞給他,然后在timeit中調用sum1並進行計時,這樣,我們就達到了不改動sum1定義的目的,而且,不論小P看了多少個函數,我們都不用去修改函數定義了!
import time def sum1(): sum = 1+ 2 print (sum) def timeit(func): start = time.clock() func() end =time.clock() print("time used:", end - start) timeit(sum1)
咂一看,沒啥問題,可以運行!但是還是修改了一部分代碼,把sum1() 改成了timeit(sum1)。這樣的話,如果sum1在N處都被調用了,你就不得不去修改這N處的代碼。所以,我們就需要楊sum1()具有和timeit(sum1)一樣的效果,於是將timeit賦值給sum1。可是timeit是有參數的,所以需要找個方法去統一參數,將timeit(sum1)的返回值(計算運行時間的函數)賦值給sum1。
1 import time 2 3 def sum1(): 4 sum = 1+ 2 5 print (sum) 6 7 def timeit(func): 8 def test(): 9 start = time.clock() 10 func() 11 end =time.clock() 12 print("time used:", end - start) 13 return test 14 15 sum1 = timeit(sum1) 16 sum1()
這樣一個簡易的裝飾器就做好了,我們只需要在定義sum1以后調用sum1之前,加上sum1= timeit(sum1),就可以達到計時的目的,這也就是裝飾器的概念,看起來像是sum1被timeit裝飾了!Python於是提供了一個語法糖來降低字符輸入量。
1 import time 2 3 def timeit(func): 4 def test(): 5 start = time.clock() 6 func() 7 end =time.clock() 8 print("time used:", end - start) 9 return test 10 11 @timeit 12 def sum1(): 13 sum = 1+ 2 14 print (sum) 15 16 sum1()
重點關注第11行的@timeit,在定義上加上這一行與另外寫sum1 = timeit(sum1)完全等價。
2、遞歸算法
1 def divide(n,val): 2 n += 1 3 print(val) 4 if val / 2 > 1: 5 aa = divide(n,val/2) 6 print('the num is %d,aa is %f' % (n,aa)) 7 print('the num is %d,val is %f' % (n,val)) 8 return(val) 9 10 divide(0,50.0) 11 12 結果說明(不return時相當於嵌套循環,一層層進入在一層層退出): 13 50.0 14 25.0 15 12.5 16 6.25 17 3.125 18 1.5625 19 the num is 6,val is 1.562500 20 the num is 5,aa is 1.562500 21 the num is 5,val is 3.125000 22 the num is 4,aa is 3.125000 23 the num is 4,val is 6.250000 24 the num is 3,aa is 6.250000 25 the num is 3,val is 12.500000 26 the num is 2,aa is 12.500000 27 the num is 2,val is 25.000000 28 the num is 1,aa is 25.000000 29 the num is 1,val is 50.000000 30 31 32 33 2、遞歸時return: 34 def divide(n,val): 35 n += 1 36 print(val) 37 if val / 2 > 1: 38 aa = divide(n,val/2) 39 print('the num is %d,aa is %f' % (n,aa)) 40 return(aa) 41 print('the num is %d,val is %f' % (n,val)) 42 return(val) 43 44 divide(0,50.0) 45 46 結果說明(return時就直接結束本次操作): 47 50.0 48 25.0 49 12.5 50 6.25 51 3.125 52 1.5625 53 the num is 6,val is 1.562500 54 the num is 5,aa is 1.562500 55 the num is 4,aa is 1.562500 56 the num is 3,aa is 1.562500 57 the num is 2,aa is 1.562500 58 the num is 1,aa is 1.562500
用遞歸實現斐波那契函數
1 def feibo(first,second,stop,list): 2 3 if first >= stop or second >= stop: 4 return list 5 else: 6 sum = first + second 7 list.append(sum) 8 if sum <= stop: 9 return feibo(second,sum,stop,list) 10 11 return list 12 13 14 15 if __name__ == '__main__': 16 first = int(raw_input('please input the first number:')) 17 second = int(raw_input('please input the second number:')) 18 stop = int(raw_input('please input the stop number:')) 19 l = [first,second] 20 a = feibo(first,second,stop,l) 21 print(a)
3、簡易計算器
該計算器思路:
1、遞歸尋找表達式中只含有 數字和運算符的表達式,並計算結果
2、由於整數計算會忽略小數,所有的數字都認為是浮點型操作,以此來保留小數
