【初心者向け】Python print format(f文字列・format・%)徹底解説

はい、承知いたしました。Python初心者向けに、print関数の文字列フォーマット、特にf文字列、.format()、および%演算子について、約5000語の詳細な解説記事を作成します。


【初心者向け】Python print format(f文字列・format・%)徹底解説

Pythonでプログラムを書いていると、変数に格納された値や計算結果などを画面に表示したい場面が頻繁にあります。その際に活躍するのが、Pythonの組み込み関数であるprint()です。

print()関数は非常にシンプルで使いやすい関数ですが、ただ単に値を表示するだけではなく、文字列の中に変数の値を埋め込んだり、数値や文字列の表示形式を細かく制御したりするための様々な「文字列フォーマット」の機能を持っています。

Pythonには、主に以下の3つの文字列フォーマット方法があります。

  1. f文字列 (Formatted String Literals): Python 3.6で導入された最も新しく、推奨される方法。
  2. str.format() メソッド: Python 2.6で導入され、現在でも広く使われている標準的な方法。
  3. % 演算子 (printf-style String Formatting): C言語のprintf関数に似た、古くからある方法。

初心者の方にとっては、「どれを使えばいいの?」「それぞれの違いは何?」と疑問に思うかもしれません。この記事では、これら3つの文字列フォーマット方法について、基本的な使い方から応用的なテクニック、それぞれのメリット・デメリットまでを、豊富なコード例を交えながら徹底的に解説します。

この記事を読み終える頃には、Pythonで意図した通りの文字列表示ができるようになり、プログラムのデバッグやユーザーへの情報提供が格段にスムーズになるでしょう。さあ、Pythonの文字列フォーマットの世界を探検しに行きましょう!

1. まずは基本のprint()関数をおさらい

文字列フォーマットに入る前に、まずはprint()関数の基本的な使い方を確認しておきましょう。

最もシンプルな使い方は、文字列をそのまま表示することです。

python
print("Hello, World!")

実行結果:
Hello, World!

複数の値を表示したい場合は、カンマ (,) で区切って引数に渡します。

python
name = "Alice"
age = 30
print("名前:", name, "年齢:", age)

実行結果:
名前: Alice 年齢: 30

デフォルトでは、print()は各引数の間にスペースを挿入し、表示の最後に改行を追加します。これらの動作は、sep引数とend引数を使って変更できます。

  • sep: 各引数の間に挿入する文字列を指定します。デフォルトはスペース (' ') です。
  • end: 表示の最後に挿入する文字列を指定します。デフォルトは改行文字 ('\n') です。

例:区切り文字をカンマとスペースに、改行なしで表示する

python
print("Apple", "Banana", "Cherry", sep=", ", end=".")
print("This is on the same line.")

実行結果:
Apple, Banana, Cherry.This is on the same line.

このように、基本的なprint()関数だけでもいくつかの表示方法がありますが、文字列の中に変数の値を埋め込んだり、数値の桁数を揃えたりといった複雑な表示をしようとすると、少し不便です。例えば、上記の例を「私の名前はAliceで、年齢は30歳です。」という一つの文章として表示したい場合、基本的なprint()だけでは以下のように文字列を結合する必要があります。

python
name = "Alice"
age = 30
print("私の名前は" + name + "で、年齢は" + str(age) + "歳です。")

実行結果:
私の名前はAliceで、年齢は30歳です。

このコードは動作しますが、文字列が長くなったり、埋め込む変数の数が増えたりすると、非常に読みにくく、間違いやすくなります。ここで文字列フォーマットの出番です。文字列フォーマットを使えば、より直感的で分かりやすく、柔軟な方法で文字列を組み立てることができます。

2. f文字列 (Formatted String Literals) – モダンで推奨される方法

f文字列は、Python 3.6で導入された比較的新しい文字列フォーマット方法です。その簡潔さ、可読性の高さ、そしてパフォーマンスの良さから、現在最も推奨されている方法です。

f文字列は、文字列リテラルの先頭に小文字のfまたは大文字のFを付けることで定義します。f文字列の中では、波括弧 {} を使うことで、変数名や任意のPythonの式を埋め込むことができます。

2.1. 変数や式の埋め込み

基本的な使い方は非常にシンプルです。

python
name = "Bob"
age = 25
print(f"私の名前は{name}で、年齢は{age}歳です。")

実行結果:
私の名前はBobで、年齢は25歳です。

見てください、先ほどの+を使った結合よりもずっと分かりやすいですね!f文字列の中で{name}と書くだけで、変数nameの値がそこに埋め込まれます。同様に{age}には変数ageの値が埋め込まれます。

波括弧の中には、変数だけでなく、Pythonの有効な式なら何でも書くことができます。

python
x = 10
y = 20
print(f"x + y = {x + y}")
print(f"現在の時刻は{datetime.now()}です。") # datetimeモジュールをインポートする必要あり
print(f"大文字の名前: {name.upper()}")

