2013-07-10 71 views
0

可有人請向我解釋,下面是如何工作的:蟒蛇傳遞位置參數另一個函數調用

class Memoize: 
    def __init__(self, f): 
     self.f = f 
     self.memo = {} 
    def __call__(self, *args): 
     if not args in self.memo: 
      self.memo[args] = self.f(*args) 
     return self.memo[args] 

然後:

def factorial(k): 
    if k < 2: return 1 
    return k * factorial(k - 1) 

factorial = Memoize(factorial) 

這是從this question拍攝。我想了解self.f(*args)是如何工作的。 args是位置參數的元組。當我嘗試做:

*(1,2,3) 

我得到語法錯誤。我認爲這是解包運營商或類似的東西。用元組星號表示什麼意思是獨立的,還是隻存在於函數調用的上下文中?謝謝你的任何解釋。

+0

http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists –

+2

你是正確的,但只存在於一個函數調用的上下文。 – BrenBarn

+0

謝謝@BrenBarn的答案。 – ducin

回答

0

它/是/一個拆箱操作員。但是,直接在解釋器中調用時並不總是如此。檢查了這一點:

In [90]: def addThese(a,b,c): 
    ....:  print 'a', a 
    ....:  print 'b', b 
    ....:  print 'c', c 
    ....:  print 'a+b+c', a+b+c 
    ....:  return a+b+c 
    ....: 

In [91]: args = (1,3,5) 

In [92]: addThese(1,3,5) 
a 1 
b 3 
c 5 
a+b+c 9 
Out[92]: 9 

In [93]: addThese(args) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-93-cc47562f352a> in <module>() 
----> 1 addThese(args) 

TypeError: addThese() takes exactly 3 arguments (1 given) 

In [94]: addThese(*args) 
a 1 
b 3 
c 5 
a+b+c 9 
Out[94]: 9