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

Python裝飾器結合遞歸原理解析

 更新時間:2020年07月02日 10:14:24   作者:JonnyJiang-zh  
這篇文章主要介紹了Python裝飾器結合遞歸原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

代碼如下:

import functools

def memoize(fn):
  print('start memoize')
  known = dict()
  
  @functools.wraps(fn)
  def memoizer(*args):
    if args not in known:
      print('memorize %s'%args)
      # known[args] = fn(*args)
    for k in known.keys():
        print('%s : %s'%(k, known[k]), end = ' ')
    print()
    # return known[args]
  return memoizer


@memoize
def nsum(n):
  print('now is %s'%n)
  assert (n >= 0), 'n must be >= 0'
  return 0 if n == 0 else n + nsum(n - 1)


@memoize
def fibonacci(n):
  assert (n >= 0), 'n must be >= 0'
  return n if n in (0, 1) else fibonacci(n - 1) + fibonacci(n - 2)

if __name__ == '__main__':
  print(nsum(10))
  print(fibonacci(10))

輸出如下:

start memoize
start memoize
memorize 10

None
memorize 10

None

對比代碼(把注釋的地方去掉后)的輸出:

start memoize
start memoize
memorize 10
now is 10
memorize 9
now is 9
memorize 8
now is 8
memorize 7
now is 7
memorize 6
now is 6
memorize 5
now is 5
memorize 4
now is 4
memorize 3
now is 3
memorize 2
now is 2
memorize 1
now is 1
memorize 0
now is 0
(0,) : 0
(0,) : 0 (1,) : 1
(0,) : 0 (1,) : 1 (2,) : 3
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6 (4,) : 10 
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6 (4,) : 10 (5,) : 15
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6 (4,) : 10 (5,) : 15 (6,) : 21 
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6 (4,) : 10 (5,) : 15 (6,) : 21 (7,) : 28
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6 (4,) : 10 (5,) : 15 (6,) : 21 (7,) : 28 (8,) : 36
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6 (4,) : 10 (5,) : 15 (6,) : 21 (7,) : 28 (8,) : 36 (9,) : 45 
(0,) : 0 (1,) : 1 (2,) : 3 (3,) : 6 (4,) : 10 (5,) : 15 (6,) : 21 (7,) : 28 (8,) : 36 (9,) : 45 (10,) : 55 

通過取消注釋的對比,可以得到如下結論:

  • 裝飾器memoize實際上對于函數nsum()只執(zhí)行了第一次加載的時候的預處理,然后就是nsum = memoizer。
  • 裝飾器的實質是通過functools.wraps(fn)獲得函數的名字,便于nsum.__name__ ==nsum,并將參數傳至memoize(*args),也就是*args。
  • 裝飾器通過memory(),和外面的裝飾器獲得的函數,在內部對函數進行功能改造。在上例子中,通過known[args] = fn(*args)先執(zhí)行fn函數,即上例子中nsum(10),然后就進入遞歸,t同時調用memoizer()和nsum()函數10次,且先memoizer再nsum,而且每次都在``known[args] = fn(*args)`進入遞歸,也就是每次nsum的執(zhí)行,故,對于為什么打印konwn中的元素是集中在一起的解釋就知道了,到了n == 0,才跳出遞歸,故,known的第一個元素是0,然后就循環(huán)往復。
  • 最后,其實,遞歸函數執(zhí)行的是fn(*args),即nsum()。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python數字類型和占位符詳情

    python數字類型和占位符詳情

    這篇文章主要介紹了ython數字類型和占位符詳情,文章圍繞主題展開全文詳細內容,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-03-03
  • Python 轉換RGB顏色值的示例代碼

    Python 轉換RGB顏色值的示例代碼

    這篇文章主要介紹了Python 轉換RGB顏色值的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Tensorflow實現(xiàn)卷積神經網絡用于人臉關鍵點識別

    Tensorflow實現(xiàn)卷積神經網絡用于人臉關鍵點識別

    這篇文章主要介紹了Tensorflow實現(xiàn)卷積神經網絡用于人臉關鍵點識別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Python如何獲取域名的SSL證書信息和到期時間

    Python如何獲取域名的SSL證書信息和到期時間

    在當今互聯(lián)網時代,SSL證書的重要性不言而喻,它不僅為用戶提供了安全的連接,還能提高網站的搜索引擎排名,那我們怎么才能通過Python獲取域名的SSL證書信息和到期時間呢,下面小編就來簡單講講吧
    2025-03-03
  • 解決nohup重定向python輸出到文件不成功的問題

    解決nohup重定向python輸出到文件不成功的問題

    今天小編就為大家分享一篇解決nohup重定向python輸出到文件不成功的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python刪除指定字符之前或之后所有內容的方法

    Python刪除指定字符之前或之后所有內容的方法

    本文主要介紹了Python刪除指定字符之前或之后所有內容的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Python使用struct處理二進制(pack和unpack用法)

    Python使用struct處理二進制(pack和unpack用法)

    這篇文章主要介紹了Python使用struct處理二進制(pack和unpack用法),幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • Python關于excel和shp的使用在matplotlib

    Python關于excel和shp的使用在matplotlib

    今天小編就為大家分享一篇關于Python關于excel和shp的使用在matplotlib,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Python 經典貪心算法之Prim算法案例詳解

    Python 經典貪心算法之Prim算法案例詳解

    這篇文章主要介紹了Python 經典貪心算法之Prim算法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • Python lambda匿名函數深入講解

    Python lambda匿名函數深入講解

    lambda所表示的匿名函數的內容應該是很簡單的,如果復雜的話,干脆就重新定義一個函數了,使用lambda就有點過于執(zhí)拗了。lambda就是用來定義一個匿名函數的,如果還要給他綁定一個名字的話,就會顯得有點畫蛇添足,通常是直接使用lambda函數
    2023-01-01

最新評論

上杭县| 泰来县| 秭归县| 浦县| 固镇县| 山东省| 冕宁县| 中牟县| 宁强县| 晋江市| 余江县| 信丰县| 七台河市| 昌吉市| 辽阳县| 抚顺县| 左权县| 台州市| 宜春市| 家居| 通海县| 曲松县| 拉孜县| 涿鹿县| 庆城县| 沾化县| 成安县| 大埔县| 普兰店市| 潼关县| 黄大仙区| 乌拉特后旗| 河津市| 正定县| 崇文区| 项城市| 新民市| 收藏| 育儿| 合肥市| 乌兰县|