Python:在函数内部重新定义函数
我有一个计算很复杂的函数 f(x),我希望它只计算一次,但这个函数会被频繁调用。简单来说,第一次调用这个函数时,它应该为一系列的 x 计算出很多值,因为这些值最终会被整合在一起,然后用样条插值的方法来处理这些值,并且要把计算出来的系数保存起来,可能是存到一个文件里,以便以后使用。
我的想法是做一些类似的事情,因为这样实现起来比较简单。第一次调用这个函数时,它会做一些事情,然后重新定义自己,从那以后就执行其他操作。然而,这并没有按预期工作,而且可能在一般情况下也不是个好做法。
def f():
def g():
print(2)
print(1)
f = g
f()
f()
期望的输出:
1
2
实际的输出:
1
1
把 g() 定义在 f() 外面并没有帮助。这为什么不行呢?除此之外,我现在能想到的唯一解决办法就是使用一些全局变量。或者说,写一个类来处理这个问题是否更合理呢?
5 个回答
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
。