http://www.lifewithpython.com/2014/09/python-use-closures.html?m=1www.lifewithpython.com
今までは「関数吐く関数やろ?」くらいにしか思ってなかったんだけど、データ保持できるのみてホゲエ~ってなった(フィボナッチのやつ)。
しゅごいな~しゅごいな~と思って、色々考えてたんですが、実質 コーラブルインスタンス吐くクラスの簡単定義バージョン なんですかね。
イテレータの実装のためにクラス定義書かずにジェネレータ関数作るので済ましちゃう~みたいなのとパラレルみを感じる…。
ジェネレータもクロージャも、関数が関数「オブジェクト」なのを利用して、なんか内部であんなことやこんなことしてるのかな(えっち!)
どっちも内部状態をもった関数だし、「関数もオブジェクト」というのを特徴づけるいい例ですね。
ただ簡単定義バージョンと呼んだだけあって、ある程度凝ったことするならクラス定義書いたほうが簡潔でいいと思った。たとえば、クロージャは自然にはリターンする関数内部からクロージャ変数の参照先を変えることはできない(nonlocal を使えば python3 ではできるようになったらしいけど)ので、そういうことしたい子はクラス書きましょうってことかもしれない。
ちなみにクロージャのことを調べるはめになったのは、「形容詞とか動詞とか、まあいわゆる述語って、結局はコーラブルなオブジェクトじゃないの…?ってことはやっぱりクラスさえあればええやんけ!でもクロージャってあったな、もしかしてあれもなんかそれっぽいやつか?」って感じです