我正在学习Composing Programs中的优化.我有三个功能.memo是用于记忆技术的,count是包装器,所以每次调用fib都会激活一个计数器.fib只是具有递归性的斐波纳契数组的一个实现.

 def memo(f):
    cache = {}

    def memoized(n):
        if n not in cache:
            cache[n] = f(n)
        return cache[n]

    return memoized


def count(f):
    def counted(*args):
        counted.call_count += 1
        return f(*args)

    counted.call_count = 0
    return counted


def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n - 2) + fib(n - 1)

为了调用函数,我把count(fib)改为counted_fib, so every call is recorded.,并重新设计了*fib*变量(现在,fib不是原来的函数了)

counted_fib = count(fib)
fib = memo(counted_fib)

我的问题开始于函数fib被调用时(例如fib(19)),一切正常工作,但原始函数(return fib(n - 2) + fib(n - 1))内的递归将fib触发为memo(counted_fib).

这不是什么不起作用的东西的问题.我只是在试着理解,如果一件事在另一件事之前宣布,为什么会发生这种情况.

推荐答案

如果您感到困惑的是fib名称在从原始的fib()函数重新赋值为调用memo(counted_fib的变量时的行为方式,我认为this article关于Python的命名空间行为将会有所帮助.

从第一条语句开始执行Python程序.但即使在此之前,全局命名空间也已加载.因此,您将fib名称指定为fib().但是稍后,您将该赋值更改为memo(counted_fib),一旦程序启动,最后一个赋值就是加载了全局名称空间的赋值.

希望它能帮上忙!

Python-3.x相关问答推荐

TypeError:&Quot;Value&Quot;参数必须是标量、Dict或Series,但您传递了&Quot;Index&Quot;

如何验证具有内部json字符串的json字符串?

如何使用Python将嵌套的XML转换为CSV

使用数据库将文件从Sharepoint下载到文件系统

我们可以在每个可以使用 Pandas Join 的用例中使用 Pandas merge 吗?

我可以设置树视图层次 struct 按钮吗?

转换Pandas 数据框 - 添加行

XPATH:使用 .find_elements_by_xpath 为未知数量的 xpath 输入值

SqlAlchemy - 从 oracle db 中检索长文本

如何在 django 中没有循环的情况下获得前键的前键?

将字符串表示与使用整数值的枚举相关联?

无法在 macOS 上的 Anaconda3 python3.6 上安装 OpenCV3

sys.stdin.readline() 读取时没有提示,返回 'nothing in between'

Pandas 的 EMA 与股票的 EMA 不匹配?

带百分号的 Python 字符串格式

无论如何我可以在 Google colaboratory 中下载文件吗?

导入父目录进行简要测试

通过字典有效地替换Pandas 系列中的值

如何从集合中删除多个元素?

在 PyCharm 中配置解释器:请使用不同的 SDK 名称