我目前正在学习装饰器,这个例子应该是一个保存递归fibonacci函数结果的基本装饰器,但我有几个问题。首先是“fn”,这只是变量的名称吗?或者它是python语言的一部分。 “KeyError”的问题相同。我也不明白为什么在函数体内,args有时会在前面有*而其他时候没有(不应该总是有*)
def memoize(fn):
stored_results = {}
def memoized(*args):
try:
return stored_results[args]
except KeyError:
result = stored_results[args]=fn(*args)
return result
return memoized
def fibonacci(n):
if n == 0 or n == 1:
return n
else:
return (fibonacci(n-1)+fibonacci(n-2))
@memoize
fibonacci(5)
答案 0 :(得分:0)
缩进正确。
def memoize(fn):
stored_results = {}
def memoized(*args):
try:
return stored_results[args]
except KeyError:
result = stored_results[args]=fn(*args)
return result
return memoized
#^^^
@memoize
应该在def ...
行之前。
@memoize # <-- should be here
def fibonacci(n):
if n == 0 or n == 1:
return n
else:
return (fibonacci(n-1)+fibonacci(n-2))
只需拨打fibonacci
,不要@memoize
fibonacci(5)
首先是“fn”,这只是一个变量的名称吗?
一个功能对象。这是fibonacci
函数。
'KeyError'的相同问题
如果参数没有以前记忆的值,stored_results[args]
会引发KeyError
。 (TypeError
如果您传递不可用的值作为参数)。
我也不明白为什么在函数体中,args有时会在前面有一个*
使memoize
装饰器与另一个可能带有多个参数的函数一起工作。