出典
この記事は「Effective Python 第二版」の項目4:「Cスタイルフォーマット文字列とstr.formatは使わずf文字列で埋め込む」を読んで、自分なりにまとめたものです。
Pythonの文字列埋め込み
Pythonには文字列を埋め込む方法が大きく分けて以下3つある。
- %を使う方法
- str.format()を使う方法
- f文字列を使う方法
自分はあまり意識せずに使っていたのだけど、これを機にどれが適切なのかを考えたい。
##%を使う方法
JavaやC言語をやっている人からすると慣れ親しんだ方法。
以下のように書く。
name = 'チーズ牛丼太郎'
age = 21
print('私の名前は%sです。%d歳です。' % (name, age))
出力
私の名前はチーズ牛丼太郎です。21歳です。
うん。よさそうに見える。
でも実はこの方法にはいくつか問題がある。
次の例をみてみる。
name = 'チーズ牛丼太郎'
age = 21
weight = 55.1525
print('私の名前は%sです。%d歳です。体重はだいたい%dkgです。これからも%sをよろしくね。' % (name, age, int(weight), name))
出力
私の名前はチーズ牛丼太郎です。21歳です。体重はだいたい55kgです。これからもチーズ牛丼太郎をよろしくね。
上のコードには以下の4つの問題がある。
- 問題点1 : 型の順番を間違えるとエラーになる
例えば上のコードで最初のname
とage
を逆にしてしまうと以下のエラーが出る
Traceback (most recent call last):
File "cheese.py", line 8, in <module>
print('私の名前は%sです。%d歳です。体重はだいたい%dkgです。これからも%sをよろしくね。' % (age, name, int(weight), name))
TypeError: %d format: a number is required, not str
1つめの型が整数, 2つめが文字列の型なので逆にするとだめということ。
常に型と順番に気をつけなければならない。
- 問題点2 : 長くなると読みづらくなる
上の場合はweight
を整数に変換したりしているが、代入する式が複雑になればなるほど可読性が下がる。
「どの変数がどれに対応するんだっけ?」
を注意深くみる必要がある。
-
問題点3 : 同じ値を使う場合に何回も書く必要がある
上の例だとname
という同じ変数を二回使っているが、右側のタプルにも二回書く必要がある。 -
問題点4 : 辞書を使うと冗長になる
1と3の問題点はタプルではなく辞書を使うことで解消できる。
以下のように書けば良い。
name = 'チーズ牛丼太郎'
age = 21
weight = 55.1525
print('私の名前は%(name)sです。%(age)d歳です。体重はだいたい%(weight)dkgです。これからも%(name)sをよろしくね。' % {'age':age, 'name':name, 'weight':int(weight)})
出力は同じ。
このように書けば、二回出てくるname
は一回でいいし、変数の順番も気にしなくてよくなる。
ただ、辞書を使ったことでさらに冗長でごちゃごちゃしてしまった。
組み込みのformatやstr.formatを使う方法
次にstr.format()
を使った方法をみていく。
name = 'チーズ牛丼太郎'
age = 21
print('私の名前は{}です。{}歳です。'.format(name, age))
こんな感じで書く。
また、以下のようにindexを設定して変数の順番を変えることもできる。
print('私の名前は{1}です。{0}歳です。'.format(age, name))
先ほどの例に当てはめる。
name = 'チーズ牛丼太郎'
age = 21
weight = 55.1525
print('私の名前は{0}です。{1}歳です。体重はだいたい{2}kgです。これからも{0}をよろしくね。'.format(age, name, int(weight)))
indexを使うことで上記の問題1と3は解決できそう。
ただ、%
で辞書を使う方法に比べるとすっきりとはしたものの、やはりまだ冗長である。
f文字列を使う方法
最後にf文字列を使った方法を考える。
こんな感じで書く。
name = 'チーズ牛丼太郎'
age = 21
weight = 55.1525
print(f'私の名前は{name}です。{age}歳です。')
さきほどの例に当てはめる
name = 'チーズ牛丼太郎'
age = 21
weight = 55.1525
print(f'私の名前は{name}です。{age}歳です。体重はだいたい{int(weight)}kgです。これからも{name}をよろしくね。')
%
やstr.format()
を使った方法に比べてかなりすっきり書けていることがわかる。
変数を右側でタプルや辞書、format()
で指定するのではなく、直接埋め込んでいるため可読性が高い。
簡単なコードであればどれを使っても変わりないが、複雑になればなるほどf文字列を使うほうがよさそうだ。
まとめ
- Pythonで文字列を埋め込む方法をまとめた
- f文字列を使う方法が一番可読性が高いので良さそう
- ちなみに
str.format()
はPython2.6
、f文字列はPython3.6
以上でないと使えないので注意