Pythonのf文字列(f-strings)とは?わかりやすく解説します!

この記事では『Pythonのf文字列(f-strings)』について、以下の内容をサンプルコードを用いてわかりやすく解説します。

  • Pythonのf文字列(f-strings)とは
  • f文字列の書式設定
  • 文字列内で波括弧を表示する方法
  • 表示フォーマットの指定を動的に変更する方法
  • f文字列とraw文字列を組み合わせる方法
  • f文字列とformat()メソッドの違い

Pythonのf文字列(f-strings)とは

Pythonのf文字列(f-strings、フォーマット済み文字列リテラル)は、Python 3.6で導入された文字列フォーマット機能です。文字列の前にfもしくはFを付けることで、変数や式を文字列中に埋め込むことができるので、従来のformat()メソッドに比べてコードが簡潔になります。

まず、以下のサンプルコードを見てみましょう。

name = 'Ken'
age = 30

# format()メソッドを使用した例
print('I am {}. I am {} years old.'.format(name, age))
# I am Ken. I am 30 years old.

# f文字列を使用した例
print(f'I am {name}. I am {age} years old.')
# I am Ken. I am 30 years old.

format()メソッドを使用した方法では、プレースホルダ(実際の値やデータが入る予定の場所に仮の値や記号を置いておくもの)を使用して、後から{}の箇所に変数や値を埋め込まれます。一方、f文字列では{}の中に変数名を直接書くだけでよいので、直感的に文字列内に変数や値を埋め込むことができます。

なお、上記のサンプルコードでは、シングルクォートで文字列を囲っていますが、以下に示すようにダブルクォートやトリプルクォートで囲むこともできます。

# シングルクォート
print(f'I am {name}. I am {age} years old.')

# ダブルクォート
print(f"I am {name}. I am {age} years old.")

# トリプルクォート
print(f'''I am {name}. I am {age} years old.''')

f文字列の書式設定

format()メソッドと同様に、f文字列でも数値や文字列の表示フォーマットを柔軟に指定できます。

例えば、以下に示すような書式設定をすることができます。

  • 「小数点以下の桁数」や「有効数字(有効桁数)」の指定
  • 桁埋め
  • 桁区切りのカンマ表示
  • 2進数、8進数、16進数表示
  • パーセント表記
  • 日付と時間のフォーマット
  • 右寄せ、中央寄せ、左寄せ

順番に各書式設定について説明します。

「小数点以下の桁数」や「有効数字(有効桁数)」の指定

「小数点以下の桁数」や「有効数字(有効桁数)」を指定することができます。

num = 12.345678

# 小数点以下3桁
print(f'小数点以下3桁: {num:.3f}')
# 小数点以下3桁: 12.346

# 有効数字3桁
print(f'有効数字3桁: {num:.3g}')
# 有効数字3桁: 12.3

桁埋め

数値を指定した桁数で表示し、足りない桁をゼロで埋めることができます。

num = 123
print(f'ゼロ埋め: {num:05}')
# 00123

桁区切りのカンマ表示

大きな数値を見やすくするため、カンマで桁区切りを指定することができます。

num = 1234567890
print(f'桁区切り: {num:,}')
# 桁区切り: 1,234,567,890

2進数、8進数、16進数表示

数値を2進数、8進数、16進数に変換して表示することができます。

num = 255

# 進数変換の基本例
print(f'2進数          : {num:b}')
print(f'8進数          : {num:o}')
print(f'16進数(小文字): {num:x}')
print(f'16進数(大文字): {num:X}')
# 2進数          : 11111111 
# 8進数          : 377      
# 16進数(小文字): ff      
# 16進数(大文字): FF  

# 桁埋めした表示
print(f'2進数          : {num:08b}')  # 8桁の2進数、ゼロ埋め
print(f'8進数          : {num:08o}')  # 8桁の8進数、ゼロ埋め
print(f'16進数(小文字): {num:08x}')  # 8桁の16進数(小文字)、ゼロ埋め
print(f'16進数(大文字): {num:08X}')  # 8桁の16進数(大文字)、ゼロ埋め
# 2進数          : 11111111 
# 8進数          : 00000377 
# 16進数(小文字): 000000ff
# 16進数(大文字): 000000FF

# 接頭辞を付けた表示
print(f'2進数          : {num:#010b}')  # 2進数、0b接頭辞付き
print(f'8進数          : {num:#010o}')  # 8進数、0o接頭辞付き
print(f'16進数(小文字): {num:#010x}')  # 16進数(小文字)、0x接頭辞付き
print(f'16進数(大文字): {num:#010X}')  # 16進数(大文字)、0X接頭辞付き
# 2進数          : 0b11111111
# 8進数          : 0o00000377
# 16進数(小文字): 0x000000ff
# 16進数(大文字): 0X000000FF

