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は改行追加や画面消去ではなく、ディスクへの永続保存も保証しません。通常は既定値を使い、途中の更新が必要な箇所で指定します。