【Python3.6~】f-stringsを使おう

はじめに

Python3.6より、str に変数を埋め込む方法として、f-stringsが追加されました。
日本語で言うと、 フォーマット済み文字列リテラルとなります。
Python3.6未満のバージョンでは、str.format()や、%記号を用いることで同じような振舞いを実現できていました。今回は、それらとf-stringsの違いと、使い方を書いていこうと思います。

書き方

f-stringsは以下のように記述します。

>>> a = 1
>>> b = 2
>>> print(f'{a} + {b} = {a + b}')
1 + 2 = 3

使い方は簡単で、strリテラルの前にfをくっつけること(f'')で、ただのstrがformatted stringsになります。
変数の埋め込みは{変数}で行います。

上の例を見ると、{a}{b}がそれぞれ12に置き換わって出力されていることがわかります。

また、{a + b}3になっていることにお気づきでしょうか?
{}の中には式文(expression_stmt)を入れることができるので、a + bという式を評価した値を出力することになります。
もちろん、関数を呼び出すことも可能なので、以下のようなこともできます。

>>> print(f'{a} + {b} = {print(a + b)}')
3
1 + 2 = None

上の場合、print()は2回呼び出されています。
最初のprint()を実行する際に、f'{a} + {b} = {print(a + b)}'を評価します。3つの式文の中でも、{print(a + b)}を評価する際にprint(a + b)を実行するため、先に、3を出力します。そして、print()Noneを返す為、1+2の答えはNoneになるわけです。

書式指定

f-stringsでも、str.format()と同様に、書式指定ができます。(当たり前
例を以下に示します。

>>> a = 0.1
>>> b = 0.02
>>> c = 0.003
>>> print(f"{a} + {b} + {c} = {a + b + c}")
0.1 + 0.02 + 0.003 = 0.12300000000000001
>>> print(f"{a} + {b} + {c} = {a + b + c :.2}")
0.1 + 0.02 + 0.003 = 0.12

{}の中の式文の後に:を付けることで、書式の指定が可能です。
上の例だと、{a + b + c :.2}とすることで、小数点以下2桁を丸めています。

改行

f-stringsを定義する上で、1行がとても長くなってしまった場合、以下の方法で、見た目上の改行ができます。(て言ってもこれはstrに言えることなのですが)

>>> a = 1
>>> b = 2
>>> c = 3
>>> print(f"これは{a}行目"
...       f"これは{b}行目"
...       f"これは{c}行目")
これは1行目これは2行目これは3行目

既存の方法との比較

歴史的には、%記法、str.format()、f-stringsの順に登場しています(確か)。

%記法

この方法は、C言語printf()に似ています。strの埋め込みたい場所に、%d%sのフォーマット指定子を埋め込み('%d + %d = %d'の部分)、そのstrと、埋め込むオブジェクトを%でつなぐことで実現できます。

>>> print('%d + %d = %d' % (1, 2, 3))
1 + 2 = 3

str.format()

この方法は、strのメソッドformat()を呼び出しています。
strの埋め込みたい場所に、{}を埋め込み、.format()の引数に式文を指定することで実現できます。

%記法に比べて、型をしていしなくて良いというメリットがあります。

>>> print('{} + {} = {}'.format(1, 2, 3))
1 + 2 = 3

f-strings

f-stringsは上に記述した通りですが、str.format()に比べて、直感的に記述できるというメリットがあります。

おわりに

f-stringsは直感的にstrに変数を埋め込むことができます。今までstr.format()を利用していた方も、ぜひ、利用を検討してください。