1. ホーム
  2. python

[解決済み] Python 3 の文字列フォーマット

2022-09-05 01:17:01

質問

Python 2でやっています。

"(%d goals, $%d)" % (self.goals, self.penalties)

これのPython3バージョンは何ですか?

ネットで例を検索してみましたが、Python 2のバージョンばかり出てきます。

どのように解決するのですか?

ここで ドキュメント を参照してください。例としては、以下のようになります。

"({:d} goals, ${:d})".format(self.goals, self.penalties)

もし goalspenalties が整数である場合 (つまりそのデフォルトの書式でOK)、次のように短縮される可能性があります。

"({} goals, ${})".format(self.goals, self.penalties)

また、パラメータは self のフィールドなので、1つの引数を2回使ってやる方法もあります(@Burhan Khalidがコメントで指摘しています)。

"({0.goals} goals, ${0.penalties})".format(self)

説明する。

  • {} は、次の位置引数だけをデフォルトの書式で指定することを意味します。
  • {0} は、インデックス 0 を意味し、デフォルトの書式で表示されます。
  • {:d} は次の位置引数で、10進整数値形式です。
  • {0:d} はインデックスを持つ引数 0 であり、10進整数形式である。

引数を選択する際にできることは他にもたくさんあり(位置指定引数の代わりに名前付き引数を使う、フィールドにアクセスする、など)、同様に書式オプションもたくさんあります(数値のパディング、千区切り文字の使用、符号の表示/非表示、など)。他の例をいくつか挙げます。

"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)

"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)

"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'

"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'

"games: {:>3}".format(player1.games)  # 'games: 123'
"games: {:>3}".format(player2.games)  # 'games:   4'
"games: {:0>3}".format(player2.games) # 'games: 004'


注意してください。 他の人が指摘したように、新しいフォーマットは前者に取って代わるものではなく、両方ともPython 3とPython 2の新しいバージョンの両方で利用可能です。好みの問題だと言う人もいるかもしれませんが、IMHO は新しい方が古いものよりずっと表現力が豊かで、新しいコードを書くときはいつも使うべきです (もちろん、古い環境をターゲットにしている場合を除きます)。