我在Python中使用递归lambda函数来计算斐波那契数列。我选择递归是因为它最容易用lambda实现。
fib = lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1
因为使用递归,同样的斐波那契值被多次计算,我认为使用缓存装饰器会有帮助,而且我知道
functools.lru_cache
是一个简单的选择。我知道你不能像普通函数一样对lambda函数使用
@functools.lru_cache
装饰器,但当我尝试这样做时:fib = functools.lru_cache((lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1), maxsize = None)
我收到一个错误提示,说functools.lru_cache
不会接受函数对象作为参数。
>>> fib = functools.lru_cache((lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1), maxsize = None)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
fib = functools.lru_cache((lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1), maxsize = None)
TypeError: lru_cache() got multiple values for argument 'maxsize'
我查看了文档,发现
functools.lru_cache
只接受maxsize
和typed
两个参数,默认值分别为128
和False
。有没有更巧妙的方法可以将装饰器分配给函数,而不仅仅是定义函数而不使用lambda,然后应用装饰器?
lru_cache()
返回的是一个装饰器生成器(decorator factory),而不是装饰器本身。它可以用来生成装饰器。 - Cyphaselru_cache
函数返回另一个装饰器函数!真聪明! - user3917838