【问题标题】:Is it possible to save the returned value of a function for the next time it is called?是否可以在下次调用时保存函数的返回值?
【发布时间】:2020-06-27 22:11:18
【问题描述】:

我正在编写一个迭代计算积分的函数,对于下一次估计,我需要之前的结果。

我正在使用一个辅助变量来存储之前的结果并且它可以工作,但是是否可以在自己的函数中执行此操作(类似于在 fortran 中 SAVE 声明的变量)?

【问题讨论】:

  • 代码在哪里?
  • 不,Python 中没有类似的东西。 Python 和 Fortran 是完全不同的语言。在 python 中,你通常会做你已经在做的事情,或者使用类(甚至是函数闭包)之类的东西。但老实说,你所拥有的听起来不错且正常
  • 我从未听说过 Fortran 以外的其他语言这样做 - 今天是我第一次听说 Fortran 这样做。
  • @KarlKnechtel,与在 C 函数体中声明 vrbl static 几乎相同。例如,static int count = 0; 在函数的顶部,++count 在函数体中,然后你就可以持续计算函数被调用的次数。
  • 。是的,这是有道理的,谢谢。

标签: python python-3.x function save


【解决方案1】:

没有什么自动的,但是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多