実行結果例 (datetimeの値は実行時の時刻によります):
x + y = 30
現在の時刻は2023-10-27 10:30:00.123456です。
大文字の名前: BOB

このように、波括弧 {} の中で計算を行ったり、メソッドを呼び出したりした結果を直接埋め込むことができます。これは非常に強力な機能です。

2.2. フォーマット指定子 (Format Specifier)

f文字列の強力な機能の一つに、埋め込む値の表示形式を細かく制御できる「フォーマット指定子」があります。フォーマット指定子は、波括弧 {} の中で、埋め込みたい変数や式の後ろにコロン : を付けて記述します。

構文は {値:フォーマット指定子} となります。

フォーマット指定子には、表示する値の型、幅(桁数)、精度(小数点以下の桁数など)、アラインメント(寄せ方)、数値の区切り文字など、様々な種類があります。

主要なフォーマット指定子を見ていきましょう。

2.2.1. 型指定
  • s: 文字列として表示 (デフォルト)。
  • d: 整数として表示。
  • f: 浮動小数点数として表示 (デフォルトで小数点以下6桁)。
  • %: パーセンテージとして表示 (値に100を掛けて末尾に%を追加)。
  • e: 指数表記 (小文字e)。
  • E: 指数表記 (大文字E)。
  • g: 指数表記または10進表記の短い方。
  • b: 2進数。
  • o: 8進数。
  • x: 16進数 (小文字)。
  • X: 16進数 (大文字)。

例:

“`python
num_int = 123
num_float = 123.456789
percentage = 0.85

print(f”整数: {num_int:d}”)
print(f”浮動小数点数: {num_float:f}”)
print(f”パーセンテージ: {percentage:%}”) # デフォルトでは小数点以下6桁まで表示

数値を様々な基数で表示

print(f”10進数: {num_int:d}”)
print(f”2進数: {num_int:b}”)
print(f”8進数: {num_int:o}”)
print(f”16進数 (小文字): {num_int:x}”)
print(f”16進数 (大文字): {num_int:X}”)

浮動小数点数の指数表記

print(f”指数表記 (e): {num_float:e}”)
print(f”指数表記 (E): {num_float:E}”)
“`

実行結果:
整数: 123
浮動小数点数: 123.456789
パーセンテージ: 85.000000%
10進数: 123
2進数: 1111011
8進数: 173
16進数 (小文字): 7b
16進数 (大文字): 7B
指数表記 (e): 1.234568e+02
指数表記 (E): 1.234568E+02

パーセンテージ表示は、値に100が掛けられることに注意してください。0.85が85.000000%となっています。

2.2.2. 幅とアラインメント

文字列や数値の表示幅を指定し、その中でどのように寄せ(アラインメント)るかを指定できます。

  • 幅指定: 数字を記述します。その幅に満たない場合は、指定された文字でパディング(詰め物)されます。
  • アラインメント:
    • <: 左寄せ (デフォルトは文字列)。
    • >: 右寄せ (デフォルトは数値)。
    • ^: 中央揃え。
    • =: 符号を左端に置き、ゼロ詰め(数値のみ)。

アラインメント文字の前に、パディングに使用する文字を1文字だけ指定できます。省略するとスペースでパディングされます。

例:

“`python
text = “Python”
number = 42

幅を指定 (デフォルトはスペースでパディング)

print(f”幅10 (右寄せ): {text:>10}”)
print(f”幅10 (左寄せ): {text:<10}”)
print(f”幅10 (中央揃え): {text:^10}”)

数値の幅指定 (デフォルトは右寄せ)

print(f”数値 幅5: {number:5d}”)

パディング文字を指定

print(f”幅10 (ハイフンで右寄せ): {text:->10}”)
print(f”幅10 (アスタリスクで中央揃え): {text:*^10}”)

ゼロパディング (数値の場合、0を指定すると幅の指定に使える)

print(f”数値 ゼロパディング 幅5: {number:05d}”)

符号を左端に置いてゼロパディング (=と0を組み合わせる)

negative_num = -123
print(f”負の数 (=と0): {negative_num:=08d}”) # 符号、00000, 数値
“`

実行結果:
幅10 (右寄せ): Python
幅10 (左寄せ): Python
幅10 (中央揃え): Python
数値 幅5: 42
幅10 (ハイフンで右寄せ): ----Python
幅10 (アスタリスクで中央揃え): **Python**
数値 ゼロパディング 幅5: 00042
負の数 (=と0): -0000123

=アラインメントは数値にのみ有効で、符号は常に一番左に表示され、その後に指定されたパディング文字(0を指定するとゼロパディング)が続き、最後に数値が表示されます。

2.2.3. 精度指定

浮動小数点数や文字列に対して、表示する桁数を制限できます。

  • 浮動小数点数 (f, e, gなど): 小数点以下の桁数を指定します (.[桁数]f)。指定した桁数で丸められます。
  • 文字列 (s): 表示する最大文字数を指定します (.[文字数]s)。

