Pythonではクロージャーを簡単に使うことができます。
この記事の内容はコチラです
- クロージャーとは?
- Pythonのクロージャーの使い方
今回は、Pythonのクロージャーの使い方を説明します!
Python クロージャーの使い方
クロージャーとは
クロージャーとはわかるようなわからないような・・・簡単にいうとこんな感じです。
- 関数Aの中にある関数Bのこと(関数内関数)
- 関数Aのパラメータを関数Bが使う
- 関数Aは関数Bを返す
- 外から関数Aを使用すると、関数B型の変数を使用できる ※ここが重要
クロージャーをザックリいうとこんな感じですが、説明だけ読んでもよくわからないので、Pythonのクロージャーを具体的に使ってみましょう!
クロージャー構文
# 親関数 def 関数A(引数A) # 子関数 クロージャー def 関数B 引数Aを使う処理 return 関数B
# クロージャーを呼び出す クロージャー変数 = 関数A(引数A)
クロージャーのおもな使い方の構文です。関数Aの中にある関数Bがクロージャーです。
関数Aの戻り値は関数Bになります。この関数B型の変数を実行しても関数Aの値が引き継がれています。
具体的なPythonのクロージャーの使い方は次の例をみてください。
例1. クロージャーを使ってリストの平均を求める
クロージャー
# 親関数 def get_avg(lst): # 子関数 クロージャー def get_avg_min(min): for i in lst: if i >= min: sum += i cnt += 1 return sum / cnt return get_avg_min
親関数「get_avg」の中に子関数「get_avg_min」があります。子関数「get_avg_min」がクロージャーです。
親関数「get_avg」の引数「lst」を子関数「get_avg_min」で使用しました。引数「lst」はリスト型の配列です。親関数のリストを1つずつ取り出して平均を求めます。
子関数「get_avg_min」にも引数「min」があります。引数「min」は親関数の引数「lst」の下限値を決めます。引数「min」未満は無視します。
親関数「get_avg」の戻り値は子関数「get_avg_min」です。
つまりこの関数では、親関数に渡された配列の平均を子関数が求めますが、子関数で下限値以上という条件をつけています。
呼び出し側
# 親関数を実行してクロージャーを取得する avg = get_avg([3, 6, 9])
次は前述した関数を使います。
「3, 6, 9」という3つ要素をもつリストを関数「get_avg」に渡して実行しました。関数「get_avg」の戻り値「avg」は関数「get_avg_min」型、つまりクロージャー型です。
この戻り値のクロージャー変数「avg」が重要です!
# クロージャーを実行 avg_min = avg(0) print(avg_min) #[結果] 6
このクロージャー「avg」に対して「avg(0)」とすると、子関数「get_avg_min(0)」を実行したことになります。親関数の戻り値に引数を渡して実行すると子関数が実行されます。ここがポイントです。
「3, 6, 9」の平均で条件は0以上なので、結果は「6」となりました。
# クロージャーを実行 avg_min = avg(5) print(avg_min) #[結果] 7.5
次は引数を変えてみます。
「avg(5)」とすると、子関数「get_avg_min(5)」を実行したことになります。「3, 6, 9」の平均で条件は5以上なので、「6, 9」の平均となり、結果は「7.5」となりました。
これでクロージャー関数を使って平均を求めることができました。
Pythonのクロージャーの使い方を解説しました。
コメント
やっとクロージャー理解できました。わかりやすかったです。
でもどんな時に使うのか僕的にはイメージできませんでした。まだまだ勉強が足らないですね~
分かっていただいて何よりです。