ジェネレータ
イテラブルなオブジェクトの一種
for文などと同じように値を1個ずつ取り出すことができるが、あらかじめ複数の値を格納しておくのではなく、
値を要求されるたびに1個ずつ生成することが特徴
generator.py
# 書き方
式 for 変数 in イテラブル
# 1から9までの値で二乗した数値を出力
print((x*x for x in range(1,10)))
実行結果
<generator object <genexpr> at 0x000001CA4331F1D0>
このようにジェネレータ式はジェネレータ(ジェネレータオブジェクト) を出力する
ということでジェネレータを出力する形に書き換える
generator.py
# 1から9までの値で二乗した数値を出力
for y in (x*x for x in range(1,10)):
print(y,end=' ')
実行結果
1 4 9 16 25 36 49 64 81
ジェネレータを使うメリット
消費メモリが少ないので処理速度が上がるという点でメリットがある
そのため多数の繰り返し処理を行う際には通常の内包表記ではなく、ジェネレータを使うメリットがある
ジェネレータ関数とyield文
ジェネレータ関数を使うことでより通常の関数のような表記が出来る
yield文は通常の関数のreturnと同様
generator.py
# 1から9までの値で二乗した数値を出力
def g():
for x in range(1,10):
yield x*x
print(g())
実行結果
<generator object g at 0x000001840D6DF1D0>
ジェネレータが生成されていることがわかる
generator.py
# 1から9までの値で二乗した数値を出力
def g():
for x in range(1,10):
yield x*x
for y in g():
print(y,end=' ')
実行結果
1 4 9 16 25 36 49 64 81
上記同様に出力できた
yield from文
yield from文を使用することで指定したジェネレータに値を返すことができる
開始値から始めて値を1ずつ増加させながら「終了値-1」までの整数を生成する関数(my_range)と
開始値から「終了値-1」までの整数を生成する動作を指定した回数だけ繰り返す関数(my_range2)を作る
generator.py
def my_range(start,stop):
x = start
while x < stop:
yield x
x += 1
def my_range2(start,stop,count):
for i in range(count):
yield from my_range(start,stop)
for y in my_range2(1,10,3):
print(y,end=' ')
実行結果
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9