python裝飾器通俗易懂的解釋!

一、python裝飾器

剛剛接觸python的裝飾器,簡直懵逼了,直接不懂什麼意思啊有木有,本身都忘了走了多少遍Debug,查了多少遍資料,猜有點點開始明白了。總結了一下解釋得比較好的,通俗易懂的來講明一下:python

 

小P閒來無事,隨便翻看本身之前寫的一些函數,突然對一個最最最基礎的函數起了興趣:算法

1 def sum1():
2      sum = 1 + 2
3      print(sum)
4 sum1()

此時小P想看看這個函數執行用了多長時間,因此寫了幾句代碼插進去了:app

 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()

運行以後,完美~~ide

但是隨着繼續翻看,小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。spa

 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)徹底等價。code

二、遞歸算法

遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它每每使算法的描述簡潔並且易於理解。
遞歸算法解決問題的特色:
(1) 遞歸就是在過程或函數裏調用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。
(3) 遞歸算法解題一般顯得很簡潔,但遞歸算法解題的運行效率較低。因此通常不提倡用遞歸算法設計程序。
(4) 在 遞歸調用的過程中系統爲每一層的返回點、局部量等開闢了棧來存儲。遞歸次數過多容易形成 棧溢出等。因此通常不提倡用遞歸算法設計程序。
 
舉個栗子:對一個數字進行除2求值,直到小於等於1時退出並輸出結果
 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
View Code

用遞歸實現斐波那契函數htm

 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)
View Code

三、簡易計算器

該計算器思路:
    一、遞歸尋找表達式中只含有 數字和運算符的表達式,並計算結果
    二、因爲整數計算會忽略小數,全部的數字都認爲是浮點型操做,以此來保留小數
相關文章
相關標籤/搜索