色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

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

瀏覽:95日期: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 編程
相關文章:
主站蜘蛛池模板: 一本久道久久综合中文字幕 | 日韩欧美一区二区三区不卡在线 | 亚洲无线一二三区2021 | 久久在线免费观看视频 | 99在线观看巨臀大臀视频 | 国产精品亚洲综合天堂夜夜 | 亚洲精品成人一区二区 | 女人张开腿给男人捅 | 普通话对白国产情侣自啪 | 日韩 欧美 中文 亚洲 高清 在线 | 久视频免费精品6 | 久久偷看各类wc女厕 | 久久国产精品亚洲 | 国产uv1区二区三区 国产va免费精品高清在线观看 | 日韩欧美印度一级毛片 | 一级一级毛片免费播放 | 黄页网址免费观看18网站 | 国产日本精品 | 国产深夜福利在线观看网站 | 成人免费观看国产高清 | 欧美成人激情在线 | 国产免费久久精品99久久 | 亚洲午夜网站 | 加勒比在线免费视频 | 性欧美videos 精品 | 亚洲最新网址 | 欧美自拍视频 | 毛片大片免费看 | 国产高清在线精品一区二区三区 | 97视频免费播放观看在线视频 | 免费aa在线观看 男人的天堂 | 国产成人精品综合久久久 | 成人www | 久久久久久综合成人精品 | 久久久久久久久久久福利观看 | 这里只有久久精品视频 | 欧美亚洲国产精品 | 免费观看黄色毛片 | 91久久精品 | 九九精品视频在线观看 | 欧美日韩中 |