首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:从函数内部重新定义函数

Python:从函数内部重新定义函数
EN

Stack Overflow用户
提问于 2011-06-19 17:34:45
回答 5查看 756关注 0票数 3

我有一些昂贵的函数f(x),我只想计算一次,但却经常被调用。本质上,当函数第一次被调用时,它应该计算一整串x的值,因为它无论如何都会被积分,然后用样条插值那个值,并以某种方式缓存系数,可能会在一个文件中供进一步使用。

我的想法是做一些类似以下的事情,因为它很容易实现。第一次调用函数时,它会做一些事情,然后重新定义自己,然后再做一些其他的事情。然而,它并不像预期的那样工作,通常可能是一种糟糕的做法。

代码语言:javascript
复制
def f():
    def g():
        print(2)
    print(1)
    f = g
f()
f()

预期输出:

代码语言:javascript
复制
1
2

实际输出:

代码语言:javascript
复制
1
1

在f()之外定义g()无济于事。为什么这不起作用?除此之外,我现在能想到的唯一解决方案就是使用一些全局变量。或者以某种方式为此编写一个类有意义吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-19 17:43:02

这太复杂了。相反,使用memoization:

代码语言:javascript
复制
def memoized(f):
    res = []
    def resf():
       if len(res) == 0
           res.append(f())
       return res[0]
    return resf

然后简单地

代码语言:javascript
复制
@memoized
def f():
   # expensive calculation here ...
   return calculated_value

在Python3中,可以用functools.lru_cache替换memoized

票数 6
EN

Stack Overflow用户

发布于 2011-06-19 17:41:33

只需在f函数的开头添加global f,否则python将创建一个局部f变量。

票数 5
EN

Stack Overflow用户

发布于 2011-06-19 17:38:03

在f的作用域中改变f不会影响函数外部,如果你想改变f,你可以使用global:

代码语言:javascript
复制
>>> def f():
...     print(1)
...     global f
...     f=lambda: print(2)
... 
>>> f()
1
>>> f()
2
>>> f()
2
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6401640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档