【发布时间】:2015-11-08 02:51:02
【问题描述】:
所以我在 Python 中为斐波那契数列制作了一个递归 lambda。我使用递归是因为它最容易用 lambda 实现。
fib = lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1
因为使用递归,多次计算相同的斐波那契值,我认为使用缓存装饰器会有所帮助,而且我知道functools.lru_cache 是一个简单的选择。
我知道你不能像普通函数一样将装饰器应用到使用 @functools.lru_cache 的函数到 lambda,但是当我尝试这个时:
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 的函数然后应用装饰器?
【问题讨论】:
标签: python python-3.x recursion lambda