我创建了一个问题,它锻炼了一个人在Python中使用生成器、修饰符和字典的能力。在
然而,我自己解决不了这个问题,我想知道是否有可能解决这个问题。在
是否可以使用包装生成器的decorator函数以字典的形式缓存函数输出?在
练习是:
编写一个decorator来缓存函数调用结果。 存储对arg:导致函数属性中的字典 对象。使用生成器函数生成这些结果 在fibonacci函数上测试代码。
我试图实施如下:
def cachefunc(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return {func.__name__ + '(' + str(list(args))[1:-1] + ')' : str(result)}
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
return wrapper
@cachefunc
def fibonacci(n):
assert n >= 0
if n < 2:
return n
else:
return (fibonacci(n-1) + fibonacci(n-2))
def allfib():
n = 0
while True:
yield fibonacci(n)
n += 1
result = []
generator = allfib()
while len(result) < 10:
x = next(generator)
result.append(x)
print result
但是,我得到了以下错误:
^{pr2}$有人知道这样一个问题的另一种解决方法吗?在
您的特定错误
错误在这里:
当你想返回我相信的结果时,你就是在退字典。我不太明白你在缓存函数里面做什么缓存。在
一般评论
这种缓存模式通常也被称为记忆化。在
试试这个http://avinashv.net/2008/04/python-decorators-syntactic-sugar/。向下滚动到关于斐波那契的部分。可在此处找到以下代码:
^{pr2}$然后简单地做:
完整代码
在您的示例中,memorization仍然在生成器上工作,请注意print语句显示正在获取memorized结果。在
相关问题 更多 >
编程相关推荐