国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python裝飾器與遞歸算法詳解

2020-01-04 17:45:04
字體:
來源:轉載
供稿:網友
本文給大家詳細講解了python中的裝飾器與遞歸算法,有需要的小伙伴可以來參考下,希望對大家學習Python能夠有所幫助
 

1、python裝飾器

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

小P閑來無事,隨便翻看自己以前寫的一些函數,忽然對一個最最最基礎的函數起了興趣:

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

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

 import time  def sum1():   start = time.clock()   sum = 1+2   print(sum)   end = time.clock()   print("time used:",end - start)  sum1()

運行之后,完美~~

可是隨著繼續翻看,小P對越來越多的函數感興趣了,都想看下他們的運行時間如何,難道要一個一個的去改函數嗎?當然不是!我們可以考慮重新定義一個函數timeit,將sum1的引用傳遞給他,然后在timeit中調用sum1并進行計時,這樣,我們就達到了不改動sum1定義的目的,而且,不論小P看了多少個函數,我們都不用去修改函數定義了!

import timedef 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。

 import time  def sum1():   sum = 1+ 2   print (sum)  def timeit(func):   def test():     start = time.clock()     func()     end =time.clock()     print("time used:", end - start)   return test  sum1 = timeit(sum1) sum1()

這樣一個簡易的裝飾器就做好了,我們只需要在定義sum1以后調用sum1之前,加上sum1= timeit(sum1),就可以達到計時的目的,這也就是裝飾器的概念,看起來像是sum1被timeit裝飾了!Python于是提供了一個語法糖來降低字符輸入量。

 import time   def timeit(func):   def test():     start = time.clock()     func()     end =time.clock()     print("time used:", end - start)   return test  @timeit def sum1():   sum = 1+ 2   print (sum)  sum1()

重點關注第11行的@timeit,在定義上加上這一行與另外寫sum1 = timeit(sum1)完全等價。

2、遞歸算法

遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易于理解。

遞歸算法解決問題的特點:

(1) 遞歸就是在過程或函數里調用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設計程序。
(4) 在遞歸調用的過程當中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。所以一般不提倡用遞歸算法設計程序。

舉個栗子:對一個數字進行除2求值,直到小于等于1時退出并輸出結果

def divide(n,val):  n += 1  print(val)  if val / 2 > 1:    aa = divide(n,val/2)    print('the num is %d,aa is %f' % (n,aa))  print('the num is %d,val is %f' % (n,val))  return(val)divide(0,50.0)

結果說明(不return時相當于嵌套循環,一層層進入在一層層退出):

50.025.012.56.253.1251.5625the num is 6,val is 1.562500the num is 5,aa is 1.562500the num is 5,val is 3.125000the num is 4,aa is 3.125000the num is 4,val is 6.250000the num is 3,aa is 6.250000the num is 3,val is 12.500000the num is 2,aa is 12.500000the num is 2,val is 25.000000the num is 1,aa is 25.000000the num is 1,val is 50.000000

2、遞歸時return:

def divide(n,val):  n += 1  print(val)  if val / 2 > 1:    aa = divide(n,val/2)    print('the num is %d,aa is %f' % (n,aa))    return(aa)  print('the num is %d,val is %f' % (n,val))  return(val)divide(0,50.0)

結果說明(return時就直接結束本次操作):

50.025.012.56.253.1251.5625the num is 6,val is 1.562500the num is 5,aa is 1.562500the num is 4,aa is 1.562500the num is 3,aa is 1.562500the num is 2,aa is 1.562500the num is 1,aa is 1.562500

用遞歸實現斐波那契函數

def feibo(first,second,stop,list):  if first >= stop or second >= stop:    return list  else:    sum = first + second    list.append(sum)    if sum <= stop:      return feibo(second,sum,stop,list)  return listif __name__ == '__main__':  first = int(raw_input('please input the first number:'))  second = int(raw_input('please input the second number:'))  stop = int(raw_input('please input the stop number:'))  l = [first,second]  a = feibo(first,second,stop,l)  print(a)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长葛市| 广安市| 江陵县| 湖北省| 田林县| 滨海县| 嵊泗县| 镇平县| 兴海县| 涟源市| 泸水县| 定西市| 武鸣县| 绵竹市| 清丰县| 中阳县| 崇明县| 读书| 清苑县| 永登县| 潼关县| 炎陵县| 右玉县| 贡觉县| 龙海市| 册亨县| 兴隆县| 罗田县| 德江县| 顺义区| 舒城县| 永丰县| 太原市| 砚山县| 仪陇县| 阿尔山市| 兖州市| 河曲县| 顺平县| 阿鲁科尔沁旗| 泰顺县|