• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar
  • Skip to footer

AI活用エンジニアへの道

生成AI時代のエンジニアの生き方を考えるメディア(作成途中)

  • コラム
  • 生成AI
  • プログラミング
    • Python入門
    • Flask入門
    • Django入門
  • プロフィール
Home / プログラミング / Python / Pythonのジェネレータ関数、サブジェネレータの使い方についてまとめました

Pythonのジェネレータ関数、サブジェネレータの使い方についてまとめました

1 ジェネレータ関数の使い方
2 ジェネレータの持っているメソッド
3 サブジェネレータ関数の使い方
4 関連記事

ジェネレータ関数の使い方

pythonのジェネレータ関数は、以下のように関数の中にyieldを記載する

def func():
  yield 〇〇

  • ジェネレータ関数を宣言して実行すると、yieldの部分で処理がストップし、yieldの〇〇に記載された値が呼び出し元に返される
  • その後、再度ジェネレータ関数を呼び出すと、yieldの部分から処理がスタートし、yieldの部分でストップする
  • プログラムが終了するまで、何度もジェネレータ関数を呼び出すことができる(その度に、yieldからスタート、yieldで終了する)

  • ジェネレータ関数の宣言
#ジェネレータ関数の宣言
def generator(max):
    print("generater created")
    n = 0
    while n < max:
        yield n # 呼び出し元にnを返し処理がストップ
        print("yield called")
        n += 1

gen = generator(10) # ジェネレータの作成、この時点では処理は走らない
a = next(gen) # generatorを呼び出す。「generator created」と表示され、yieldの部分で止まり、yeild nのn(この場合0)が値として返る
print(a) # 0と表示
a = next(gen) # generatorを呼び出す。yield部分からスタートし、「yield called」と表示、nを+1、yieldの部分で停止。n(この場合1)が返る
print(a) # 1と表示

また、以下のようにループさせるとジェネレータ関数を連続して、実行できる
  • for内でジェネレータ関数を利用する
def generator(max):
    n = 0
    while n < max:
        yield n
        n += 1

gen = generator(10)

for i in gen:
    print(i)
    # n < maxまで、0,1,2,3,4,5,6,7,8,9と表示

ジェネレータの持っているメソッド

また、ジェネレータには以下のメソッドがある

send() yieldで停止している箇所に値を送る
throw() 指定した例外が発生して処理が終了させる
close() ジェネレータを正常終了させる

  • send()を使用した例
def generator(max):
    n = 0
    while n < max:
        a = yield n
        print(a)
        n += 1

gen = generator(10)

next(gen)
gen.send(10) # yieldの部分に、sendを創出し、a = 10となり処理が進み、print(10)が実行され、10と表示

  • throw()を使用した例
def generator(max):
    n = 0
    while n < max:
        yield n
        n += 1

gen = generator(10)

for v in gen:
    print(v)
    if v > 2:
        gen.throw(ValueError("Invalid Value")) # ValueErrorを送出して処理を終了させる

  • close()を利用した例
def generator(max):
    n = 0
    while n < max:
        yield n
        n += 1

gen = generator(10)
next(gen)
next(gen)

gen.close() # close()をするとジェネレータ処理が強制終了し、generatorはStopIterationと表示されて利用できなくなる

サブジェネレータ関数の使い方

pythonでは、ジェネレータからジェネレータを呼び出すサブジェネレータという仕組みがある。
このとき、yield fromと記述して、ジェネレータからサブジェネレータを呼び出す。

  • ジェネレータからサブジェネレータを呼び出すとき、呼び出し先のサブジェネレータからさらに別のジェネレータを呼び出すときも同様。
  • 呼び出し先の最後にreturnを追加することで、呼び出し元に値を返すことができる。

使い方の詳細を以下に記述する

  • サブジェネレータの使用例
def sub_sub_gen(): # サブジェネレータのサブジェネレータ
    print("sub_sub_generatorを呼び出しました")
    c = yield "sub sub" # yieldの部分で、処理を止めて呼び出し元に値を返す
    print("c = {}".format(c))
    return "sub sub" # 呼び出し元にsub subを返す

def sub_gen(): # サブジェネレータ(ジェネレータから呼び出される)
    print("sub_generatorを呼び出しました")
    a = yield "sub"
    print("a = {}".format(a))
    b = yield from sub_sub_gen() # サブジェネレータを呼び出す。サブジェネレータのreturnの値がbに格納される
    print("b = {}".format(b))
    return "sub"

def generator():
    print("generatorを呼び出しました")
    sub = yield from sub_gen() # サブジェネレータを呼び出す。returnの値がsubに格納される

    yield sub

g = generator()
i = next(g) # gをyieldまで進める(yield from sub_gen() → yield "sub")
print("返り値 = {}".format(i))
i = g.send(100) # 100を送出して、yieldまで進める(yield from sub_sub_gen() → yield "sub sub" )
print("返り値 = {}".format(i))
i = g.send(200) # 100を送出して、yieldまで進める。(return "sub sub → return "sub" → yield sub)
print("返り値 = {}".format(i))

関連記事

Pythonの型ヒント:コレクション型とOptional型の使い方
Pythonの型ヒント:コレクション型とOptional型の…
Python型ヒントについて、変数と関数の引数と戻り値に付与する基本的な書き方について
Python型ヒントについて、変数と関数の引数と戻り値に付与…
【まとめ】よく使うLinuxのショートカット11選
【まとめ】よく使うLinuxのショートカット11選
覚えておくべきLinuxコマンド50選
覚えておくべきLinuxコマンド50選
FlaskでFormを用いてPOSTリクエストを行い、送信された値を取得する
FlaskでFormを用いてPOSTリクエストを行い、送信さ…
Flaskでabortを用いてHTTPException例外を強制的に発生させる
Flaskでabortを用いてHTTPException例外…

Primary Sidebar

人気記事

  • 1
    ITエンジニアとしてスキルを高めるためのUdemy講…
  • 2
    PyCharm,IntelliJのおすすめプラグイン一覧
  • no image 3
    Python未経験だが、フリーランスの案件に採用さ…
  • 4
    アメリカのシリコンバレーでプログラミングを無…

特集記事

  • 1
    Cursorの使用のポイントとコツ(コード補完、イ…
  • 2
    ITエンジニアとしてスキルを高めるためのUdemy講…

目次

1 ジェネレータ関数の使い方
2 ジェネレータの持っているメソッド
3 サブジェネレータ関数の使い方
4 関連記事
StartCode ロゴ
AI時代のエンジニアを最速で育てる
法人向けIT研修で即戦力を育成しています。詳しくはお問い合わせください。
▶ 詳細はこちら
Python講座
【Udemy】Python入門講座(0からPythonの基礎を体系的に学んで、生成AIでバイブコーディング)
受講生3000人ほどの人気講座。<strong>Pythonの基礎から生成AI活用</strong>...
詳細 ▶

Footer

利用規約