是否可以保存函数的返回值以供下次调用时使用?

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