例:

“`python
pi = 3.1415926535
long_text = “This is a long string.”

浮動小数点数の精度指定

print(f”円周率 (小数点以下2桁): {pi:.2f}”)
print(f”円周率 (小数点以下4桁): {pi:.4f}”)
print(f”円周率 (全体の桁数指定、精度10): {pi:.10g}”) # g型の場合、精度は全体の桁数

文字列の精度指定 (最大文字数)

print(f”長い文字列 (最初の10文字): {long_text:.10s}”)
“`

実行結果:
円周率 (小数点以下2桁): 3.14
円周率 (小数点以下4桁): 3.1416
円周率 (全体の桁数指定、精度10): 3.141592654
長い文字列 (最初の10文字): This is a

浮動小数点数の精度は小数点以下の桁数を指定しますが、g型の場合は全体の桁数を指定します。文字列の精度は、表示する文字の最大数を指定します。

2.2.4. 数値の区切り文字

大きな数値を読むやすくするために、桁区切り文字を表示できます。

  • ,: 3桁ごとにカンマを挿入します (10進数、浮動小数点数など)。
  • _: 3桁ごと (10進数など) または4桁ごと (2進数、8進数、16進数) にアンダースコアを挿入します。

例:

“`python
large_number = 1000000
large_float = 1234567.890123

print(f”カンマ区切り: {large_number:,d}”)
print(f”カンマ区切り (浮動小数点数): {large_float:,.2f}”) # カンマと精度を同時に指定

print(f”アンダースコア区切り: {large_number:d}”)
print(f”アンダースコア区切り (浮動小数点数): {large_float:
.2f}”)
print(f”アンダースコア区切り (16進数): {large_number:_x}”)
“`

実行結果:
カンマ区切り: 1,000,000
カンマ区切り (浮動小数点数): 1,234,567.89
アンダースコア区切り: 1_000_000
アンダースコア区切り (浮動小数点数): 1_234_567.89
アンダースコア区切り (16進数): f_4240

これらの区切り文字は、幅や精度指定と組み合わせて使用できます。例えば {value:,.2f}のように記述します。

2.2.5. 符号の表示

正の数、負の数、ゼロに対して、符号 (+ または -) をどのように表示するかを制御できます。

  • +: 正の数には+、負の数には-を表示します。
  • -: 負の数にのみ-を表示します (デフォルト)。
  • : 正の数またはゼロの場合にスペースを表示し、負の数には-を表示します。

例:

“`python
pos_num = 100
neg_num = -200
zero_num = 0

print(f”デフォルト (-): {pos_num:d}, {neg_num:d}, {zero_num:d}”)
print(f”プラス (+): {pos_num:+d}, {neg_num:+d}, {zero_num:+d}”)
print(f”スペース ( ): {pos_num: d}, {neg_num: d}, {zero_num: d}”)
“`

実行結果:
デフォルト (-): 100, -200, 0
プラス (+): +100, -200, +0
スペース ( ): 100, -200, 0

スペース指定を使うと、正の数と負の数で桁を揃えやすくなります。

2.2.6. その他の指定子
  • #: 代替形式。
    • 8進数、16進数にプレフィックス (0o, 0x, 0X) を追加します。
    • 浮動小数点数に常に小数点以下を表示します。
  • =: 符号を左端に置き、パディング(通常はゼロ)を符号と数値の間に挿入します (前述)。

例:

python
print(f"8進数 (#): {123:#o}")
print(f"16進数 (#): {123:#x}")
print(f"浮動小数点数 (#): {123.0:#f}")

