国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

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

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

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

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

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

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

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

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 潜江市| 宜都市| 合江县| 满城县| 陆河县| 南澳县| 桃源县| 东乌珠穆沁旗| 荣成市| 县级市| 吐鲁番市| 宁安市| 察雅县| 长宁区| 彝良县| 尼木县| 西乌| 明水县| 郑州市| 浏阳市| 岱山县| 永春县| 隆尧县| 尼玛县| 库尔勒市| 遂溪县| 巨野县| 开江县| 香格里拉县| 朝阳区| 汤阴县| 滦平县| 永顺县| 营口市| 通化市| 临武县| 竹溪县| 武功县| 大英县| 贡觉县| 革吉县|