「pythonを勉強していたらクロージャというよくわからない言葉が出てきて困っている」
「クロージャってどうやって使うの?」
このようなお悩みを抱えている方は多いのではないでしょうか?
実際私も初めて見た時はどういった機能があるのか見当もつきませんでした。
しかし勉強してみるとそこまで難しいものでなく、他のプログラミング言語では意識せずに使用していた機能でした。
今回はそんなクロージャについて解説していきます。
内部関数とは何なのか?
まずクロージャなどを解説する前に内部関数について簡単に解説しておきます。
名前からもわかると思いますが、内部関数とは下記のように関数の中に関数を定義したものとなります。
【コード】
def out_function():
a=10
def in_function():
return a+5
return in_function()
print(out_function())
【実行結果】
15
因みに関数へアクセスする際は「関数名()」でアクセスが可能です。
クロージャとは何なのか?
ではクロージャについて解説していきます。
クロージャとは関数内で生成された関数で、外側の関数で生成された変数や受け取った引数なども使用することができるものです。
先ほど記載した内部関数を少し改良するとクロージャとなります。
【コード】
def out_function():
a=10
def in_function():
return a+5
return in_function
print(out_function())
【実行結果】
<function out_function.<locals>.in_function at 0x00000290C0E6CEA0>
先ほどはreturnで「in_function()」と記載していましたが、上記では「in_function」となっています。
そして実行結果も先ほどは「a+5」の解として15が出力されていましたが、今回は「<function out_function.<locals>.in_function at 0x00000290C0E6CEA0>」などとよくわからない文字が出力されます。
これは関数内で処理された値でなく、関数自身と思っていただきたいです。
上記コードを実行することで関数を識別するための値が出力されます。
つまり下記のようにout_functionの存在を変数bに代入して、変数cにはin_functionの存在を代入しています。
そしてprint関数で変数cに括弧をつけることでin_function関数を実施することができるようになり、問題なく値が出力されました。
【コード】
def out_function():
a=10
def in_function():
return a+5
return in_function
b=out_function
c=b()
print(c())
【実行結果】
15
因みに余談ですが、上記コードのようにクロージャを内包しているout_functionはエンクロージャと言います。
まとめ
この記事ではpythonのクロージャについて解説してきました。
- 内部関数とは何なのか?
- クロージャとは何なのか?
今回紹介しましたクロージャは外側の関数で作成した変数や引数の値を記憶しておく関数の事となっています。
プログラムを勉強していると聞いたこともない言葉が時々出てきます。
しかしそういった言葉はただ単に難しい言葉を使っているだけで、一度理解してしまえば忘れることはほぼないものとなっています。
なので一度は我慢して勉強することをオススメします。
以上で今回の解説は終了となります。
コメント