av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

你知道瘋狂的字典嗎?

代碼定義了一個(gè)類 FibDict,繼承自 dict,自定義了魔術(shù)方法 __missing__ 當(dāng) dict 查找 key失敗(missing)的時(shí)候,會由 Python 解釋器自行調(diào)用改方法。換句話說,如果試圖從 dict 中獲取不存在的 key,就會執(zhí)行這個(gè)方法。

因此計(jì)算 fib_dict[10] 就會執(zhí)行這個(gè)方法,計(jì)算 fib_dict[9] 和 fib_dict[8],就這樣遞歸,一直到 fib_dict[0]和 fib_dict[1]。

這是遞歸,但是字典是一種 hash 表,只要計(jì)算過的數(shù)據(jù)不會重復(fù)計(jì)算,因此效率非常高。

我們可以驗(yàn)證下計(jì)算 fib_dict[200] 的耗時(shí):

可以看出連 1 毫秒都不到。

不過,遞歸雖爽,可不要貪杯哦,任何事情都有極限,1000 是遞歸的默認(rèn)極限(sys.getrecursionlimit() ==1000),如果你直接計(jì)算 fib_dict[501] 就拋出 RecursionError 異常。

你可能有個(gè)小小的疑問,為什么遞歸的深度是 1000,但我調(diào)用 501 次就不行了呢?其實(shí)原因在于 __missing__ 調(diào)用了 __setitem__,__setitem__ 又調(diào)用了 __missing__,因此每個(gè)缺失的 key 其實(shí)調(diào)用了兩次,所以超過 500 就會報(bào)錯(cuò)。

但是,字典是有記憶的,如果你這樣調(diào)用它,永遠(yuǎn)不會出現(xiàn)遞歸的問題:


當(dāng)前名稱:你知道瘋狂的字典嗎?
文章URL:http://uogjgqi.cn/article/cdhpesg.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流