当您可以只使用通用的预先编写的装饰器时,不必编写专门的记忆装饰器。例如,直接来自
PythonDecoratorLibrary
的以下 代码 :
import collectionsimport functoolsclass memoized(object): '''Decorator. Caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned (not reevaluated). ''' def __init__(self, func): self.func = func self.cache = {} def __call__(self, *args): if not isinstance(args, collections.Hashable): # uncacheable. a list, for instance. # better to not cache than blow up. return self.func(*args) if args in self.cache: return self.cache[args] else: value = self.func(*args) self.cache[args] = value return value def __repr__(self): '''Return the function's docstring.''' return self.func.__doc__ def __get__(self, obj, objtype): '''Support instance methods.''' return functools.partial(self.__call__, obj)
然后可以将其应用于
change()函数(或其他函数,因为它是通用的),如下所示:
@memoizeddef change(a, kinds=(50, 20, 10, 5, 1)): if a == 0: return 1 if a < 0 or len(kinds) == 0: return 0 return change(a - kinds[0], kinds) + change(a, kinds[1:])print(change(10)) # 4
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)