0

我目前正在学习装饰器,这个例子应该是一个基本的装饰器,可以保存递归斐波那契函数的结果,但是我有几个问题。首先是“fn”,这只是变量的名称吗?或者它是python语言的一部分。'KeyError' 同样的问题。我也不明白为什么在函数体中,args 有时前面有一个 * 而其他时候没有(它不应该总是有一个 *)

def memoize(fn):
    stored_results = {}

    def memoized(*args):
        try:
            return stored_results[args]
        except KeyError:
            result = stored_results[args]=fn(*args)
            return result
return memoized

def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return (fibonacci(n-1)+fibonacci(n-2))


@memoize
fibonacci(5)
4

1 回答 1

0
  1. 正确缩进。

    def memoize(fn):
        stored_results = {}
    
        def memoized(*args):
            try:
                return stored_results[args]
            except KeyError:
                result = stored_results[args]=fn(*args)
                return result
        return memoized
    #^^^
    
  2. @memoize应该def ...在行前。

    @memoize # <-- should be here
    def fibonacci(n):
        if n == 0 or n == 1:
            return n
        else:
            return (fibonacci(n-1)+fibonacci(n-2))
    
  3. 直接打电话fibonacci@memoize

    fibonacci(5)
    

首先是“fn”,这只是变量的名称吗?

一个函数对象。在这里,它是fibonacci功能。

'KeyError' 同样的问题

如果该参数没有先前记忆的值,则stored_results[args]raise KeyError。(TypeError如果您将不可散列的值作为参数传递)。

我也不明白为什么在函数体中,args 有时前面有一个 *

使memoize装饰器与另一个可以接受多个参数的函数一起工作。

于 2013-10-19T05:21:22.043 回答