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)

这是取自这个问题。我想了解它是如何self.f(*args)工作的。args是位置参数的元组。当我尝试这样做时:

*(1,2,3)

我收到语法错误。我认为这是某种解包操作符或类似的东西。带有元组的星号是独立表示任何东西还是仅存在于函数调用的上下文中?感谢您的任何解释。

4

1 回答 1

1

它 /is/ 是一个解包操作符。但是,当直接在解释器中调用时,它并不总是以这种方式工作。看一下这个:

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
于 2013-07-10T22:54:50.337 回答