是否可以保存函数的返回值以供下次调用时使用?
Is it possible to save the returned value of a function for the next time it is called?
我正在编写一个迭代计算积分的函数,对于下一个估计,我需要上一个结果。
我正在使用一个辅助变量来存储先前的结果并且它有效,但是是否可以在自己的函数中执行此操作(类似于 Fortran 中的 SAVE 声明变量)?
没有什么是自动的,但是 Python 中的函数可以有属性。因此,例如,这有效:
>>> def f(n):
... result = n+1
... f.last = result
... return result
>>> f(6)
7
>>> f.last
7
last
这个名字没什么神奇的——只是我编造的一个任意标识符。当然你也可以在函数体之外绑定那个属性:
>>> f.last = 12
>>> f.last
12
魔法
如果你做了很多这样的事情(我真的不推荐),可以用一些代码来自动化它,通过编写一个“装饰器”,你可以应用到函数来改变它们的行为。这个很神奇:
# Decorator to change a function to save its last return value
# in attribute `last`.
from functools import wraps
def addlast(f):
@wraps(f)
def g(*args, **kw):
g.last = f(*args, **kw)
return g.last
g.last = None
return g
鉴于此,您可以将“@addlast”放在函数定义之前以更改其行为,而无需更改函数本身:
@addlast
def f(i, j):
return i + j
print(f.last)
print(f(3, 9))
print(f.last)
其中显示:
None
12
12
我正在编写一个迭代计算积分的函数,对于下一个估计,我需要上一个结果。
我正在使用一个辅助变量来存储先前的结果并且它有效,但是是否可以在自己的函数中执行此操作(类似于 Fortran 中的 SAVE 声明变量)?
没有什么是自动的,但是 Python 中的函数可以有属性。因此,例如,这有效:
>>> def f(n):
... result = n+1
... f.last = result
... return result
>>> f(6)
7
>>> f.last
7
last
这个名字没什么神奇的——只是我编造的一个任意标识符。当然你也可以在函数体之外绑定那个属性:
>>> f.last = 12
>>> f.last
12
魔法
如果你做了很多这样的事情(我真的不推荐),可以用一些代码来自动化它,通过编写一个“装饰器”,你可以应用到函数来改变它们的行为。这个很神奇:
# Decorator to change a function to save its last return value
# in attribute `last`.
from functools import wraps
def addlast(f):
@wraps(f)
def g(*args, **kw):
g.last = f(*args, **kw)
return g.last
g.last = None
return g
鉴于此,您可以将“@addlast”放在函数定义之前以更改其行为,而无需更改函数本身:
@addlast
def f(i, j):
return i + j
print(f.last)
print(f(3, 9))
print(f.last)
其中显示:
None
12
12