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

/である/ unpacking operator です。ただし、インタープリターで直接呼び出された場合、常にそのように機能するとは限りません。これをチェックしてください:

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 に答える