Pythonのf文字列の使い方【書式指定】

Pythonのf文字列(f-strings、フォーマット済み文字列リテラル)を解説します。

Pythonのf文字列の使い方【書式指定】

Pythonのf文字列とは、文字列の中に変数や式を展開して埋め込むことができる仕組みです。Pythonの文字列メソッドのformat()と似た仕組みですが、より直感的に書くことができるようになりました。

f文字列はPython3.6から導入された仕組みで、f-stringフォーマット文字列フォーマット済み文字列リテラルとも呼ばれます。

f文字列(f-string)の基本的な使い方

Pythonでは、文字列リテラルの前にfもしくはFを記述することで、f文字列(f-string)として認識されます。f文字列内では、波括弧{ }を使うことができ、その中に変数や式を記述するとことでそれらを文字列内で展開することができます。

# f文字列の基本的な使い方

# 文字列リテラルの前にfまたはFを置く
name = "山田 太郎"
print(f"彼の名前は{name}です。")
# 彼の名前は山田 太郎です

# 変数だけではなく、式も展開できる
# 波括弧は複数置いても良い
num1 = 5
num2 = 10
num3 = 20
print(f"{num1}と{num2}と{num3}を足すと、{num1 + num2 + num3}になります。")
# 5と10と20を足すと、35になります。

f文字列は複数行で書くこともできます。複数行にわたって文字列を記載する際にも、必ず文字列の前にfまたはFを記述する必要があります。

f文字列ではない文字列であれば、通常の文字列として連結して問題ありません。

name = "山田太郎"
age = 20

string = (
    f"私の名前は{name}です。"
    f"{age}歳です。"
    "よろしくお願いいたします。"
)
print(string)
# 私の名前は山田太郎です。20歳です。よろしくお願いいたします。

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

文字列に変数を展開する方法としては、文字列型のformat()メソッドもあります。f文字列が実装される以前は、こちらの方法が使われていました。

記述の方法として、f文字列の方が直感的で分かりやすいという点もありますが、機能的な面でもいくつか違いがあります。

format()メソッドでは辞書型のキーにクォートをつけない

Pythonでは、辞書型の要素を取り出すには、dict['key_name']の形でキーにシングルクォートかダブルクォートをつける必要があります。f文字列内の波括弧の中では、同様にdict['key_name']の形で値を取得することができますが、文字列型のformat()メソッドで使う場合には、キーにクォートをつけるとエラーになります

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

# formatメソッドでは辞書のキーにクォートをつけない
dict = {"name": "山田太郎", "age": 20}
print("彼の名前は{0[name]}です。{0[age]}歳です。".format(dict))
# 彼の名前は山田太郎です。20歳です。


# クォートをつけるとKeyErrorになる
print("彼の名前は{0['name']}です。{0['age']}歳です。".format(dict))
# KeyError: "'name'"


# f文字列では辞書のキーにクォートが必要
print(f"彼の名前は{dict['name']}です。{dict['age']}歳です。")
# 彼の名前は山田太郎です。20歳です。

f文字列で辞書型を使う場合の注意点としては、通常の文字列と同様に、辞書のキーを指定するクォートの種類を、文字列自体のクォートの種類と別のものにする必要があります。

たとえば、文字列全体をシングルクォートで囲む場合には、辞書のキーの指定はダブルクォートで行う必要があります。

# 辞書のキーを指定するクォートの種類に注意する

# 両方ともダブルクォートにするとエラーになる
print(f"彼の名前は{dict["name"]}です。{dict["age"]}歳です。")
# SyntaxError: invalid syntax

f文字列の方が実行時間が速い

f文字列とformat()メソッドを比較すると、f文字列の方が実行速度が速くなっています。

ためしに、同じ処理を10万回ずつ実行して、時間を比較します。

# f文字列とformatメソッドの実行時間の比較

import timeit

# formatメソッド
timeit.timeit("""name="山田太郎"
age=20
'彼の名前は{}です。{}歳です。'.format(name, age)""", number=100000)
# 0.04140438500007804


