大家好,我是somenzz,Python的灵活度令人发指,今天分享一下字典的疯狂运算,以及斐波那契数列的计算。话不多说,先看代码:代码中定义了一个类FibDict,继承自dict,自定义魔术方法__missing__当dict找不到key(缺失)时,Python解释器会自行调用该方法。换句话说,如果尝试从字典中检索不存在的键,将执行此方法。所以计算fib_dict[10]会执行这个方法,计算fib_dict[9]和fib_dict[8],递归到fib_dict[0]和fib_dict[1]。这就是递归,但是字典是一种哈希表,只要计算出来的数据不会重新计算,效率很高。我们可以验证fib_dict[200]的计算耗时:可以看出不到1毫秒。然而,虽然递归很酷,但不要贪心。一切都有一个限度。1000是递归的默认限制(sys.getrecursionlimit()==1000)。如果直接计算fib_dict[501],会抛出RecursionError异常。大家可能会有一个小疑问,为什么递归的深度是1000,我却调用不了501次?原因是__missing__调用了__setitem__,而__setitem__又调用了__missing__,所以每个缺失的key其实都被调用了两次,所以超过500就会报错。但是,字典是有记忆的,如果你这样调用,就永远不会出现递归问题:
