7 python recursion lambda python-3.x
所以我在Python中为Fibonacci序列做了一个递归lambda.我使用递归,因为它最容易用lambda实现.
fib = lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1
Run Code Online (Sandbox Code Playgroud)
因为使用递归,相同的Fibonacci值被计算了很多次,我认为使用缓存装饰器会有所帮助,我知道这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)
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,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'
Run Code Online (Sandbox Code Playgroud)
我检查了文档,它看起来functools.lru_cache只接受一个maxsize和一个typed参数,它们分别默认为128和False.
是否有更聪明的方法将装饰器分配给函数而不是仅仅定义没有lambda的函数然后应用装饰器?
iob*_*der 10
尝试 fib = functools.lru_cache()(lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1)
我相信调用lru_cache返回一个函数,它接受一个函数并返回一个函数.要提供最大尺寸,请使用fib = functools.lru_cache(100)(lambda n: fib(n - 1) + fib(n - 2) if n > 1 else 1)