Python / print() / 値を出力する関数
Pythonのprint()は値をテキストに変え、通常は標準出力へ書き込みます。複数の値の間に空白、最後に改行を加え、sep・end・file・flushで調整できます。表示した文章を返す関数ではなく、戻り値はNoneです。
基本出力と引用符
形式はprint(*objects, sep=' ', end='\n', file=None, flush=False)です。*objectsは複数の値を受け取れることを示します。fileの指定がなければ標準出力sys.stdoutを使い、通常はターミナルやIDEの実行欄に表示します。引数の規則はprint()の公式文書を参照してください。
Python 3を使います。各例のコード全体をUTF-8のprint_example.pyへ保存し、python print_example.py、環境によってはpython3で実行します。内容を置き換えて独立に試せます。
print("Hello")
print('Hello')
print("'Hello'")
print('"Hello"')
print("count", 3, True, None)
期待される出力:
Hello
Hello
'Hello'
"Hello"
count 3 True None
単引用符と二重引用符はいずれも文字列の区切りで、その境界は表示されません。引用符自体を表示するには別の種類で囲めます。複数引数なら数値と文字列を+で連結する必要もありません。引数なしのprint()は既定の改行だけを出力します。
sepは値の間、endは呼び出しの最後
sepは同じ呼び出しの引数間、endは最後の値の後に入ります。改行をなくすにはend=""、空白で次の出力とつなぐにはend=" "を使えます。
print("A", "B", sep="-", end=" | ")
print("C")
values = ["A", "B"]
print(values, sep="-")
print(*values, sep="-")
A-B | C
['A', 'B']
A-B
最初はA-B | まで書き、次のCと同じ行になります。リストを1引数にするとリストの表現が表示され、sepは内部の書式を変えません。項目を別々に渡すには*valuesで展開します。既定に戻すにはオプションを省略します。
書式と戻り値を区別する
小数桁数や文の配置には、まず文字列を作ります。次はf-stringの書式:.2fで小数点以下2桁を表示します。
price = 12.5
quantity = 3
message = f"Total: {price * quantity:.2f}"
result = print(message)
print(result)
Total: 37.50
None
文章を持つのはmessageで、resultにはNoneが入ります。計算結果を別のコードへ渡す関数ならreturnを使い、表示は呼び出し側で判断します。2桁表示は元の数値の精度を変更する処理とは別です。
fileでUTF-8テキストに書く
fileにはテキストを書けるファイルオブジェクトを渡します。この完全な例は一時フォルダー内のreport.txtを読み書きし、既存ファイルを上書きせず終了後に片付けます。追加パッケージは不要です。
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "report.txt"
with path.open("w", encoding="utf-8") as output:
print("Alpha", 10, file=output)
with path.open("a", encoding="utf-8") as output:
print("Beta", 20, file=output)
print(path.read_text(encoding="utf-8"), end="")
Alpha 10
Beta 20
"w"は新規書き込みで、既存ファイルの内容は消去します。"a"は追記です。with終了時にファイルを閉じ、最後のend=""でファイル由来の改行に追加しないようにしています。実際の保存先に応用する際は、パス・権限・モードとエンコーディングを確認します。
出力の取り込みとTypeError
StringIOはメモリ上のテキストファイルのように使えます。既存の出力関数を再利用するときにfile=outputを指定し、閉じる前にgetvalue()で取り出します。単に1文を作るだけならf-stringの方が直接的です。
from io import BytesIO, StringIO
with StringIO() as output:
print("A", "B", sep="-", file=output)
text = output.getvalue()
print(repr(text))
try:
print("A", "B", sep=1)
except TypeError:
print("TypeError: sep")
with BytesIO() as output:
try:
print("text", file=output)
except TypeError:
print("TypeError: binary stream")
'A-B\n'
TypeError: sep
TypeError: binary stream
repr()の\nは取り込まれた改行です。sepとendは文字列または既定値を示すNoneが必要で、数値は不正です。バイナリストリームのBytesIOもprint()のテキスト出力先にはできません。バイナリには必要な符号化とバイナリ書き込みAPIを使います。
改行なしの進捗表示とflush
出力はバッファーにたまってから渡される場合があります。改行しない進捗やファイル・パイプへの出力では、表示時点が想定と異なることがあります。flush=Trueは出力先にバッファーを空にするよう要求します。
for number in range(3):
print(number, end=" ", flush=True)
print("done")
0 1 2 done
最終的な文字列は上のとおりですが、更新時点はターミナル・IDE・出力先次第です。flushは改行追加や画面消去ではなく、ディスクへの永続保存も保証しません。通常は既定値を使い、途中の更新が必要な箇所で指定します。




