久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

Python裝飾器結(jié)合遞歸原理解析

瀏覽:105日期: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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 郸城县| 呼和浩特市| 诸暨市| 霍林郭勒市| 丰宁| 龙泉市| 巴楚县| 贵阳市| 威海市| 娱乐| 灵石县| 罗江县| 隆尧县| 娄底市| 合作市| 太和县| 阳江市| 织金县| 福建省| 巴南区| 黄大仙区| 新巴尔虎右旗| 曲麻莱县| 南京市| 莱州市| 白玉县| 韩城市| 绥德县| 达孜县| 丁青县| 恩施市| 吉安市| 开鲁县| 凉山| 紫阳县| 高邮市| 大埔区| 金溪县| 华阴市| 肃宁县| 洞口县|