コールバック関数、再帰関数
コールバック関数
コールバック関数と呼ばれるコールバック関数は、追加の機能を実行するための引数として渡された関数を指します。関数Bへのパラメータとして渡さ例えば関数、関数は、次にBの関数で行われます。このアプローチの利点は、あなたが(機能として利用可能)が提供する他のプログラムのための関数が定義される前に、関数、またはAPI呼び出しを使用することができるということです。より抽象的な概念、以下の例を見て:
def func(num,fun):
fun(num)
def f1(x):
print("这是f1函数",x)
def f2(x):
print("这是f2函数",x)
func(1,f1)
func("hello",f2)
結果
这是f1函数 1
这是f2函数 hello
図は、3つのメモリアドレスの関数である、のは、最初の関数呼び出しを実行し始めましょう
まず、別の関数の変数に渡すの位置パラメータは、メモリアドレスだけで定義された関数f1で= 1楽しい= F1関数メモリアドレス、その場合NUMには、その後、印刷を達成するためにダウンを実行します 这是f1函数 1
再帰関数
関数内、あなたは他の関数を呼び出すことができます。関数が自分自身の中に自分自身を呼び出す場合は、この関数は再帰関数で、次の例では、自分自身を呼び出すことです。
#例子1
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
以下のコードを実行します
#例子2
def func(num):
print(num)
if num > 0:
func(num -1)
else:
print('--------')
return num
res = func(3)
print(res)
各関数呼び出しは、あまりにも多くのメモリの問題を取り上げるの名前空間を作成し、あなたはそれを呼び出すようになっている場合は、それ自身の名前空間を持つことになります。
裁判官が何の外に、この時間を返すために始めたとき、彼はそれを返すでしょうか?
FUNC(1-1)は次のリターン何返してきましたか?
次は、FUNC(2-1)リターンFUNC(3-1)(3)最終結果リターンFUNCで戻ります
ここで少しモンゴル、考えて、ほとんどの人が最初の事を中断し、物事を行うことを信じて、実行する2つ目は手配し、彼らは物事を忘れるために最初に従いますで、第二のことを行うための時間を、中断された場合、これは......最初のメンバーは、フォローアップの事の第二のメンバーは忘れてやってます、第三のことを行うために予定されています再帰関数は、その理由を理解していません。
ここで再び例3
def age(n):
if n == 1:
return 40
else:
return age(n-1)+2
print(age(4))
上記のコードを実行するプロセスの詳細
関数自体を呼び出す場合、コードは後に終了しますが、待機状態ではないコードの実行後に、再度、Falseで、同じカラープリント()関数のステートメントは、対応する色を待ちます。
Starting var:.. n = 4
23:14:57.157933 call 4 def age(n):
23:14:57.157933 line 5 if n == 1:
23:14:57.157933 line 8 return age(n-1)+2
Starting var:.. n = 3
23:14:57.157933 call 4 def age(n):
23:14:57.157933 line 5 if n == 1:
23:14:57.157933 line 8 return age(n-1)+2
Starting var:.. n = 2
23:14:57.157933 call 4 def age(n):
23:14:57.158934 line 5 if n == 1:
23:14:57.158934 line 8 return age(n-1)+2
Starting var:.. n = 1
23:14:57.158934 call 4 def age(n):
23:14:57.158934 line 5 if n == 1:
23:14:57.158934 line 6 return 40
23:14:57.158934 return 6 return 40
Return value:.. 40
23:14:57.158934 return 8 return age(n-1)+2
Return value:.. 42
23:14:57.158934 return 8 return age(n-1)+2
Return value:.. 44
23:14:57.158934 return 8 return age(n-1)+2
Return value:.. 46
上記プロセスは、N = 1は、年齢40の戻り直接メモリ内のこの時間は、(1)生じ参照。ここでは、その時代最後の事(2-1)2に第二終了します。メモリは今の年齢を持っている(1)= 40、そして年齢(1)+ 2 =年齢(2)= 42、年齢(2)ので、メモリ内に存在しています!
年齢(3-1)+ 2 =年齢(3)= 44
歳(4-1)+ 2 =年齢(4)= 46
戻り値は、最後の46です
エラーコードが実行された後、実施例1が表示されます
再帰的な関数を使用して、スタックオーバーフローを避けるために注意する必要があります。コンピュータでは、関数呼び出しが、このデータ構造スタック(スタック)を介して達成されるたびにスタックへの関数呼び出しスタックフレームが1だけ増加され、各時間関数戻り、スタックは、一つのスタックフレームを減少します。スタックのサイズは無制限ではないので、あまりにも再帰呼び出しの数は、スタックオーバーフローを引き起こす可能性があります。問題は、再帰的な層997が解決しないのであれば、この現象を停止するPythonのためには、997で制御の再帰的な層を強制的に、あなたはまた、デフォルトの再帰の深さを変更することができますいずれかの解決に使用再帰には適していません。