徒然なるままに生活しない為の備忘録

地方国公立大のM1。物理専攻。思いついたこととか、日々の日記とか。

クロージャ?ジェネレータ?

今日は、Python3について本格的に勉強を進めた。
その際、クロージャやらジェネレータやら、難解な用語が出てきたので、復習の意味も込めて、ここにまとめることにする。

教科書:「入門Python3」

入門 Python 3

入門 Python 3

  • 作者: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…エラーを回避できる。しかしよくわからない。

今日やったこと

明日やりたいこと

  • 「入門Python3」の第5, 6章