yield【ジェネレータ関数・一時停止】3.8yield【ジェネレータ関数・一時停止】3.8メモ 構文 例 メモジェネレータ関数 def【関数定義】で yield を使用するとジェネレータ関数yield で一時停止return で終了 下記で値を取得 (範囲超過は StopIteration 例外) 〔 例 〕__next__() メソッドfor-in【for ループ】組み込み関数の next() send() で値の設定が可能 〔 例 〕通常の処理は None を設定 yield from を使用するとジェネレータ関数を複数のサブジェネレータ に分割することが可能 〔 例 〕 list【リスト型】・tuple【タプル型】等をアンパックで展開時に、 タプルのカッコは省略可 3.8 〔 例 〕 関連 def【関数定義】 return【関数の戻り値】 外部リンク Python 言語リファレンスyield 文Yield 式return 文関数型プログラミング HOWTOジェネレータ (generator)What's New In Python 3.3PEP 380: サブジェネレータへの委譲構文 構文 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)