クロージャ with Python

目的

クロージャの使いドコロがいまいち分からないけれど,動作が(設定パラメタなどで)異なる関数を生成する,という目的で使うのかな?他にはクラス変数っぽい役割で使っているような例があるけどどんな意味があるのか良くわからなかった.

補足説明

pythonの関数はクロージャ機能を持つ.つまり,グローバルスコープ以外で定義された関数は,定義された時の変数情報を記録する.定義された,というのが重要で宣言時じゃない.(また,pythonは普通に関数を引数にしたり,関数を返り値にしたりできる.)

サンプル

genc_funcが関数を生成するもので,funcはグローバルスコープじゃないので,定義時の関数情報を内包する.例では,funcの外側のgen_funcの引数aが記録される.よって,add1はa=1として関数を定義しているので,引数xに1を加える関数となり,add10はa=10は引数xに10を加える関数となる.

def gen_func(a):
    # 'a' is closed.
    def func(x):
        return x+a
    return func

add1 = gen_func(1)
add10 = gen_func(10)

print add1(0)  #=>1
print add10(0) #=>10