欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python裝飾器與遞歸算法詳解

系統(tǒng) 1613 0

1、python裝飾器

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

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

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

          

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

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


          

運(yùn)行之后,完美~~

可是隨著繼續(xù)翻看,小P對越來越多的函數(shù)感興趣了,都想看下他們的運(yùn)行時間如何,難道要一個一個的去改函數(shù)嗎?當(dāng)然不是!我們可以考慮重新定義一個函數(shù)timeit,將sum1的引用傳遞給他,然后在timeit中調(diào)用sum1并進(jìn)行計(jì)時,這樣,我們就達(dá)到了不改動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)


          

咂一看,沒啥問題,可以運(yùn)行!但是還是修改了一部分代碼,把sum1() 改成了timeit(sum1)。這樣的話,如果sum1在N處都被調(diào)用了,你就不得不去修改這N處的代碼。所以,我們就需要楊sum1()具有和timeit(sum1)一樣的效果,于是將timeit賦值給sum1。可是timeit是有參數(shù)的,所以需要找個方法去統(tǒng)一參數(shù),將timeit(sum1)的返回值(計(jì)算運(yùn)行時間的函數(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以后調(diào)用sum1之前,加上sum1= timeit(sum1),就可以達(dá)到計(jì)時的目的,這也就是裝飾器的概念,看起來像是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()


          

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

2、遞歸算法

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

遞歸算法解決問題的特點(diǎn):

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

舉個栗子:對一個數(shù)字進(jìn)行除2求值,直到小于等于1時退出并輸出結(jié)果

            
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)


          

結(jié)果說明(不return時相當(dāng)于嵌套循環(huán),一層層進(jì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)


          

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

            
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

          

用遞歸實(shí)現(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)

          


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产日韩欧美在线 | 色综合伊人色综合网亚洲欧洲 | 最新国产视频 | 色噜| 亚洲最大福利视频 | 欧美精品导航 | 午夜电影通 | 久久久精品网 | 好看的一级毛片 | 欧美网站www | 色综合久久丁香婷婷 | 成人欧美s视频在线观看 | 91精品中文字幕 | 国产亚洲视频在线 | 国产香蕉视频在线观看 | 国产偷国产偷在线高清 | 成人高清视频免费观看 | 精品国产一区二区三区成人影院 | 奇米影视888狠狠狠777九色 | 国产欧美一区二区三区免费看 | 亚洲欧美激情另类 | 日本成熟视频tube~be | 广西美女一级毛片 | 日日狠狠的日日日日 | 精品一区二区三区在线视频 | 欧美高清在线精品一区 | 97视频免费播放观看在线视频 | 色播放 | 五月天丁香久久 | 老头巨大校花体内驰骋小说文 | 亚洲国产精久久久久久久 | 精品精品国产高清a毛片 | a毛片免费| 我和我的祖国电影在线观看免费版高清 | 亚洲综合在线另类色区奇米 | 日韩a在线| 国产福利高清在线视频 | 日本激情视频网站w | 四虎网站在线观看 | 99人体做爰视频 | 天天舔天天射天天操 |