亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:70日期:2022-07-18 18:57:08

代碼如下:

import functoolsdef 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@memoizedef nsum(n): print(’now is %s’%n) assert (n >= 0), ’n must be >= 0’ return 0 if n == 0 else n + nsum(n - 1)@memoizedef 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 memoizestart memoizememorize 10

Nonememorize 10

None

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

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

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

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 黄工厂精品视频在线观看 | 色爱区综合激月婷婷激情五月 | 亚洲欧美日韩精品久久久 | 九九精品免视频国产成人 | 蜜芽在线| 久久综合婷婷 | 国产精品视频福利 | 日本视频二区 | 国产xxxxxx久色视频在 | 亚洲综合站 | 日韩在线精品视频 | 免费观看的黄色网址 | 久青草视频97国内免费影视 | 国产免费小视频在线观看 | 亚洲一区二区欧美日韩 | condom色疯狂做受xxxx | 欧美一级片在线免费观看 | 久久精品亚洲综合一品 | 成人网视频免费播放 | 免费 欧美 自拍 在线观看 | 国产精品麻豆高清在线观看 | 亚洲一二三区久久五月天婷婷 | 国产换爱交换乱理伦片的功能 | 国产一区系列在线观看 | 国产欧美一区二区三区在线看 | 亚洲欧美中日韩 | 国产在视频线精品视频二代 | 国产小视频精品 | 在线观看亚洲国产 | 东京一区二区三区高清视频 | 国产成人免费片在线视频观看 | 亚洲欧美精品伊人久久 | 精品中文字幕不卡在线视频 | 亚洲美女在线观看播放 | 在线观看黄日本高清视频 | 综合色99| 亚洲精品高清国产一久久 | aa国产| 亚洲成人在线网 | 边做边摸边揉的免费视频 | 国产精品酒店视频免费看 |