
pythonジェネレータについて
今日も勉強した記録を残します。
今回はジェネレータについてです。
ジェネレータとはイテレーターを返す特殊な関数になります。
ジェネレータは繰り返し処理のタイミングに応じて結果を返すことが出来るのでメモリリソースの消費を抑えることが出来ます。
下記にコードを共有します。
def multipliter_v2(values):
"""2の乗数を返すジェネレータ"""
for i in values:
yield 2 ** i
values = [i for i in range(10)]
ret = multipliter_v2(values)
for i in ret:
print(i , end=' ') # 出力-> 1 2 4 8 16 32 64 128 256 512
2の乗数を返すジェネレータになります。
yield文は実行された時点の値を返し、その位置で一時停止の状態になり次の呼び出しを待ちます。
計算途中の状態を保持し、必要なデータを1つずつ返すことが出来るのでデータが大量になってもメモリリソースを消費することなく処理が出来ます。
次にnext関数についてです。
下記にコードを共有します。
def multipliter_v1():
"ジェネレーターでnext関数を使う"
num = 1
while True:
yield num # 結果を返して一時停止
num *= 2
gen = multipliter_v1()
print(next(gen)) # 出力-> 1
print(next(gen)) # 出力-> 2
next関数を使用するとジェネレータの実行、yield文が実行された位置から
処理を再開することが出来ます。
上記のコードはnext(gen)というコードを書くと無限に数列を呼び出す事が出来ます。
while文でyieldで返しているのでそこで処理は一時停止しています。
下記のコードは辞書の内包表記になります。
def sample2_v1():
"""辞書内包表記"""
num_dict = {i: i** 2 for i in range(5)} # 辞書内包表記
num_set = {i ** 2 % 10 for i in range(10)} # 集合内包表記
print(num_dict) # 出力 -> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
print(num_set) # 出力 -> {0, 1, 4, 5, 6, 9}
sample2_v1()
今回は以上になります。