Pythonの標準出力はとても手軽ですが、print()
が毎回改行してしまい、値を横に並べたいときや進捗を更新したいときに困ることがあります。
本記事では、初心者の方にも分かりやすいように、end=''
を使って改行を抑制する基本から、sep
との違い、上書き表示やフラッシュなどの実用テクニックまで、段階を踏んで丁寧に解説します。
Pythonのprint()はなぜ改行するか
デフォルト引数end=’\n’の意味
print()
は関数で、デフォルト引数により出力の挙動が決まります。
とくに行末の文字を決めるend
は既定で改行文字'\n'
になっているため、何も指定しないと1回のprint()
で1行ずつ出力されます。
# 何も指定していないprint()は、行末に改行('\n')を付けます
print("A")
print("B")
# これと同じ意味です
print("C", end="\n")
print("D", end="\n")
A
B
C
D
‘\n’の正体
改行文字'\n'
は「次の行に移る」制御文字です。
WindowsでもmacOSでもprint()
に渡すのは'\n'
で問題ありません。
コンソール側で環境に応じた改行に変換されて表示されます。
実はprint()は複数の値を受け取れる
print()
は複数の値をカンマ区切りで受け取り、間はsep
引数で区切られます。
これは後ほど詳しく説明しますが、まずは行末を制御するend
を理解しましょう。
改行を消すにはend=”にする
改行を消したい場合は、end=''
と空文字を指定します。
すると行末に何も付かないため、次のprint()
が同じ行の続きに出力されます。
# 行末に何も付けず、次のprint()を同じ行に続けます
print("Hello", end="") # 改行しない
print("World") # ここで初めて改行されます(デフォルトのend='\n')
HelloWorld
うっかり同じ行に出続ける問題
end=''
を使った後に改行を入れないままだと、以降の出力も同じ行に続いてしまいます。
意図した場所で明示的にprint()
を1回だけ呼んで改行を確定させるのがコツです。
end=”で改行しないprintの書き方
基本構文とコード例
print()
の主な引数は次のようになっています。
ここではend
だけ覚えれば十分です。
# print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
# 最低限 覚えるのは sep と end
基本的な使い方は次の通りです。
# 改行しない基本例
print("A", end="") # 改行しない
print("B", end="") # 改行しない
print("C") # ここで改行する(デフォルトend='\n')
ABC
よく使うendの値と効果
endに指定する値 | 効果の概要 |
---|---|
'\n' | 改行する(デフォルト) |
'' | 改行しないで続ける |
' ' | 行末にスペースを1つ入れる |
'\t' | 行末にタブを入れる |
'\r' | 行頭に戻る(同じ行を上書き、後述) |
上書き表示に使う'\r'
は少し特殊なので、専用のセクションで詳しく扱います。
end=”で連続出力する
文字を1つずつ同じ行に連続して出したい場面ではend=''
が活躍します。
# 文字を連続して出力
for ch in ["a", "b", "c", "d"]:
print(ch, end="") # 改行せずに連結
# 行を確定するための明示的な改行
print()
abcd
数値や記号も同様に連結できる
print()
はオブジェクトを文字列化して出力するため、数値でも同じ書き方で横並びにできます。
ループで番号を横に並べる
番号を横に並べ、間にはスペースを入れるのが実務でよくあるパターンです。
# 1から5までを半角スペース区切りで同じ行に出力
for i in range(1, 6):
print(i, end=" ") # 末尾にスペースを入れ、改行はしない
# 最後に改行を入れて行を確定
print()
1 2 3 4 5
最後の余分なスペースが気になる場合
見た目だけの問題ですが、最後のスペースを避けたい場合は、ループ内で条件分岐するか、sep
を使って一括で文字列化する方法もあります。
次章でsep
を扱います。
sepとendの違いを理解する
sepで値の区切りを調整する
sep
は複数の引数を渡したときの「値と値の間の区切り文字」です。
デフォルトは半角スペースです。
# 3つの値の間をハイフンでつなぐ
print("A", "B", "C", sep="-")
A-B-C
endで行末の文字を制御する
end
は「行の最後に付く文字」です。
次の出力が同じ行に続くか、改行されるかはここで決まります。
# 行末に感嘆符を付け、次のprintを同じ行に続ける
print("Hello", "Python", end="!")
print("続きです") # 同じ行に続いて表示される
Hello Python!続きです
sepとendを同時に指定する例
sep
とend
は同時に使えます。
値同士の区切りと行末の扱いを一度に明確にできます。
# 値はハイフンで区切り、行末にパイプを付ける
print(1, 2, 3, sep="-", end="|")
print("done") # 同じ行に続いて出る
1-2-3|done
役割の違いを一目で把握する
目的 | 使う引数 | 影響する場所 | 例 | 出力イメージ |
---|---|---|---|---|
値と値の区切りを変える | sep | 値の間 | print("A","B","C", sep=",") | A,B,C |
行の終わりを変える | end | 行末 | print("A","B", end="!") | A B! (改行なし) |
進捗表示や上書き表示のテクニック
end=’\r’で同じ行に上書き表示
キャリッジリターン'\r'
は「行頭に戻る」制御文字です。
これをend
に使うと、同じ行に出力を上書きして進捗表示などができます。
import time
# 進捗を同じ行で更新していく例
for pct in range(0, 101, 20):
# 行頭に戻して同じ場所へ上書き。flush=Trueで即時反映します
print(f"Progress: {pct:3d}%", end="\r", flush=True)
time.sleep(0.2)
# 最後に確定表示して改行
print("Progress: 100%")
Progress: 100%
WindowsやIDEでの注意点
'\r'
は一般的なターミナルで動作しますが、一部のIDEやログビューアでは意図通り上書きされず、すべての状態が縦に並んでしまうことがあります。
その場合は専用の進捗ライブラリを使うか、環境設定を見直すと良いです。
flush=Trueで即時出力する
print()
は通常バッファリングされ、改行が来るまで画面に出ないことがあります。
end=''
やend='\r'
を使って「改行しない」出力をする場合は、flush=True
を併用すると更新がすぐ反映されます。
import time
# flush=Falseだと環境によっては最後まで表示されないことがある
for i in range(3):
print(i, end=" ", flush=True) # 即時に出す
time.sleep(0.5)
# 行を整えるために改行
print()
0 1 2
sys.stdout.flush()でもOK
print(..., flush=True)
の代わりに、sys.stdout.write()
とsys.stdout.flush()
を使う方法もあります。
最後に改行を入れるベストプラクティス
改行しない出力を続けたあと、そのままだと次のプロンプトやログが同じ行に混ざります。
明示的に1回だけprint()
を呼んで改行する習慣をつけると読みやすさが保てます。
# 横並び出力のあとに改行を1回
for i in range(5):
print(i, end=" ")
print() # ここで行を確定
print("次の処理に進みます")
0 1 2 3 4
次の処理に進みます
まとめて文字列を作る選択肢
大量の値を横並びにするなら、join()
で文字列を作ってから一度だけprint()
する方法もあります。
処理が軽く、最後のスペース問題も避けられます。
# 最後に余分なスペースを入れずに出す一例
nums = [str(i) for i in range(1, 6)]
print(" ".join(nums)) # 1回のprintで改行も済む
1 2 3 4 5
まとめ
本記事では、print()
が自動で改行する理由と、その制御方法を丁寧に解説しました。
要点は次の通りです。
print()
は既定でend='\n'
のため改行します。
改行を抑えたいときはend=''
、横並びの可読性を上げたいときはend=' '
のように行末の文字を指定します。
複数値の間を調整したいときはsep
、行末を調整したいときはend
と役割を分けて使います。
進捗の上書き表示にはend='\r'
とflush=True
を併用し、最後にprint()
で改行して行を整えるのが実践的なベストプラクティスです。
これらを使い分ければ、出力は思い通りにコントロールできます。