rikudelicious
@rikudelicious

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Python 3.11 ジェネレータ関数内でprint関数を使っても標準出力されない

Q&A

Closed

質問を見ていただきありがとうございます。

解決したいこと

題意の通りです。
「該当するソースコード」のsample_generator()関数を実行しても、
print関数を実行している箇所が標準出力されません。
これを標準出力されるように修正したいです。

以下の可能性を考えましたが、自分では解決方法を見つけられませんでした。

  • ジェネレータ関数内で標準出力するには何らかの回避策が必要
  • print関数に問題があるので別の関数を使う
  • 自分の実行環境に何らかの原因がある

当方初心者のため、知識に不足しているところがあるかもしれません。
もし分かる方がいらっしゃいましたら、教えていただきたいです。
何卒よろしくお願いいたします。

該当するソースコード

code.py

def sample_generator():
    print('code before yield "a"')
    yield "a"
    print('code before yield "b"')
    yield "b"
    print('code before yield "c"')
    yield "c"
    print("code after yields")


def sample():
    """
    こちらは標準出力される。
    """
    print('hogehoge')

if __name__ == "__main__":
    sample_generator()
    sample_generator()
    sample_generator()
    sample_generator()
    sample()

ターミナルから実行した結果

$ python code.py
hogehoge

実行環境

OS: WSL2 Ubuntu
Python: pyenvでインストールしたpython 3.11で作成した仮想環境(Python 3.11.1)

0

3Answer

ジェネレータはインスタンスとして持っておかなければなりません.

for g in sample_generator():
    print(g)

もしくは

g = sample_generator()
print(next(g))

前者は全て出力し,後者は"a"まで出力されます.nextで呼び出すまで実行されない,のがyieldの利点です.

1Like

@PondVillege
ありがとうございます。
ジェネレーター関数についての理解が不足しており、
呼び出せば関数内の処理が実行されるものと勘違いしていました。
解決方法がわかったのでクローズします。

0Like

Your answer might help someone💌