Я пытался изучать Python, и, хотя я с энтузиазмом относился к использованию замыканий в Python, у меня были проблемы с настройкой кода для правильной работы:
def memoize(fn):
def get(key):
return (False,)
def vset(key, value):
global get
oldget = get
def newget(ky):
if key==ky: return (True, value)
return oldget(ky)
get = newget
def mfun(*args):
cache = get(args)
if (cache[0]): return cache[1]
val = apply(fn, args)
vset(args, val)
return val
return mfun
def fib(x):
if x<2: return x
return fib(x-1)+fib(x-2)
def fibm(x):
if x<2: return x
return fibm(x-1)+fibm(x-2)
fibm = memoize(fibm)
По сути, это то, что предполагается сделать, это использовать замыкания для поддержания запомненного состояния функции. Я понимаю, что, вероятно, есть много более быстрых, простых для чтения и в целом более «питонских» способов реализовать это; однако моя цель - понять, как именно замыкания работают в Python и чем они отличаются от Lisp, поэтому меня не интересуют альтернативные решения, просто почему мой код не работает и что я могу сделать (если что-нибудь), чтобы исправить это.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь использовать fibm
- Python настаивает, что get
не определено:
Python 2.6.1 (r261:67515, Feb 1 2009, 11:39:55)
[GCC 4.0.1 (Apple Inc. build 5488)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import memoize
>>> memoize.fibm(35)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "memoize.py", line 14, in mfun
cache = get(args)
NameError: global name 'get' is not defined
>>>
Видя, что я новичок в Python, я не знаю, сделал ли я что-то не так или это просто ограничение языка. Я надеюсь, что это первое. : -)