Python:在函数内部重新定义函数

4 投票
5 回答
824 浏览
提问于 2025-04-16 19:51

我有一个计算很复杂的函数 f(x),我希望它只计算一次,但这个函数会被频繁调用。简单来说,第一次调用这个函数时,它应该为一系列的 x 计算出很多值,因为这些值最终会被整合在一起,然后用样条插值的方法来处理这些值,并且要把计算出来的系数保存起来,可能是存到一个文件里,以便以后使用。

我的想法是做一些类似的事情,因为这样实现起来比较简单。第一次调用这个函数时,它会做一些事情,然后重新定义自己,从那以后就执行其他操作。然而,这并没有按预期工作,而且可能在一般情况下也不是个好做法。

def f():
    def g():
        print(2)
    print(1)
    f = g
f()
f()

期望的输出:

1
2

实际的输出:

1
1

把 g() 定义在 f() 外面并没有帮助。这为什么不行呢?除此之外,我现在能想到的唯一解决办法就是使用一些全局变量。或者说,写一个类来处理这个问题是否更合理呢?

5 个回答

3

你可以使用备忘录技术装饰器来缓存结果。这里有一个示例可以参考。还有一个关于备忘录技术的单独问题,可能对你有帮助,可以在这里找到

6

只需要在 f 函数的开头加上 global f,否则 Python 会创建一个局部的 f 变量。

6

这太复杂了。其实可以用一种叫做“记忆化”的方法来简化:

def memoized(f):
    res = []
    def resf():
       if len(res) == 0
           res.append(f())
       return res[0]
    return resf

然后只需要简单地

@memoized
def f():
   # expensive calculation here ...
   return calculated_value

在Python 3中,你可以用 functools.lru_cache 来替代 memoized

撰写回答