数弱の文系大学生によるブログです。

Python、Webデザイン関連の記事を投稿していけたらなと思っています。

備忘録的なブログなので、読みにくい文章だと思います。ご了承ください。

Python3の復習(ジェネレータ)

こんにちは。

かにたまごです。


今回は

  • ジェネレータ

について、復習していきたいと思います。


今までのPython3 復習履歴は以下の通り。

  1. 数値・文字列
  2. リスト・タプル
  3. 辞書・集合
  4. if文・while文・for文
  5. 内包表記
  6. 関数

ジェネレータ

ジェネレータとは、シーケンスを作成するオブジェクト。
リストとは違い全ての値をメモリに格納しないため、メモリに優しい。
また、最後に呼び出された場所を記憶しているという特徴もある。

  • ジェネレータ内包表記

ジェネレータを簡単に、かつ短く書くことができる。

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


メモリの節約と逐次処理ってのがジェネレータの特徴なのかぁ・・・。
いつか「バリバリ ジェネレータ使ってます(`・ω・´)」みたいな状態になりたい。


以上です。