ちょっとクロージャの質問を受けたので、pythonでのクロージャ(関数閉方)の使い方を解説していきたいと思います。超初級の端っこレベルくらいでしょうか、クロージャとか使い始めると超初級から初級くらいにはステップアップしてるイメージです。
クロージャとは?
クロージャ(関数閉方)とは外側の変数を記憶した関数です。
とりあえずサンプルを1つ。
def tax_cal(tax_rate):
def total_invoice_cal(body):
return body * (1+tax_rate)
return total_invoice_cal
beforeInv =tax_cal(0.08)
afterInv = tax_cal(0.1)
inv1= beforeInv(100)
inv2= afterInv(100)
print(inv1, inv2)
肝となるのは、黄色アンダーラインをした部分です。関数実行をせずにinner関数を関数として返しています。
クロージャの動作の解説
さっくりいうと、以下のようになります。
Step1: エンクロージャを呼び出した段階では、インナー関数にエンクロージャの引数が渡された関数が返される
beforeInv =tax_cal(0.08) #total_invoice_calにtax_rate0.08が設定された関数が返る afterInv = tax_cal(0.1) #total_invoice_calにtax_rate0.1が設定された関数が返る
step2: インナー関数を呼び出して、実行した結果(return body * (1 + tax_rate))が返される
inv1= beforeInv(100) # 108.0 inv2= afterInv(100) #110.00000000000001
クロージャの用途
ようは一旦エンクロージャ(外部関数)だけ実施した段階の関数を複数保持(変数分岐)もしくはコードないの後の方で実行したいときに利用します。
Javascriptにもクロージャは存在しますよね、あっちの方がよく使われるのかなと思わなくもないです。
まとめ
使わなくてもコードをかけるケースももちろんありますが、シンプルなクロージャがあると読みやすく組み立てやすくなる場合もあります。さらには、クロージャにクロージャを重ねることもできたりしますが、過度にやりすぎると個人的には頭のメモリを使ってしまって逆に可読性が落ちるかなと思います。
でも、便利な方法なので、頭の片隅にでも入れておいていただければと思います。