yield【ジェネレータ関数・一時停止】3.8
yield【ジェネレータ関数・一時停止】3.8
メモ 構文 例
メモ
- ジェネレータ関数
- def【関数定義】で yield を使用するとジェネレータ関数
yield で一時停止
return で終了 - 下記で値を取得 (範囲超過は StopIteration 例外) 〔 例 〕
__next__() メソッド
for-in【for ループ】
組み込み関数の next() - send() で値の設定が可能 〔 例 〕
通常の処理は None を設定 - yield from を使用するとジェネレータ関数を複数のサブジェネレータ に分割することが可能 〔 例 〕
- list【リスト型】・tuple【タプル型】等をアンパックで展開時に、 タプルのカッコは省略可 3.8 〔 例 〕
- def【関数定義】で yield を使用するとジェネレータ関数
- 関連
- 外部リンク
構文
yield 戻り値 (複数:カンマ区切り) [,]
(yield 戻り値 (複数:カンマ区切り) [,])
yield from サブジェネレータ 3.3
(yield from サブジェネレータ) 3.3
例
# 値の取得
def generator_1(x):
for i in range(x):
yield i * 3 # 0 -> 3 -> 6 -> 9 -> ...
# __next__()
gen = generator_1(4)
print(gen.__next__())
# 出力:0
print(gen.__next__())
# 出力:
print(gen.__next__())
# 出力:
print(gen.__next__())
# 出力:9
#print(gen.__next__()) # StopIteration
# for-in
for i in generator_1(4):
print(i)
# 出力:0
# 出力:3
# 出力:6
# 出力:9
# next()
gen = generator_1(4)
print(next(gen))
# 出力:0
print(next(gen))
# 出力:3
print(next(gen))
# 出力:6
print(next(gen))
# 出力:9
#print(next(gen)) # StopIteration
# 値の設定
def generator_send():
i = 0
while True:
val = (yield i)
if val is not None:
i = val
else:
i += 1
gen_send = generator_send()
print(next(gen_send))
# 出力:0
print(next(gen_send))
# 出力:1
print(gen_send.send(5))
# 出力:5
print(next(gen_send))
# 出力:6
print(next(gen_send))
# 出力:7
# サブジェネレータ
def generator_2(x, y):
for i in range(y):
yield i * x # 0 -> x -> 2x -> 3x -> ...
def generator_from(g1, g2):
print("yield from g1")
yield from g1
print("yield from g2")
yield from g2
gen1 = generator_2(2, 4) # 0 -> 2 -> 4 -> 6
gen2 = generator_2(3, 4) # 0 -> 3 -> 6 -> 9
for g in generator_from(gen1, gen2):
print(g)
# 出力:yield from g1
# 出力:0
# 出力:2
# 出力:4
# 出力:6
# 出力:yield from g2
# 出力:0
# 出力:3
# 出力:6
# 出力:9
# アンパック
def generator_unpack(x):
for i in range(x):
lst = [i+1, i+2, i+3]
yield (i, *lst)
# Python 3.8
def generator_unpack_3_8(x):
for i in range(x):
lst = [i+1, i+2, i+3]
yield i, *lst
for tpl in generator_unpack(4):
print(tpl)
# 出力:(0, 1, 2, 3)
# 出力:(1, 2, 3, 4)
# 出力:(2, 3, 4, 5)
# 出力:(3, 4, 5, 6)
# Python 3.8
for tpl in generator_unpack_3_8(4):
print(tpl)
# 出力:(0, 1, 2, 3)
# 出力:(1, 2, 3, 4)
# 出力:(2, 3, 4, 5)
# 出力:(3, 4, 5, 6)