5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】文字列の埋め込みにはf文字列を使うべき

Last updated at Posted at 2020-08-13

出典

この記事は「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 : 型の順番を間違えるとエラーになる

例えば上のコードで最初のnameageを逆にしてしまうと以下のエラーが出る

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以上でないと使えないので注意
5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?