【发布时间】:2018-06-12 11:34:17
【问题描述】:
要记忆的函数不是“纯”的(它的返回值将来可能会改变)所以我不能使用memoize 装饰。 此外,我需要调用它的值列表。
我做的是
def f(...):
cache = {}
for ...:
try:
x = cache[k]
except KeyError:
x = cache[k] = expensive(k)
# use x here
for x in cache.itervalues():
cleanup(x)
我想知道这是否是表达范式的“pythonic”方式。
例如,我可以通过写来节省 3 行
def f(...):
cache = {}
for ...:
x = cache[k] = cache.get(k) or expensive(k)
# use x here
for x in cache.itervalues():
cleanup(x)
相反(假设None、0、""、[]、{} 和其他 false 值不可能是 expensive 的返回值)。
这样看起来更好吗?
【问题讨论】:
-
@timgeb:首先,我使用 python 2,而不是 python 3。其次,缓存必须是 本地 到我的函数
f。 -
所以要明确一点,每个
cache只能在其函数调用进行时存活? -
@timgeb:是的,仅限本地
-
@glibdud:随便你怎么称呼它。问题是关于风格的。
-
请注意,
cache.get(k)可能会返回除None之外的其他虚假值,例如''、0、[]。经过一番考虑,我认为 try/except 方法很好。你也可以改用if k in cache。
标签: python python-2.7 memoization