本サイトは広告・プロモーションが含まれています
Python

【Python】関数内関数とクロージャー

どうもこんにちは、コンです。
以前ご紹介させていただいた、コールバック関数と高階関数の記事が少し反応が多かったため
今回は関数内関数とクロージャーについて紹介させていただきます。

この記事はこんな人におすすめ

・関数内関数って何??クロージャーって何??って質問されて答えられない方
・Pythonのコードの書き方の幅を増やしたい方
など

関数内関数

関数内関数は文字の通り、関数の中で使う関数のことです。
実際に例を出してみます。

これはouter_fn関数の中の、inner_fn関数が実行されている例になります。
時効されている順番は下記の図のような感じです。

この関数の中で関数を実行する事を少し応用したものがクロージャーです。

クロージャー


クロージャーと聞いて意味がわからないと思う方が多いと思うのですが
大切なイメージとして持っていてもらいたいのはPythonの関数は()で閉じて実行される。ということです。

例その1

()で閉じることがクローズ(クロージャー)なんだというイメージで下のコードを読んでください。

このコードはほとんど、関数内関数と同じなのですが7行目のinner_fnの最後に
()をつけておりません。
これによって、関数が実行されていない状態で保持されていることになります。

つまり、11行目の関数呼び出しで引数は記憶した状態でいて、13行目のf()で実行されるイメージです。

このクロージャーはよく様々な初期値を設定した上で関数を実行するようなときに使われるそうです。

例その2

次は円の面積を計算する問題について書いていきます。

円の面積は円周率πを使って半径*半径*πで計算するのですが、このπの小数点いくつまで使うか
検討するコードになります。

これは8~10行目でπの値をそれぞれouter関数に渡して
13~15行目で半径の値を入れて実行しています。

このようにクロージャを使うことによって、ある状態を保持したまま、違う処理を実行することができるようになります。

おわりに

ここまで読んでいただき、ありがとうございます。

Pythonを初めてから8年たったのですが
こうした基本的なところも、あまり意識せずに仕事で使うようになってしまったため
時々本当に8年もやっていたのか、自分で自分を疑ってしまうようになっております(ははは。。。)

この記事が何か参考になれば嬉しいです。

また記事内で使っているTrinketについても記事がありますので
参考にしてもらえればと思います。

それでは。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA