『Python入門』print関数の引数でセパレータ 改行 出力先をコントロール

Python プログラミング Python

ここではPython 3.7.5 ドキュメントを基に、print関数が持つ引数について解説し、実際にコードを書きながら理解していきましょう。

確認に使用した環境:
Windows10
Python 3.7.4

ちなみにPython2ではprint文でしたが、Python3からprint関数となり、オプションとして幾つかの引数が追加されました。

print関数の引数について「Python 3.7.5 ドキュメント」には以下のように記述されています。

引用:[公式]Pythonドキュメント

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
objects を sep で区切りながらテキストストリーム file に表示し、最後に end を表示します。sep 、 end 、 file 、 flush を与える場合、キーワード引数として与える必要があります。

キーワードなしの引数はすべて、 str() がするように文字列に変換され、 sep で区切られながらストリームに書き出され、最後に end が続きます。 sep と end の両方とも、文字列でなければなりません。これらを None にすると、デフォルトの値が使われます。 objects が与えられなければ、 print() は end だけを書き出します。

file 引数は、 write(string) メソッドを持つオブジェクトでなければなりません。指定されないか、 None である場合、 sys.stdout が使われます。表示される引数は全てテキスト文字列に変換されますから、 print() はバイナリモードファイルオブジェクトには使用できません。代わりに file.write(...) を使ってください。

出力がバッファ化されるかどうかは通常 file で決まりますが、flush キーワード引数が真ならストリームは強制的にフラッシュされます。

バージョン 3.3 で変更: キーワード引数 flush が追加されました。

 

print関数の引数の種類

print関数には以下の引数が用意されています。

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
objects:
出力対象のオブジェクト。
複数指定できる。
sep:
objects を複数渡した場合のセパレータ(区切り文字)。
デフォルトは半角スペース。
end:
objectsの最後に付けられる文字。
デフォルトは改行コード("\n")
file:
objectsの出力先。
デフォルトは標準出力。(指定無しまたは、file=None)
flush:
通常、標準出力またファイルへの出力はバッファリングされ、改行されることで出力の処理が行われます。
これは、出力処理がプログラムの実行と比べて遥かに重いため、バッファリングすることで速度の差を緩和するためでもあります。
フラッシュはバッファリングされたデータを強制的に出力することができます。
デフォルトはFalseです。Trueを指定することでフラッシュされます。

 

print関数の引数の機能を実動作で確認

print関数には5つの引数があります。実際にコードを書いてそれぞれの引数の機能を確認してみましょう。

Pythonのインストールがまだの場合は以下の記事を参考にインストールしましょう。

Python3をインストールして開発環境の準備(Windows10)
ここではPython3をダウンロードしてインストールを行い、実際にインストールできているかの確認をするまでの流れを記載します。 対象のPCの環境はWidnows 10 (64ビット) になります。

 

「objects」としていろいろなデータを出力

objectsには読んで字のごとくオブジェクトを指定します。

オブジェクトとは「データを抽象的に表したもの」で、Pythonで書いたプログラムが操作したり、処理したりするデータのことです。

つまり、objectsには文字列、数値、リスト、辞書といったデータを指定することができます。

数値をオブジェクトとして指定した場合は、str()で指定したかのように自動で文字列に変換して出力されます。

また、カンマで区切ることでオブジェクトを複数指定できます。

objectsについては別の記事でも触れていきます。

 

「sep」で複数指定したオブジェクト間の区切り文字を指定

sepを指定しない場合は、オブジェクト間のセパレータ(区切り文字)は半角スペースとなります。sepを指定することでセパレータを無くしたり、好きな文字列で区切ることができます。

 

「end」で改行を無くす

endを指定しない場合は、オブジェクトの末尾には改行コード('\n')が付きます。

endを指定することでオブジェクトの末尾の改行コードをコントロールできます。

endには文字列を指定する必要があり、改行コードを無くしたい場合は空文字('')を指定します。

 

「file」を指定して出力先を標準出力からファイル出力に変える

fileを指定しない場合は、出力先は標準出力となります。

fileを指定することで指定したオブジェクトへの出力ができます。

ここではファイル出力をするためにファイルオブジェクトを指定します。

出力結果は2行目でopen関数に指定したパスにファイルとして保存されます。

 

「flush」でバッファリングされたデータを強制的に出力

flushを指定しない場合、バッファリングされたデータは改行コードにより出力されます。

flushを指定することで、バッファリングされたデータを強制的に出力することができます。

以下を実行した場合、普通の出力結果に見えますが、データサイズが大きいほど出力に差が出ます。

 

以下はループを抜ける改行コードをバッファリングするコードになります。通常では、ループ後にバッファリングされたデータをまとめて出力しますが、flushにTrueを指定することで「0.5秒間隔で10回、"*"」を強制的に出力されるのが分かるかと思います。

 

引数に何も指定しなとendのデフォルトが機能する

print関数に何も指定しないことができます。
その場合、改行のみが行われます。これはendのデフォルトである改行コードのみがバッファリングされるため、空で改行されます。

 

まとめ

print関数の引数を使うことでいろいろな制約から解放され、柔軟な出力が可能になりました。公式のドキュメントを読むことで知らなかった仕様を確認できます。最初は難しくて読んでも理解できないかと思います。
まずはprint関数のような簡単な仕様のリファレンスから馴らしていくよ良いかと思います。

 

タイトルとURLをコピーしました