実行結果:
8進数 (#): 0o173
16進数 (#): 0x7b
浮動小数点数 (#): 123.000000

2.2.7. 複雑なフォーマット指定子の組み合わせ

これらのフォーマット指定子は組み合わせて使用できます。一般的な順序は以下のようになります (全てが必須ではありません)。

[[fill]align][sign][#][0][width][grouping][.precision][type]

  • fill: パディング文字 (1文字)
  • align: < > ^ =
  • sign: + -
  • #: 代替形式
  • 0: ゼロパディング (幅指定の前に置くこともできるが、0フラグとして扱う方が明確)
  • width: 最小表示幅 (数字)
  • grouping: , _ (桁区切り)
  • .: 精度指定の区切り
  • precision: 精度 (数字)
  • type: 型指定 (d, f, sなど)

例:幅15で、プラス記号を表示し、カンマ区切りで、小数点以下2桁の浮動小数点数

python
big_float = 1234567890.12345
print(f"複雑なフォーマット: {big_float:+^15,.2f}")

実行結果:
複雑なフォーマット: +1,234,567,890.12

中央寄せ (^) が指定されていますが、数値の場合は符号が左端に、残りが右寄せになる傾向があります(完全に中央揃えにはなりません)。アラインメントは数値に対しては少し特殊な振る舞いをすることがあります。

2.3. f文字列の中でのデバッグ

Python 3.8からは、f文字列内に =を指定することで、変数名、イコール記号、そして変数の値の形式で表示する便利なデバッグ機能が追加されました。

“`python
name = “Charlie”
age = 40
height = 1.75

print(f”{name=}”)
print(f”{age=}, {height=}”)
print(f”{age=:.2f}”) # フォーマット指定子も併用可能
“`

実行結果:
name='Charlie'
age=40, height=1.75
age=40.00

これは、デバッグ時に変数の値を確認する際に非常に役立ちます。=の後にスペースを挟むこともできますが、これは単に見栄えの問題です。

2.4. 波括弧 {} のエスケープ

f文字列の中にリテラルの波括弧 {}} を含めたい場合は、それらを二重に記述します ({{ または }})。

python
print(f"波括弧を表示: {{ This is text in braces }}")

実行結果:
波括弧を表示: { This is text in braces }

2.5. f文字列の利点と注意点

利点:

  • 可読性が高い: 文字列テンプレートの中に直接変数や式を記述できるため、コードが直感的で読みやすいです。
  • 使いやすい: {}の中に変数名や式を書くだけで埋め込みができます。
  • パフォーマンスが良い: 他の方法(特に%演算子)と比較して高速です。
  • 強力なフォーマット指定子: 数値や文字列の表示形式を細かく制御できます。
  • デバッグ機能: Python 3.8以降の=指定子でデバッグが容易になります。

注意点:

  • Pythonのバージョン: Python 3.6以降でしか使用できません。もし古いPythonバージョン(3.5以前)を使用している場合は、他の方法を使う必要があります。
  • 波括弧の問題: f文字列内での波括弧の扱いに慣れる必要があります。

総じて、特別な理由(古いPythonバージョンのサポートが必要など)がない限り、f文字列が最も推奨される文字列フォーマット方法です。

3. str.format() メソッド – 標準的な方法

.format()メソッドは、Python 2.6で導入され、Python 3.0で%演算子に代わる推奨方法として位置づけられました(その後、f文字列が登場しましたが)。現在でも広く使われている、文字列オブジェクトのメソッドとして呼び出すフォーマット方法です。

.format()メソッドは、フォーマット文字列の中にプレースホルダーとして波括弧 {} を置き、その後に.format()を付けて、埋め込みたい値を引数として渡します。

3.1. 基本的な使い方 (位置引数)

波括弧 {} に何も指定しないと、.format()に渡された引数が順番に埋め込まれます。

python
name = "David"
age = 35
print("私の名前は{}で、年齢は{}歳です。".format(name, age))

実行結果:
私の名前はDavidで、年齢は35歳です。

埋め込む引数の順番を変えたい場合は、波括弧 {} の中に引数のインデックス番号(0から始まる)を指定します。

python
print("私の名前は{1}で、年齢は{0}歳です。".format(age, name)) # 0番目がage, 1番目がname

実行結果:
私の名前はDavidで、年齢は35歳です。

同じ値を複数回使用することも可能です。

python
item = "Book"
price = 2500
print("商品: {0}, 価格: {1}円。{0}はおすすめです。".format(item, price))

実行結果:
商品: Book, 価格: 2500円。Bookはおすすめです。

3.2. キーワード引数による埋め込み

.format()メソッドにキーワード引数として値を渡すことで、波括弧 {} の中に引数名を指定して埋め込むこともできます。

python
print("私の名前は{my_name}で、年齢は{my_age}歳です。".format(my_name=name, my_age=age))

実行結果:
私の名前はDavidで、年齢は35歳です。

キーワード引数を使うと、引数の順序を気にする必要がなくなり、どの値がどこに埋め込まれるかが分かりやすくなるという利点があります。特に引数の数が多い場合に便利です。

辞書 unpacked ( ** を使う) を使うと、辞書のキーをキーワード引数として渡すことも可能です。

python
person_info = {'name': 'Eve', 'age': 28}
print("私の名前は{name}で、年齢は{age}歳です。".format(**person_info))

実行結果:
私の名前はEveで、年齢は28歳です。

3.3. フォーマット指定子

.format()メソッドでも、f文字列と同じ構文のフォーマット指定子を使用できます。波括弧 {} の中に、埋め込む値の指定(インデックスまたはキーワード名)の後にコロン : を付けて記述します。

構文は {インデックスまたはキーワード名:フォーマット指定子} となります。

例:

“`python
pi = 3.1415926535
large_number = 1234567

print(“円周率 (小数点以下2桁): {:.2f}”.format(pi)) # インデックス0は省略可能
print(“大きな数 (カンマ区切り): {:,d}”.format(large_number))
print(“文字列 幅10 (中央揃え): {:^10s}”.format(“Test”))

data = {‘name’: ‘Frank’, ‘value’: 45.678}
print(“名前: {name}, 値 (精度1): {value:.1f}”.format(**data))
“`

実行結果:
円周率 (小数点以下2桁): 3.14
大きな数 (カンマ区切り): 1,234,567
文字列 幅10 (中央揃え): Test
名前: Frank, 値 (精度1): 45.7

見ての通り、フォーマット指定子の構文(コロン以下)はf文字列と全く同じです。f文字列で学んだフォーマット指定子の使い方は、.format()メソッドでもそのまま適用できます。

3.4. 波括弧 {} のエスケープ

.format()メソッドでも、f文字列と同様にリテラルの波括弧 {}} を含めたい場合は、それらを二重に記述します ({{ または }})。

python
print("波括弧を表示: {{ This is text in braces }}".format())

実行結果:
波括弧を表示: { This is text in braces }

.format()メソッドでは引数を渡す必要はありません(空の.format()でOKです)。

3.5. str.format() メソッドの利点と注意点

利点:

  • 広くサポートされている: Python 2.6以降で利用可能であり、Python 3でも標準的な方法として広く使われています。
  • 動的なフォーマットに強い: フォーマット文字列自体を変数として持つことができるため、実行時にフォーマットを動的に変更するような場合に柔軟に対応できます。
  • 可読性: %演算子に比べると可読性は高いです。

注意点:

  • f文字列より冗長: シンプルな変数埋め込みの場合、f文字列に比べて記述が長くなります ("..." .format(...))。
  • パフォーマンス: f文字列よりわずかに遅い場合があります(ほとんどの場合、気にするほどの差はありません)。

f文字列が使えない古い環境で開発する場合や、フォーマット文字列自体をプログラムの外部から読み込むなど、動的にフォーマットを生成する必要がある場合には、.format()メソッドが適しています。しかし、Python 3.6以降を使う場合は、ほとんどの場面でf文字列の方が簡潔に書けます。

4. % 演算子 (printf-style String Formatting) – 古い方法

%演算子を使った文字列フォーマットは、Pythonに古くから存在するC言語のprintf関数に似た構文です。現在では非推奨とされていますが、古いコードではまだ見かけることがあります。

%演算子を使ったフォーマットは、フォーマット文字列の中にプレースホルダー(%s, %d, %fなど)を置き、その後に%と、埋め込みたい値を渡します。複数の値を埋め込む場合は、値をタプルで渡します。

4.1. 基本的な使い方

文字列を埋め込むには%s、整数を埋め込むには%d、浮動小数点数を埋め込むには%fといったように、値の型に対応したプレースホルダーを使用します。

python
name = "George"
age = 45
print("私の名前は%sで、年齢は%d歳です。" % (name, age)) # 複数の場合はタプルで渡す

実行結果:
私の名前はGeorgeで、年齢は45歳です。

タプルで渡す場合、プレースホルダーの数とタプルの要素数が一致している必要があります。一致しない場合はTypeErrorが発生します。

値を1つだけ埋め込む場合は、タプルにする必要はありません。

python
language = "Python"
print("私は%sを勉強しています。" % language)

実行結果:
私はPythonを勉強しています。

4.2. 辞書を使ったキーワード指定

%演算子でも、プレースホルダーに名前を付けて辞書を使って値を渡すことができます。

python
person_info = {'name': 'Hannah', 'job': 'Engineer'}
print("私の名前は%(name)sで、職業は%(job)sです。" % person_info)

実行結果:
私の名前はHannahで、職業はEngineerです。

プレースホルダーは %(名前)型コード の形式になります。.format()のキーワード引数と同様に、どの値がどこに行くかが分かりやすくなります。

4.3. フォーマットコード

%演算子でも、表示の幅や精度などを指定するための「フォーマットコード」を使用できます。構文は %[フラグ][幅][.精度]型コード となります。

主要なフォーマットコードとフラグを見ていきましょう。

4.3.1. 型コード
  • s: 文字列。
  • d, i: 10進整数。
  • u: 符号なし10進整数 (古い形式、dとほぼ同じ)。
  • f, F: 浮動小数点数 (デフォルトで小数点以下6桁)。
  • e, E: 指数表記。
  • g, G: 指数表記または10進表記の短い方。
  • c: 単一文字 (整数または文字列1文字)。
  • r: repr()で変換した文字列。
  • a: ascii()で変換した文字列 (Python 3.5以降)。
  • o: 8進数。
  • x, X: 16進数。
  • %: リテラルの%を表示。

例:

python
num_int = 255
num_float = 98.7654
print("整数: %d" % num_int)
print("浮動小数点数: %f" % num_float)
print("16進数: %x (大文字: %X)" % (num_int, num_int))
print(" repr(): %r" % [1, 2, 3]) # リストのrepr()表示
print(" リテラル%: %%" % ()) # %を表示するには %%

実行結果:
整数: 255
浮動小数点数: 98.765400
16進数: ff (大文字: FF)
repr(): [1, 2, 3]
リテラル%: %

4.3.2. 幅と精度
  • 幅指定: .精度の前に数字を記述します。最小表示幅となります。
  • 精度指定: . の後に数字を記述します。
    • 浮動小数点数 (f, e, g): 小数点以下の桁数 (g型は全体の桁数)。
    • 文字列 (s): 表示する最大文字数。

例:

python
pi = 3.14159
print("円周率 (精度2): %.2f" % pi)
print("円周率 (幅10, 精度4): %10.4f" % pi) # 全体幅10の中で小数点以下4桁
print("文字列 (幅10): %10s" % "Short") # 右寄せ
print("文字列 (幅10, 精度3): %10.3s" % "LongString") # 幅10の中で最初の3文字を右寄せ
print("文字列 (精度5): %.5s" % "VeryLongString") # 最初の5文字だけ表示

実行結果:
円周率 (精度2): 3.14
円周率 (幅10, 精度4): 3.1416
文字列 (幅10): Short
文字列 (幅10, 精度3): Lon
文字列 (精度5): VeryL

4.3.3. フラグ
  • -: 左寄せ (デフォルトは数値は右寄せ、文字列は左寄せ)。幅指定と組み合わせて使用します。
  • +: 正の数に+、負の数に-を表示。
  • : 正の数またはゼロの場合にスペースを表示し、負の数には-を表示。
  • 0: ゼロパディング (数値のみ)。幅指定と組み合わせて使用します。-フラグが指定されている場合は無視されます。
  • #: 代替形式。
    • 8進数、16進数にプレフィックス (0o, 0x, 0X) を追加します。
    • 浮動小数点数に常に小数点以下を表示します。

例:

“`python
number = 123
neg_number = -456

print(“幅10 (デフォルト右寄せ): %10d” % number)
print(“幅10 (左寄せ -): %-10d” % number)
print(“幅10 (ゼロパディング 0): %010d” % number)
print(“幅10 (ゼロパディング, 負の数 0): %010d” % neg_number) # 符号は考慮されない

print(“プラス +: %+d, %+d” % (number, neg_number))
print(“スペース : % d, % d” % (number, neg_number))

print(“16進数 (#): %#x” % 255)
“`

実行結果:
幅10 (デフォルト右寄せ): 123
幅10 (左寄せ -): 123
幅10 (ゼロパディング 0): 0000000123
幅10 (ゼロパディング, 負の数 0): -000000456
プラス +: +123, -456
スペース : 123, -456
16進数 (#): 0xff

%演算子の場合、ゼロパディング (0フラグ) は符号の後に続くのではなく、幅全体に対して行われます。これは.format()やf文字列の=0アラインメントとは異なる動作です。

4.4. % 演算子の利点と注意点

利点:

  • 後方互換性: 古いPythonコードとの互換性が必要な場合にのみ使用します。

注意点:

  • 非推奨: 現在のPythonでは非推奨とされており、新しいコードで積極的に使うべきではありません。
  • エラーになりやすい: フォーマットコードと渡す値の型が一致しない場合などにTypeErrorが発生しやすいです。タプルを使う場合に、プレースホルダーの数と要素数が一致しない場合もエラーになります。
  • 可読性が低い: 特に複雑なフォーマット指定をする場合に、フォーマット文字列が読みにくくなります。
  • 拡張性の問題: .を使った属性アクセスや[]を使ったインデックスアクセスなど、複雑な式をプレースホルダー内で評価することはできません。

古いコードを読む必要がない限り、%演算子を使う理由はほとんどありません。新しいコードではf文字列か.format()メソッドを使用しましょう。

5. 3つの方法の比較

ここまで見てきた3つの文字列フォーマット方法を比較してみましょう。

特徴 f文字列 (Python 3.6+) str.format() (Python 2.6+) %演算子 (Legacy)
構文 f"..." {変数} or {式:format} "..." .format(args) {index:format} {key:format} "..." % (args) %type or %(key)type
推奨度 最も推奨 標準的、広く使われる 非推奨、後方互換性のみ
可読性 高い 中程度 低い (特に複雑な場合)
使いやすさ 高い (特にシンプルな埋め込み) 中程度 低い (エラーになりやすい)
パフォーマンス 高い 中程度 低い
対応バージョン Python 3.6以降 Python 2.6以降 全てのバージョン (ただし非推奨)
式の評価 可能 ({式}) 不可能 (.format()で評価結果を渡す) 不可能
デバッグ機能 =指定子 (Python 3.8+) なし なし
動的なフォーマット文字列 少し苦手 (文字列を組み立てる必要がある) 得意 (フォーマット文字列を変数にできる) 少し苦手 (辞書を使う方法はある)

初心者への推奨:

これからPythonを始める方、またはPython 3.6以降の環境で開発する方は、まずf文字列の使い方をマスターすることをおすすめします。 可読性が高く、最も直感的に使える方法だからです。ほとんどの場合、f文字列で事足ります。

次に、.format()メソッドの基本的な使い方を理解しておくと良いでしょう。 古いコードを読む際や、f文字列が使えない環境(Python 3.5以前)での開発、あるいはフォーマット文字列を動的に生成したい場合に役立ちます。

%演算子については、積極的に使う必要はありません。 古いコードを読んだ際に意味が理解できれば十分でしょう。

6. 実践的な例

これまでに学んだ3つの方法を使って、いくつか実践的な例を見ていきましょう。

6.1. 変数の埋め込み (シンプルな場合)

“`python
item = “Laptop”
price = 120000

f文字列 (推奨)

print(f”商品: {item}, 価格: {price}円”)

.format()

print(“商品: {}, 価格: {}円”.format(item, price))

%演算子 (非推奨)

print(“商品: %s, 価格: %d円” % (item, price))
“`

どの方法でも同じ結果になりますが、f文字列が最も短く直感的に書けます。

6.2. 数値の整形 (小数点、桁区切り)

“`python
value = 9876543.210987
percentage = 0.75

f文字列

print(f”小数点以下2桁、カンマ区切り: {value:,.2f}”)
print(f”パーセンテージ (精度1): {percentage:.1%}”)

.format()

print(“小数点以下2桁、カンマ区切り: {:, .2f}”.format(value)) # formatではカンマの前にスペースを空けることが多い
print(“パーセンテージ (精度1): {:.1%}”.format(percentage))

%演算子

%演算子には標準のカンマ区切りフォーマットが直接ありません。Localeモジュールを使うなどの方法がありますが複雑です。

精度指定は可能

print(“小数点以下2桁: %.2f” % value)

カンマ区切りは手動で処理するか、非標準の方法を使う必要があります。

“`

この例では、f文字列と.format()メソッドが数値整形に優れていることがわかります。特にカンマ区切りは、%演算子では標準でサポートされていません。

6.3. 表形式の出力

複数の値を、特定の幅で揃えて表のように表示したい場合があります。

“`python
data = [
(“Apple”, 120, 1500),
(“Banana”, 50, 800),
(“Cherry”, 300, 2500)
]

print(“— 商品リスト —“)
print(“商品名 在庫 価格”)
print(“—————–“)

f文字列

for item, stock, price in data:
print(f”{item:<8} {stock:>4} {price:>5}”)

print(“—————–“)

.format()

print(“\n— 商品リスト —“)
print(“商品名 在庫 価格”)
print(“—————–“)
for item, stock, price in data:
print(“{:<8} {:>4} {:>5}”.format(item, stock, price))
print(“—————–“)

%演算子 (幅と寄せのみ指定)

print(“\n— 商品リスト —“)
print(“商品名 在庫 価格”)
print(“—————–“)
for item, stock, price in data:
print(“%-8s %4d %5d” % (item, stock, price)) # 文字列は左寄せ(-), 整数は右寄せ(デフォルト)
print(“—————–“)
“`

実行結果:
“`
— 商品リスト —
商品名 在庫 価格


Apple 120 1500
Banana 50 800
Cherry 300 2500


— 商品リスト —
商品名 在庫 価格


Apple 120 1500
Banana 50 800
Cherry 300 2500


— 商品リスト —
商品名 在庫 価格


Apple 120 1500
Banana 50 800
Cherry 300 2500


“`

3つの方法どれでも表形式の出力は可能ですが、f文字列と.format()はアラインメント指定がより直感的です (<, >, ^)。%演算子では、文字列の左寄せに-フラグを使う必要があります。

6.4. 日付/時刻のフォーマット

datetimeオブジェクトを特定の形式で表示したい場合にも、文字列フォーマットは非常に便利です。datetimeオブジェクトは、文字列に変換される際に独自のフォーマットコード(%Y, %m, %dなど)を使用しますが、f文字列や.format()のフォーマット指定子内でこれらのコードを使うことができます。

“`python
from datetime import datetime

now = datetime.now()

f文字列

print(f”現在の日付と時刻: {now:%Y年%m月%d日 %H時%M分%S秒}”)

.format()

print(“現在の日付と時刻: {:%Y年%m月%d日 %H時%M分%S秒}”.format(now)) # オブジェクト全体を指定

%演算子

print(“現在の日付と時刻: %Y年%m月%d日 %H時%M分%S秒” % now)
“`

実行結果例 (実行時の時刻によります):
現在の日付と時刻: 2023年10月27日 10時30分00秒
現在の日付と時刻: 2023年10月27日 10時30分00秒
現在の日付と時刻: 2023年10月27日 10時30分00秒

datetimeオブジェクトのフォーマットコードは、どの文字列フォーマット方法でも共通して使用できます。ただし、f文字列や.format()を使う場合は、これらのコードをフォーマット指定子(コロン : の後)として記述することに注意してください。

日付/時刻のフォーマットコードについては、strftime()のドキュメントなどを参照してください。主なものには以下があります。

  • %Y: 4桁の年 (例: 2023)
  • %m: 2桁の月 (例: 10)
  • %d: 2桁の日 (例: 27)
  • %H: 24時間表記の時 (例: 14)
  • %I: 12時間表記の時 (例: 02)
  • %p: AM/PM
  • %M: 2桁の分 (例: 30)
  • %S: 2桁の秒 (例: 05)
  • %A: 曜日の完全な名前 (例: Friday)
  • %B: 月の完全な名前 (例: October)
  • %c: 地域に適した日付と時刻の表現

7. まとめ

この記事では、Pythonで変数や値を文字列の中に埋め込んだり、表示形式を制御したりするための3つの主要な方法、f文字列、.format()メソッド、そして%演算子について詳しく解説しました。

  • f文字列は、Python 3.6以降で利用できる、最も新しく推奨される方法です。f"..."の構文で、{変数名}{式}を使って直感的に値を埋め込めます。:フォーマット指定子を使って表示形式を細かく制御できる点も強力です。パフォーマンスも優れており、特別な理由がない限りこの方法を選ぶべきです。
  • .format()メソッドは、Python 2.6以降で利用できる標準的な方法です。"..." .format(...)の構文で、{}{インデックス}{キーワード名}などのプレースホルダーを使います。f文字列と共通の豊富なフォーマット指定子を使用できます。動的なフォーマット文字列を扱う場合に特に便利です。
  • %演算子は、古くからある方法で、C言語のprintfに似ています。"..." % (values)の構文で、%s, %d, %fなどの型コードを持つプレースホルダーを使います。現在では非推奨とされており、可読性やエラー耐性の面でf文字列や.format()に劣ります。古いコードの読解が必要な場合以外は、使用を避けるのが賢明です。

Pythonプログラミングにおいて、変数や計算結果を分かりやすく表示することは、デバッグのためにも、プログラムのユーザーに情報を伝えるためにも非常に重要です。文字列フォーマットを使いこなすことは、Pythonプログラマにとって必須のスキルと言えるでしょう。

最初はf文字列の使い方から始め、慣れてきたら.format()メソッドも学んでみてください。%演算子については、必要に応じて参照する程度で構いません。

この記事で紹介した様々なフォーマット指定子やテクニックを活用して、あなたのPythonプログラムでより見やすい出力を実現してください。

ハッピーコーディング!

付録:よく使われるフォーマット指定子チートシート

目的 f文字列 / .format() 構文 %演算子 構文 (非推奨)
文字列
そのまま表示 {var} %s
幅指定 (左寄せ) {var:<幅} %-幅s
幅指定 (右寄せ) {var:>幅} %幅s
幅指定 (中央揃え) {var:^幅} なし
最大文字数制限 {var:.精度s} %.精度s
幅指定と文字数制限 {var:幅.精度s} (<, >, ^と組み合わせる) %幅.精度s (-と組み合わせる)
整数
そのまま表示 {var:d} %d
幅指定 {var:幅d} (>, ^と組み合わせる) %幅d (-と組み合わせる)
ゼロパディング {var:0幅d} または {var:=0幅d} (=は符号の左に0) %0幅d (符号は考慮されない)
符号表示 (+/-) {var:+d} %+d
符号表示 (space/-) {var: d} % d
桁区切り (カンマ) {var:,d} なし (Locale等が必要)
桁区切り (アンダースコア) {var:_d} なし
16進数 {var:x} (小文字), {var:X} (大文字), {var:#x} (プレフィックス) %x, %X, %#x
8進数 {var:o} , {var:#o} (プレフィックス) %o, %#o
2進数 {var:b} なし
浮動小数点数
そのまま表示 {var:f} %f
小数点以下桁数指定 {var:.精度f} %.精度f
幅指定と小数点以下桁数 {var:幅.精度f} (>, ^と組み合わせる) %幅.精度f (-と組み合わせる)
指数表記 {var:e} (小文字), {var:E} (大文字) %e, %E
精度を指定した指数/10進 {var:.精度g} (小文字), {var:.精度G} (大文字) %.精度g, %.精度G
パーセンテージ {var:%} , {var:.精度%} なし (手動で*100して表示)
桁区切り (カンマ) {var:,.精度f} なし (Locale等が必要)
桁区切り (アンダースコア) {var:_.精度f} なし
符号表示 (+/-) {var:+f} %+f
符号表示 (space/-) {var: f} % f
その他
波括弧リテラル {{, }} %リテラル: %%
オブジェクトのrepr() {var!r} %r
デバッグ表示 (変数名=値) {var=} (Python 3.8+) なし

参考文献:


この記事が、Python初心者の方々が文字列フォーマットを理解し、効果的に活用する一助となれば幸いです。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール