#目次
1.はじめに
2.関数内関数を理解する
3.クロージャを理解する
4.まとめ
1.はじめに
pythonを勉強していくと関数に苦手に感じるのではないでしょうか。(本人初学者)個人的に関数を理解していく上で、特にややこしく感じた「クロージャ」についてまとめたいと思います。
2.関数内関数を理解する
関数について勉強していくと、必ず目にする「関数内関数」を少しまとめてみる。
def outer():
a = 1
def inner():
return a + 1
return inner()
print(outer())
<<< 2
outer()で定義された引数に、inner()で追加で新しい機能(処理)を定義し、returnでその機能をouter()に返している。
3.クロージャを理解する
上記とは少し異なるコードを書いてみました。
def outer():
a = 1
def inner():
return a + 1
return inner
print(outer())
違う点は、outer関数の戻り値がinner()ではなく、innerであること。つまり、括弧が外れた状態でouter関数に返している点です。この場合の出力結果は以下になります。
<<< <function outer.<locals>.inner at 0x7c6dc7b79e10>
これが意味するのはinner関数の実行結果ではなく、inner関数そのものを返しているという事です。つまりinner関数は実行されていない状態です。
aはローカル変数といい、outer関数内でのみ使用できる変数で、その範囲(スコープ)外では使えないです。しかし、inner関数内でaを呼び新しくa+1と定義しています。
つまり、クロージャとは外側の変数を記憶する関数といえます。
def outer(a):
def inner():
return a + 1
return inner
c = outer(4)
d = outer(7)
print(c())
print(d())
<<< 5
<<< 8
また、関数を変数に代入することによりその変数が関数の処理機能を持ちます。
上記のコードでは、c,dはそれぞれouter関数の機能を持っていることが出力結果から確認できます。
クロージャの使い方としては、デコレータなど使い方があるようです。
機械学習モデルなどの処理時間を計測するデコレータは便利だなと思いました。
Pythonのデコレータを理解するための12Step
4.まとめ
以上python初学者がクロージャについてゆるくまとめてみました。クロージャについて勉強したことにより、関数の理解度は以前よりも上がったと思っております。これからも頑張っていこうと思います。