f-string(フォーマット済文字列リテラル)は文字列のフォーマットを制御する方法の一つで、Python3.6から導入されています。
これは従来より使用されている%やstr.format()より簡易化が図られています。
今回は、このf-stringの基本について、具体例を交えながらまとめます。
確認した環境
- OS: Ubuntu16.04LTS
- Python3.7.4
f-stringとは
formatted string literal (フォーマット済み文字列リテラル)とよび、従来str.format()で書式設定していたものを、もっと簡易化したものです。
Python3.6から導入されています。
主な特徴
- 文字列の先頭に’f’ または ‘F’ を付けます。
- {}で囲われた置換フィールドの中にPythonの式を書きます。スクリプトが実行されると、この式の評価結果が出力されます。
- 書式設定は上記のPythonの式の後にコンマ(:)で区切って指定します。
format()との比較
format()との違いを比較してみます。
大きな違いは、先頭に’f’を付けること、および置換フィールド{}に変数を直接記載することです。これだけですが、だいぶすっきりと、且つ直感的になったように思います。
- formatの場合
>>> a = 7
>>> b = 3
>>> name = 'Hibikisan'
>>> '{0} | {1} ÷ {2} = {3:.3f}'.format(name, a, b, a/b)
'hibikisan | 7 ÷ 3 = 2.333'
>>> a = 7
>>> b = 3
>>> name = 'Hibikisan'
>>> f'{name} | {a} ÷ {b} = {a/b:.3f}'
'hibikisan | 7 ÷ 3 = 2.333'
使い方の詳細
文字列の先頭に’f’または’F’を付与
f-stringを表す接頭辞は、小文字の’f’、大文字の’F’どちらでも使えます。
>>> city = 'Tokyo'
# 先頭に'f'
>>> f'{city} in Japan'
'Tokyo in Japan'
# 先頭に'F'
>>> F'{city} in Japan'
'Tokyo in Japan'
文字列リテラルを囲う引用符
文字列は一重引用符 (‘)、二重引用符 (“)、三連の一重引用符(”’)や三連の二重引用符(“””)で囲います。このうちどれでも使えますが、最初と最後の引用符は同じであるひつようがあります。
>>> a = 123
# 一重引用符 (')
>>> f'val = {a}'
'val = 123'
# 二重引用符 (")
>>> f"val = {a}"
'val = 123'
# 三連の一重引用符
>>> f'''val = {a}'''
'val = 123'
# 三連の二重引用符
>>> f"""val = {a}"""
'val = 123'
エスケープシーケンス
バックスラッシュ (\) 文字で、改行文字(\n)、タブ(\t)、クオート文字(\’)などをエスケープできます。
# 改行(\n)
>>> print(f'Tokyo\nYokohama')
Tokyo
Yokohama
# タブ(\t)
>>> print(f'Tokyo\tYokohama')
Tokyo Yokohama
但し、RAW文字リテラル(※)の場合は、バックスラッシュ(\)文字はエスケープ文字とは見なされず、通常の文字として扱われます。
(※)先頭に’r’または’R’を付けた文字リテラル。この場合はバックスラッシュ(\)は通常の文字として扱われる。
# バックスラッシュは通常の文字として扱われる
>>> print(fr'Tokyo\nYokohama')
Tokyo\nYokohama
>>> print(rf'Tokyo\tYokohama')
Tokyo\tYokohama
置換フィールドの記述
{}で囲われた置換フィールドの中にPythonの式を書きます。色々な例を以下に挙げてみます。
- 数値演算
>>> a = 7
>>> b = 2
>>> f'{a} + {b} = {a+b}'
'7 + 2 = 9'
>>> l = [1, 2, 3]
>>> f'{l[0]}'
'1'
>>> f'{l[1]}'
'2'
>>> f'{l[2]}'
'3'
>>> d = {'a': 1, 'b':2, 'c':3}
>>> f'{d["a"]}'
'1'
>>> f'{d["b"]}'
'2'
>>> f'{d["c"]}'
'3'
※キー(key)の指定する際に、引用符がf-stringの文字リテラルの引用符と重複しないように注意
# 引用符に注意
>>> f'{d['a']}'
File "", line 1
f'{d['a']}'
^
SyntaxError: invalid syntax
>>> def func(a, b):
... return a+b
>>> a = 2
>>> b = 5
>>> f'{func(a, b)}'
'7'
a = 10
b = 5
def func(a, b):
return a+b
print(f'''Sample strings {func(a, b
)}''')
# Sample strings 15
print(f'''Sample strings {func(a, b
) # comment} ''')
# SyntaxError: f-string expression part cannot include '#'
>>> a = 1
>>> b = 3
>>> f'{}, {b}'
File "", line 1
SyntaxError: f-string: empty expression not allowed
>>> f'{"abc\ndef"}'
File "", line 1
SyntaxError: f-string expression part cannot include a backslash
# バックスラッシュが必要な場合は、一時変数を作成すれば対応可能です。
>>> s = "abc\ndef"
>>> f'{s}'
'abc\ndef'
書式設定
書式設定はPython式の後にコロン(:)に続けて記述します。
記述方法は、format()で使われる書式指定ミニ言語仕様と同じです。
(参考記事)【Python】formatを用いた書式設定の基本
>>> a = 1234567
>>> f'{a:*>15d}'
'********1234567'
>>> a = 3.141592653589793
>>> f'{a:010.3f}'
'000003.142'
>>> s = 'abcdef'
>>> f'{s:*>10s}'
'****abcdef'
>>> a = 1000
>>> f'{a:#0b}'
'0b1111101000'
>>> a_ = 0b1111101000
>>> f'{a:d}'
'1000'
入れ子構造
入れ子構造も可能です
>>> a = 100
>>> for n in ['0b', '0o', '0x']:
... f'{a:5d} <==> {a:#{n}}'
...
' 100 <==> 0b1100100'
' 100 <==> 0o144'
' 100 <==> 0x64'
まとめ
Python3.6から導入されたf-stringの使い方についてまとめました。
参考)公式リファレンス:2.4.3. フォーマット済み文字列リテラル
コメント
[…] 参考記事)【Python】 f-stringの使い方の基本 […]