[Python]フォーマット済み文字列リテラル(f-string)の使い方
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}
- いちばん外側の
{}
が、ひとつ中の{}
をエスケープするので、文字列として{}
が返される - 外から2番目の
{}
はいちばん外側の{}
にエスケープされているので、特に何も無し - 最後にいちばん内側の
{3 + 7}
が実行されて、10
が返される
返された{}
と10
で、{10}
といったところでしょう。
ネストを4重にした場合
ネストを4重にすると以下のような結果になります
print(f'{{{{3 + 7}}}}')
# => {{3 + 7}}
- いちばん外側の
{}
がひとつ内側の{}
をエスケープするので、文字列として{
}が返される - 外から2番目の
{}
はいちばん外側の{}
にエスケープされているので、特に何もなし - 外から3番目の
{}
はひとつ内側(いちばん内側)の{3 + 7}
をエスケープして、文字列として{3 + 7}
を返す - いちばん内側の
{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