パーセント表記

数値をパーセント形式に変換することができます。

num = 0.123
print(f'パーセント表記: {num:.2%}')
# パーセント表記: 12.30%

日付と時間のフォーマット

日時のフォーマットを行うことができます。

import datetime
dt = datetime.datetime(2024, 10, 2, 10, 15)
print(f'日付: {dt:%Y/%m/%d}')
print(f'時間: {dt:%H:%M:%S}')
# 日付: 2024/10/02
# 時間: 10:15:00

右寄せ、中央寄せ、左寄せ

文字列や数値の位置を指定することができます。

text = 'Python'
print(f'右寄せ      : {text:*>10}')
print(f'中央寄せ    : {text:-^10}')
print(f'左寄せ      : {text:^<10}')
# 右寄せ      : ****Python
# 中央寄せ    : --Python--
# 左寄せ      : Python^^^^  

文字列内で波括弧を表示する方法

f文字列内で波括弧{}をそのまま表示したい場合には、波括弧を二重にする必要があります。

print(f"波括弧を表示: {{}}")
# 波括弧を表示: {}

表示フォーマットの指定を動的に変更する方法

変数やフォーマット指定子をネストさせると、動的にフォーマットを適用することができます。

n = 123
i = 8

print(f'動的に桁数を変更: {n:0{i}}') # iの値で桁数を動的に変える
# 動的に桁数を変更: 00000123

f文字列とraw文字列を組み合わせる方法

rfまたはfrを使用することで、f文字列とraw文字列(エスケープシーケンスを無効化する文字列)の両方の機能を組み合わせることが可能です。

x = 'ABC'
y = 'DEF'
print(rf'{x}\t{y}')
# ABC\tDEF

Python 3.8以降から変数名とその値を同時に出力可能に

Python 3.8以降では、f文字列を使って変数名とその値を同時に出力できる機能が追加されました。置換フィールド{}の変数名のあとに=を書くと、変数名とその値が出力されるようになります。デバッグやログ出力に便利な機能です。

i = 42

# Python 3.8以降で使用可能
print(f'{i=}')
# i=42

書式指定も可能です。

# 変数名と値を二進数で出力
print(f'{i=:b}')
# i=101010

スペースを追加することで、出力結果に反映させることもできます。

# スペースを追加
print(f'{i = }')
# i = 42

f文字列とformat()メソッドの違い

f文字列とformat()メソッドの違いを説明します。

f文字列は置換フィールド内に式を直接記述できる

f文字列では、置換フィールド{}内に式を直接記述することができます。

a = 5
b = 3
# f文字列を使って計算結果を埋め込む
print(f'{a} + {b} = {a + b}')
# 5 + 3 = 8

# format()メソッドではエラーになる
print('{a} + {a} = {a + b}'.format(a, b))
# KeyError: 'a'

# 以下のように記述するのが正しい
print('{} + {} = {}'.format(a, b, a + b))
# 5 + 3 = 8

上記のサンプルコードから分かるように、f文字列ではa + bのような式をそのまま置換フィールド{}に入れて評価できますが、format()メソッドにはこの機能がありません。

辞書のキー指定方法が違う

f文字列では置換フィールド{}がそのまま式として評価されるため、辞書のキーを文字列として指定する場合には、引用符が必要です。format()メソッドでは引用符は不要です。

d = {'key1': "value1", 'key2': "value2"}

# f文字列の場合
print(f'{d["key1"]}, {d["key2"]}')
# value1, value2

print(f'{d[key1]}, {d[key2]}')
# NameError: name 'key1' is not defined

# format()メソッドの場合
print('{0[key1]}, {0[key2]}'.format(d))
# value1, value2

print('{0["key1"]}, {0["key2"]}'.format(d))
# keyError: '"key1"'

本記事のまとめ

この記事では『Pythonのf文字列(f-strings)』について、以下の内容を説明しました。

  • f文字列(f-strings)とは
    • 文字列中に変数や式を埋め込む方法で、Python 3.6で導入された機能。
  • 書式設定
    • 小数点、ゼロ埋め、桁区切り、進数変換、パーセント表示、日付と時間のフォーマットなどが可能。
  • Python 3.8の新機能
    • 変数名とその値を同時に出力する機能が追加。
  • f文字列とformat()メソッドの違い
    • f文字列は式を直接埋め込める。
    • 辞書のキーの指定方法が異なる。

お読み頂きありがとうございました。