2017-12-15 6 views
-1
 
def do_twice(f,x): 
    f(x) 
    f(x) 

def do_four(f,x): 
    do_twice(do_twice(f,x),x) 

def printx(x): 
    print(x) 

do_four(printx,"text") 

私は言語の初心者です。私は関数がパラメータとして簡単に送信できることを発見しました。だから私はそれに取り組むことにしました。しかし、私はこれを試してみましたが、ランダムに変更されたバージョンもありました。なぜこの小さな関数乗算の仕事はありません

 
def do_four(f,x): 
    do_twice(f,x) 
    do_twice(f,x) 

私はそのような問題を解決することができることを知っている、しかし、1つは、以前に動作していないので、私は理由を知りたいと思いました。

+0

それは "失敗"ですか?あなたが期待している行動、あなたが見ている行動、そしてそれがいかに適切ではないかを詳しく教えてください。エラーが発生していますか?次に、スタックトレースを含む完全なエラーメッセージを投稿します。 –

+0

すてきな実験! 'do_twice1(f、x)'と 'do_twice2(f、x)'を定義し、 'do_twice1(do_twice2(printx、 'text')、 'text')'を呼び出すと問題は解決しますか?私の考えは、それ自身の中から機能を呼び出さないでください。例えば。あなたはモジュールを再帰的にインポートすることを許可していません –

+0

この行 'do_twice(do_twice(f、x)、x)'に 'do_twice(f、x)'を間違って渡しています。 'do_twice'の最初のパラメータは関数参照であり、関数呼び出しではありません(この場合は' None'です)。 –

答えて

0

ネストされたdo_twice()do_four())の呼び出しは、明示的に別のものを返していないため、Noneを返します。 do_twice()への「外部」呼び出しは、呼び出す関数として値Noneを参照しますが、Noneは関数ではありません。

do_twice()の最も内側の関数呼び出しが最初に評価され、外側の呼び出しに最初の引数が設定されます。この最も内側の呼び出しは、正しい引数(関数とオブジェクト)を渡します。この結果、最初の2つの印刷行はtextになります。 do_twice()の最初の呼び出しが戻ると、明示的な戻り値が与えられていない場合のデフォルトの戻り値であるNoneを返します。

Noneは、do_twice()の最も外側の呼び出しの最初の引数として渡されますが、Noneは関数ではないため、呼び出すことはできません。最終的には、外側の呼び出しは、次のような呼び出しであるかのように見えます:

do_twice(None, x) 
     # ^^^^ note the None value here; None is not a function, so 
     #  the subsequent call to do_twice() fails 

do_twice()ffを呼び出そうとする前に機能するかどうかを確認するためにチェックした場合、このエラーは発生しません、代わりにあなただけ見るであろう2行のtextが印刷されています。あなたの4つのファンクション内

0

def do_four(f,x): 
    do_twice(do_twice(f,x),x) 

入力が正しいようdo_twiceへの最初の呼び出しが実行されますが、それ以来call機能を「コールするdo_twice試行にNone、次の呼び出しを返します。 None "となり、失敗します。だから、


、あなたは2回だけ明示的に呼び出しを行うことができますいずれか、2つのオプションがあります。

def do_four(f,x): 
    do_twice(f,x) 
    do_twice(f,x) 

またはスケーラブル以上であるfor-loopを使用します。

どうやっ
def do_four(f,x): 
    for _ in range(2): 
     do_twice(f, x) 
関連する問題