📑

[Python]フォーマット済み文字列リテラル(f-string)の使い方

2021/05/03に公開

Pythonの出力フォーマットはどれがいちばん良いのか

pythonで変数や文章を出力する時のフォーマットの方法多すぎて迷いませんか?(私は迷いました)
サクッと調べた感じいちばん新しいフォーマット済み文字列リテラル(f-string)が良いのでは?と思ったのでf-stringを紹介します。

ちなみに登場順は、%-formatting =>str.format=> f-stringです

[本題]フォーマット済み文字列リテラルの基本的な使い方

フォーマット済み文字列リテラル(f-string)の使い方

f-stringの基本的な使い方は以下のようになります。

文字列の頭のクォートの前にfを書くだけで、JavaScriptでいうバッククォートのように{}で囲った部分に変数や式を入れることができます。

name = 'Alice'
age = 22

print(f'{name} is {age}')
# => Alice is 22

【比較】%や.formatの場合

f-stringが登場する前からあった%やstr.formatはこんな感じです。

name = 'Alice'
age = 22

# %sの場合
print('%s is %s' % (name,age))
# => Alice is 22

# str.formatの場合
print('{} is {}'.format(name,age))
# => Alice is 22

短文なのであまり実感はないですが、文字列を一通り書いた後に当てはめる変数を書くことになるので、変数が4~5個になると読むのが途端にしんどくなります。そういう意味でもf-stringが直感的で好きですね。

応用例

f-stringを使いこなすために必要な知識を補強します。

数値のフォーマットを整えたい

{}内の変数(または式)の直後を:で区切ってやれば、今まで通りフォーマットを指定することができます。

num = 12345
print(f'{num:,}')
# => 12,345

{}を単体で出力したい

{}を使うことで、変数を適用できるのはわかったけれど、{}自体を表示させたい時はどうするの?という疑問を解決します。{{}}このように外側からさらに囲めばエスケープすることが可能です。

print(f'{{}}')
# => {}

{}をエスケープするということは、その中の変数や式も文字列としてエスケープされるので注意が必要です。

print(f'{{3 + 7}}')
# => {3 + 7}

{}を3重以上にネストしたらどうなるのか

{}をネストする時に、人によっては直感と異なる結果になると思ったので紹介します。

ネストを3重にする

ネストを3重にすると以下のような結果になります。

print(f'{{{3 + 7}}}')
# => {10}
  1. いちばん外側の{}が、ひとつ中の{}をエスケープするので、文字列として{}が返される
  2. 外から2番目の{}はいちばん外側の{}にエスケープされているので、特に何も無し
  3. 最後にいちばん内側の{3 + 7}が実行されて、10が返される

返された{}10で、{10}といったところでしょう。

ネストを4重にした場合

ネストを4重にすると以下のような結果になります

print(f'{{{{3 + 7}}}}')
# => {{3 + 7}}
  1. いちばん外側の{}がひとつ内側の{}をエスケープするので、文字列として{}が返される
  2. 外から2番目の{}はいちばん外側の{}にエスケープされているので、特に何もなし
  3. 外から3番目の{}はひとつ内側(いちばん内側)の{3 + 7}をエスケープして、文字列として{3 + 7}を返す
  4. いちばん内側の{3 + 7}はすでにエスケープされているので特に何もなし

返された{}{3 + 7}で、{{3 + 7}}といったところでしょう。

複数行に渡って定義したい時はどうすれば良いのか

「文字列が長すぎる」といった理由で複数行に分けたい時は、各フォーマット済み文字列リテラルを()で囲むか、\で区切ります

一般的にどっちが良いとかはわかりません。

name = 'Alice'
age = 22

message = (f'{name}'
           ' is '
           f'{age}'
           )

print(message)
# => Alice is 22
name = 'Alice'
age = 22

message = f'{name}'\
    ' is '\
    f'{age}'

print(message)
# => Alice is 22

Discussion