国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:71日期: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 編程
相關文章:
主站蜘蛛池模板: 国产欧美日本 | 99re在线精品视频 | 久久国产精品二国产精品 | 996久久国产精品线观看 | 九色视频在线观看免费 | 欧美一区二区三区男人的天堂 | 欧美一级大黄特黄毛片视频 | 日韩三级免费看 | 欧美线在线精品观看视频 | 国产成人亚洲合集青青草原精品 | 国产精品福利社 | 国产伦精品一区二区三区无广告 | 国产亚洲精品美女一区二区 | 玖玖玖精品视频免费播放 | 成人网18免费网站 | 毛片免费在线播放 | xxx国产老太婆视频 xxx欧美老熟 | 黄色a站| 国产欧美成人不卡视频 | 国产精品亚洲二区 | 欧美一级二级三级视频 | 欧美精品aaa久久久影院 | 久久99精品视频在线在线观看 | 亚洲成综合 | 美国的毛片免费的 | 国产成人精品午夜视频' | 亚洲高清国产品国语在线观看 | 国产欧美精品一区二区三区 | 日本乱人伦在线观看免费 | 久草首页在线观看 | 中文字幕在线视频在线看 | 欧美成人亚洲高清在线观看 | 九九国产精品 | 欧美二级在线观看免费 | 成人欧美一区二区三区 | 国产精品怡红院在线观看 | chinese多姿势videos | 久久99这里只有精品国产 | 亚洲一区二区三区在线视频 | 亚洲日本视频在线观看 | 国产精品路边足疗店按摩 |