2013-10-19 56 views
0

我目前正在學習裝飾器,這個例子應該是一個基本的裝飾器,它保存了遞歸斐波那契函數的結果,但是我有幾個問題。首先是「fn」,那只是一個變量的名字?或者它是Python語言的一部分。 'KeyError'同樣的問題。我也不明白爲什麼在函數體中,有時ARGS在前面,其他時間*不(應該不是總是有*)試圖實現一個Python裝飾器,被困在幾個地方

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) 

回答

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異常'

是否有對應的說法沒有以前memoized值,stored_results[args]提高KeyError。 (TypeError如果您傳遞不可取值作爲參數)。

我也搞不懂爲什麼在函數體中,有時ARGS在前面

一個*爲了memoize裝飾用,這可能需要多個參數另一個函數工作。

+0

謝謝!我知道參數意味着多個參數,但我仍然不明白爲什麼有時候在這個例子中,前面有一個明星,有時不存在 – user2897013

+0

@ user2897013,它取決於裝飾器的用例。如果裝飾器應該使用任意函數(參數可能會有所不同),那麼它使用'*',如果它應該被具有固定參數的函數使用,那麼它將指定參數。 – falsetru