最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python裝飾器與遞歸算法詳解

 更新時間:2016年02月18日 10:29:22   投稿:hebedich  
本文給大家詳細講解了python中的裝飾器與遞歸算法,有需要的小伙伴可以來參考下,希望對大家學習Python能夠有所幫助

1、python裝飾器

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

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

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

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

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

運行之后,完美~~

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

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??墒莟imeit是有參數(shù)的,所以需要找個方法去統(tǒng)一參數(shù),將timeit(sum1)的返回值(計算運行時間的函數(shù))賦值給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) 遞歸就是在過程或函數(shù)里調用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設計程序。
(4) 在遞歸調用的過程當中系統(tǒng)為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數(shù)過多容易造成棧溢出等。所以一般不提倡用遞歸算法設計程序。

舉個栗子:對一個數(shù)字進行除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時相當于嵌套循環(huán),一層層進入在一層層退出):

50.0
25.0
12.5
6.25
3.125
1.5625
the num is 6,val is 1.562500
the num is 5,aa is 1.562500
the num is 5,val is 3.125000
the num is 4,aa is 3.125000
the num is 4,val is 6.250000
the num is 3,aa is 6.250000
the num is 3,val is 12.500000
the num is 2,aa is 12.500000
the num is 2,val is 25.000000
the num is 1,aa is 25.000000
the 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.0
25.0
12.5
6.25
3.125
1.5625
the num is 6,val is 1.562500
the num is 5,aa is 1.562500
the num is 4,aa is 1.562500
the num is 3,aa is 1.562500
the num is 2,aa is 1.562500
the num is 1,aa is 1.562500

用遞歸實現(xiàn)斐波那契函數(shù)

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 list

if __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)

相關文章

  • 對python讀寫文件去重、RE、set的使用詳解

    對python讀寫文件去重、RE、set的使用詳解

    今天小編就為大家分享一篇對python讀寫文件去重、RE、set的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python配置pip國內鏡像源的實現(xiàn)

    Python配置pip國內鏡像源的實現(xiàn)

    這篇文章主要介紹了Python配置pip國內鏡像源的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Flask項目搭建配置項導入教程

    Flask項目搭建配置項導入教程

    這篇文章主要為大家介紹了Flask項目搭建配置項導入教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Jupyter加載文件的實現(xiàn)方法

    Jupyter加載文件的實現(xiàn)方法

    這篇文章主要介紹了Jupyter加載文件的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python實現(xiàn)文字版掃雷

    python實現(xiàn)文字版掃雷

    這篇文章主要為大家詳細介紹了python實現(xiàn)文字版掃雷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化

    使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化

    這篇文章主要給大家介紹了關于使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化的相關資料,文中給出了詳細的思路以及示例代碼,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • TensorFlow Saver:保存和讀取模型參數(shù).ckpt實例

    TensorFlow Saver:保存和讀取模型參數(shù).ckpt實例

    今天小編就為大家分享一篇TensorFlow Saver:保存和讀取模型參數(shù).ckpt實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python實現(xiàn)嵌套列表平鋪的兩種方法

    python實現(xiàn)嵌套列表平鋪的兩種方法

    今天小編就為大家分享一篇python實現(xiàn)嵌套列表平鋪的兩種方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python學習筆記_數(shù)據(jù)排序方法

    Python學習筆記_數(shù)據(jù)排序方法

    Python對數(shù)據(jù)排序有兩種方法:下面我們來簡單分析下
    2014-05-05
  • python實現(xiàn)簡單flappy bird

    python實現(xiàn)簡單flappy bird

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單flappy bird小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評論

凯里市| 怀远县| 武功县| 锡林浩特市| 怀来县| 黄山市| 信丰县| 兴城市| 哈巴河县| 馆陶县| 盐山县| 乃东县| 蓬莱市| 枣强县| 双桥区| 石楼县| 武汉市| 延长县| 乌兰浩特市| 西吉县| 洞头县| 尼玛县| 土默特右旗| 荔波县| 日土县| 富蕴县| 渭源县| 永嘉县| 田东县| 福贡县| 扎囊县| 桐梓县| 永平县| 华宁县| 富顺县| 宁德市| 磐安县| 迭部县| 晋宁县| 东至县| 琼结县|