记忆函数中嵌套函数的用途让我感到困惑。聪明人明白吗?

Purpose of nested function within memoization function is confusing me. Does someone smart understand?

提问人:RXEsquivel 提问时间:7/13/2023 更新时间:7/13/2023 访问量:37

问:

“内部”函数在下面做什么?仅仅是因为“返回内部”需要包含在“memoize_factorial”函数中吗?

memory = {}
def memoize_factorial(f):
    
    # This inner function has access to memory
    # and 'f'
    def inner(num): # WHAT DOES this "inner" FUNCTION DO?
        if num not in memory:
            memory[num] = f(num)
            print('result saved in memory')
        else:
            print('returning result from saved memory')
        return memory[num]

    return inner # WHAT DOES "inner" MEAN?
    
@memoize_factorial
def facto(num):
    if num == 1:
        return 1
    else:
        return num * facto(num-1)

print(facto(5))
print(facto(5)) # directly coming from saved memory

我从这篇 Geeks for Geeks 文章中得到了这段代码:https://www.geeksforgeeks.org/memoization-using-decorators-in-python/

我试着看看我是否能像一个成年人一样理解这段代码中发生的事情,但在 45 分钟的方形大脑之后,我决定问问大脑不那么方形的更聪明的人。

Python 函数 递归 记忆

评论

1赞 juanpa.arrivillaga 7/13/2023
return inner # WHAT DOES "inner" MEAN?,嗯,是一个局部变量,它指的是你刚才在语句上方定义的函数innerreturn
1赞 juanpa.arrivillaga 7/13/2023
无论如何,这确实是一个过于宽泛的问题。您对函数定义到底有什么不了解?你了解装饰师是如何工作的吗?请注意,这个装饰器非常无用,因为你不能重复使用它。老实说,一个非常糟糕的装饰师的例子def inner
0赞 Tim Roberts 7/13/2023
memoize_factorial用作装饰器。(参见 ?这意味着它本质上充当了 .通过这样做,这意味着任何打电话的人实际上都会打电话。 检查是否已看到该参数。如果没有,它将调用原始文件(传递给装饰器)并将其存储在内存中。@memoize_factorialfactoreturn innerfactoinnerinnerf
0赞 Samwise 7/13/2023
这是装饰器IMO的一个不错的例子,只是名字不好 - 它可以记住任何接受单个(可散列)参数的函数,而不仅仅是你的阶乘函数。如果你把这个装饰器也应用到其他东西上(也许是递归斐波那契函数),装饰器和函数之间的交互会变得更加清晰。
0赞 juanpa.arrivillaga 7/13/2023
@Samwise它只适用于一个功能。如果我用它装饰,在使用它之后,比如说,,那么会提供错误的结果(而不是),因为它只是天真地根据输入的值,使用单个字典来记忆。应该在里面,所以每个修饰的函数都有它自己的内存。这个名字实际上很好,因为它显然只应该记住阶乘函数def foo(x): return xfact(5)foo(5)1205memory = {}memoize_factorial

答: 暂无答案