クロージャ?ジェネレータ?
今日は、Python3について本格的に勉強を進めた。
その際、クロージャやらジェネレータやら、難解な用語が出てきたので、復習の意味も込めて、ここにまとめることにする。
教科書:「入門Python3」
- 作者:Bill Lubanovic
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
クロージャ(関数閉方)
クロージャとは、関数内関数の機能の1つで、その関数より外側の変数を記憶したり、変更したりすることができる。
def func(): # これがエンクロージャ x = 5 def add(y): #これがクロージャ return y+x return add f = func() print(f(4))
xはfunc関数内で定義されたローカルな変数だが、クロージャを生成したことでxがadd関数内に記憶され、f(4)を呼び出した際にxが加算される、という仕組みになっている。
参考:
【Python】クロージャ(関数閉方)とは - Qiita
これ以上のことはよく分からなったし、正直これにどんなご利益があるかもわかっていない。今後の課題。
ジェネレータ
ジェネレータとは、シーケンス全体をメモリに格納するのではなく、その場その場の反復処理でシーケンスを生成するオブジェクトである。
普通、リストや辞書は全体がメモリに記憶されるが、そこまでメモリを確保できなかったり、最後まで取っておく必要がない場合は、こちらを使ったほうがいい場合もある。
また、通常の関数とは異なり、どこまでをジェネレートしたかを覚えているため、同じ命令をしても異なる挙動をみせることがある。
range()などは典型的なジェネレータである。
「入門Python3」では、range()を再現するコードが載っていた。
def my_range(first 0, last=10, step=1): number = first while number < last: yield number #returnではなくyieldするのがジェネレータ number += step
使用するには
ranger = my_range(1,5) for x in ranger(): print(x) #1 #2 #3 #4 #5
# もう1回処理してもなにも起こらない for x in ranger: print(x)
まあ、これについても、今の所使わなくて困っていないので、必要に迫られたら本格的に覚えようと思う。
その他覚えた便利なメソッド
- デコレータ…関数の挙動を制御することができる
- 内包表記…非常にPythonicな表記。リストなどの内部にfor文、if文を書くことによって簡単に要素を生成できる。
- tryとexpect…エラーを回避できる。しかしよくわからない。