2

「Pythonの学習」を介して作業すると、ファクトリ関数に出くわしました。この教科書の例は機能します:

def maker(N):
    def action(X):
        return X ** N
    return action


>>> maker(2)
<function action at 0x7f9087f008c0>
>>> o = maker(2)
>>> o(3)
8
>>> maker(2)
<function action at 0x7f9087f00230>
>>> maker(2)(3)
8

しかし、さらに深く進んだとき、私はそれをどのように呼ぶのか分かりません:

>>> def superfunc(X):
...     def func(Y):
...             def subfunc(Z):
...                     return X + Y + Z
...     return func
... 
>>> superfunc()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: superfunc() takes exactly 1 argument (0 given)
>>> superfunc(1)
<function func at 0x7f9087f09500>
>>> superfunc(1)(2)
>>> superfunc(1)(2)(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
>>> superfunc(1)(2)
>>>

なぜ動作しないsuperfunc(1)(2)(3)maker(2)(3)ですか?

この種のネストは確かに私には良い、使用可能なコードのようには見えませんが、Pythonはそれを有効なものとして受け入れているので、これをどのように呼び出すことができるかについて興味があります。

4

4 に答える 4

4

TypeError関数funcは何も返さないため、becauseを取得します(したがって、その戻り値はNoneType)です。それは戻るはずsubfuncです:

>>> def superfunc(X):
...     def func(Y):
...             def subfunc(Z):
...                     return X + Y + Z
...             return subfunc
...     return func
... 
于 2012-10-02T08:59:05.750 に答える
2

リターンがあなたのどこかにありsuperfuncません:あなたにはreturnforsubfuncがありますが、forはありませんfunc

于 2012-10-02T08:59:41.927 に答える
2

superfuncが修正され、呼び出し例が追加されました

def superfunc(X):
    def func(Y):
        def subfunc(Z):
            return X + Y + Z
        return subfunc
    return func

print superfunc(1)(2)(3)
于 2012-10-02T09:01:44.593 に答える
1

2番目の関数の戻りを忘れました。これが固定関数です

def superfunct(x):
  def func(y):
    def subfunc(z):
      return x + y + z
    return subfunc
  return func

print superfunct(1)(2)(3)
于 2012-10-02T09:03:18.593 に答える