# f文字列
timeit.timeit("""name="山田太郎"
age=20
f'彼の名前は{name}です。{age}歳です。'""", number=100000)
# 0.0242244840001149

処理の内容にもよりますが、f文字列の方が実行速度が速いことがわかりました。通常の使用ではそこまで問題ないかもしれませんが、フォーマット文字列を繰り返し使う場面では考慮した方が良いでしょう。

f文字列の書式指定

f文字列では、format()メソッドと同様に、『変数をどのように文字列に変換するか』を表現する書式を指定することができます。

日付(datetime)

datetime型は、日付関連の書式コードに従って変換できます。

# 日付(datetime)の書式指定

import datetime

dt = datetime.datetime.now()

print(f"日付:{dt}")
# 日付:2023-01-13 10:17:30.994188

print(f"日時:{dt: %Y年%m月%d日 %H時%M分%S秒}")
# 日時:  2023年01月13日 10時17分30秒

print(f"日時:{dt.isoformat()}")
# 日時:2023-01-13T10:17:30.994188

文字を右寄せ、中央寄せ、左寄せ

文字を特定の文字数の中で右、左、中央に寄せる記法です。右寄せは>、左寄せは<、中央寄せは^を使います。

# 文字を右寄せ、中央寄せ、左寄せ

string = "タイトル"

# 右寄せ
print(f"{string:=>10}")
# ======タイトル

# 左寄せ
print(f"{string:=<10}")
# タイトル======

# 中央寄せ
print(f"{string:=^10}")
# ===タイトル===

数字の桁を区切る

3桁ごとにカンマを入れます。

num = 1234567890

print(f"{num:,}")
# 1,234,567,890

ゼロ埋め(ゼロパディング)

数字を特定の桁数で表示し、余った桁を0で埋めて表示します。

指定の桁数よりも大きい数字は、そのまま表示されます。

num = 123

# 7桁で表示
print(f"{num:08}")
# 00000123


# 指定の桁数より大きい場合はそのまま表示
num = 123456789

print(f"{num:08}")
# 123456789

小数点以下の有効桁数

小数点以下で何桁まで表示するかを指定します。末尾を.<数値>fの形にすると、小数点以下の有効桁数を指定できます。有効桁数以下は四捨五入されます。

# 小数点以下の有効桁数

num = 123.456789

# 小数点以下は2桁、それより下は四捨五入される
print(f"{num: .2f}")
# 123.46

# <数値>.<数値>fの形にすると、全体の桁数も指定できる
# 全体は8桁、小数点以下2桁
print(f"{num: 8.2f}")
#   123.46

# 全体の桁数はゼロ埋めできる
print(f"{num: 08.2f}")
# 0123.46

指数の表示

末尾をeまたはEにすると、指数表示になります。文字列になる指数記号は、末尾に指定したものと同じになります。

# 指数表記

num = 123.456789

# デフォルト表示は全体で12桁
print(f"{num:e}")
# 1.234568e+02

print(f"{num:E}")
# 1.234568E+02

パーセント表記

数字をパーセントに変換して表示をします。小数点以下の有効桁数の数字と%記号で表記します。

有効桁数以下は四捨五入されます。

# パーセント表記

num = 0.23456

print(f"{num:.2%}")
# 23.46%

f文字列の波括弧をネストさせる

f文字列の波括弧は、変数や式を展開するものですが、書式設定で使う数字などに変数を使いたい場合などにはネストさせることができます。

# 波括弧をネストさせる

# ゼロパディングの桁数を増やしていく
num = 123

for i in range(10):
    print(f"{num:0{i}}")

# 123
# 123
# 123
# 123
# 0123
# 00123
# 000123
# 0000123
# 00000123
# 000000123

波括弧を使う

f文字列の中で波括弧{ }を使う場合は、そのまま波括弧の中に入れればOKです。

# 波括弧をf文字列で使う

print(f"f文字列の中で{{}}を使うには、波括弧を続けて書けば良い")
# f文字列の中で{}を使うには、波括弧を続けて書けば良い