Jer*_*Kun 12 python recursion decorator
我从Peter Norvig的网站上获得了以下代码片段; 它是一个装饰器,用于在函数调用上启用memoization(缓存对函数的先前调用,以将指数递归更改为简单的动态程序).
def memo(f):
table = {}
def fmemo(*args):
if args not in table:
table[args] = f(*args)
return table[args]
fmemo.memo = table
return fmemo
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但我想知道为什么倒数第二行是必要的.这显然是我对Python知识的一个空白,但删除线和运行简单的fibonacci函数,它似乎仍然有效.这是否与同时记忆多个功能有关?为什么fmemo的成员变量被称为备忘录(假设它不是一个尴尬的巧合)?
谢谢!
Kat*_*iel 12
由于函数就像其他任何东西一样,您可以在它们上设置属性.看到:
>>> def foo(): pass
>>> foo.x = 1
>>> foo.x
1
Run Code Online (Sandbox Code Playgroud)
第二行设置值的内部缓存作为函数对象的属性,从而暴露它.这意味着您可以使用记忆功能并随意调整其缓存,而无需调用它.这可能很方便.
例:
>>> @memo
... def id(x): return x
>>> id(1)
1
>>> id(2)
2
>>> id.memo
{(2,): 2, (1,): 1}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
541 次 |
最近记录: |