Pythonのprint関数でendを指定した場合のループ処理で、sleep関数と合わせるとまとめて出力されてしまう件について
Pythonでプログラミングしてこの動画のような出力になるようにしたのですが、そのときにややprint関数の動作が分からなかった点についてまとめておきます。
上の動画で何をしているのかというと、大雑把に言うと与えた文字列から1文字ずつ端末画面に出力するという処理をしています。基本の処理自体は単純で、1つの変数に全ての文章を収めて、それをループ処理で1文字ずつ出力しています。そして文章を流れるように出力するために、1文字出力するごとにコンマ数秒置くという処理をしています(timeモジュールのsleep関数を利用)。
さて、問題はそこのループ処理とコンマ数秒の処理待ちの部分。
まず、print関数で1文字出力すると改行も一緒にされてしまうので、改行を出力させないよう
とendというオプションを与えています。
改行と一緒に出力する際は問題なかったのですが、endオプションを付けるとなぜか1文字ずつ出力がされず、しばらく待つと一度に全ての文字列が一緒に出力されてしまいました。
おそらくprint関数の出力がどこかしらにバッファされて、ループが終了したときに一度に吐き出されているようです。
で、あれこれ調べてみたのですが、print関数でその都度出力させるにはflushオプションを使えばいいということが分かりました。
簡単に書くと以下のようになります。
こうすることで、想定通りの出力が出来るようになりました。めでたしめでたし。
Amazon Python関連書籍など
上の動画で何をしているのかというと、大雑把に言うと与えた文字列から1文字ずつ端末画面に出力するという処理をしています。基本の処理自体は単純で、1つの変数に全ての文章を収めて、それをループ処理で1文字ずつ出力しています。そして文章を流れるように出力するために、1文字出力するごとにコンマ数秒置くという処理をしています(timeモジュールのsleep関数を利用)。
さて、問題はそこのループ処理とコンマ数秒の処理待ちの部分。
まず、print関数で1文字出力すると改行も一緒にされてしまうので、改行を出力させないよう
print(t1[i], end="")
とendというオプションを与えています。
改行と一緒に出力する際は問題なかったのですが、endオプションを付けるとなぜか1文字ずつ出力がされず、しばらく待つと一度に全ての文字列が一緒に出力されてしまいました。
おそらくprint関数の出力がどこかしらにバッファされて、ループが終了したときに一度に吐き出されているようです。
で、あれこれ調べてみたのですが、print関数でその都度出力させるにはflushオプションを使えばいいということが分かりました。
簡単に書くと以下のようになります。
print(t1[i], end="", flush=True)
こうすることで、想定通りの出力が出来るようになりました。めでたしめでたし。
Amazon Python関連書籍など
コメント
コメントを投稿