yield【ジェネレータ関数・一時停止】3.8

yield【ジェネレータ関数・一時停止】3.8

メモ

構文

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)