Python3の復習(ジェネレータ)
こんにちは。
かにたまごです。
今回は
- ジェネレータ
について、復習していきたいと思います。
今までのPython3 復習履歴は以下の通り。
ジェネレータ
ジェネレータとは、シーケンスを作成するオブジェクト。
リストとは違い全ての値をメモリに格納しないため、メモリに優しい。
また、最後に呼び出された場所を記憶しているという特徴もある。
- ジェネレータ内包表記
ジェネレータを簡単に、かつ短く書くことができる。
gen = (str(num)+"番目" for num in range(1000)) for i in gen: print(i) 出力 -> 0番目 1番目 2番目 3番目 (999まで)
- ジェネレータ関数
ジェネレータ内包表記で書くには大きすぎる場合、ジェネレータ関数で書く。
#ステップ数をかけていき、ストップ値以上になると処理が終わる def my_gen(start, stop, step): num = start while num < stop: yield num num *= step
普通の関数と違う点は、returnではなくyieldで値を返しているところ。
yieldとは、処理をストップしその時点での値を返す機能のこと。
つまり、関数が実行される度にyield文で値が返され、最後に返された値が更新されていく。
ジェネレータを生成方法は普通の関数と同じ。
なんかクラスのインスタンスを作ってるみたい。
gen_obj = my_gen(1, 1000, 5)
値の取り出し方は3通りかな?
ジェネレータオブジェクトが持つ__next__()を使用する。
val1 = gen_obj.__next__() print(val1) 出力 -> 1
組み込み関数のnext()を使用する。
val2 = next(gen_obj) print(val2) 出力 -> 5
for文を使用する。
for val in gen_obj: print(val) 出力 -> 25 125 625
メモリの節約と逐次処理ってのがジェネレータの特徴なのかぁ・・・。
いつか「バリバリ ジェネレータ使ってます(`・ω・´)」みたいな状態になりたい。
以上です。