Python 3の文字列フォーマット


114

私はこれをPython 2で行います:

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

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

オンラインで例を検索してみましたが、Python 2バージョンが何度も表示されていました。


非推奨ではありませんでした。コードは正常に動作します。詳細はこちら
jackcogdill 2012

32
ふつうの読者への注記:ドル記号には特別な意味はありません。ここでは単なるドル記号です。(Martijn Pietersに感謝)
kevinarpe 2014年

1
pyformat.infoおよびpython-course.eu/python3_formatted_output.php(私のサイトではありません)
Christophe Roussy

1
ドル記号は、この非常に混乱..作ら
cchamberlain

回答:


173

これは「新しい」フォーマット構文に関するドキュメントです。例は次のとおりです。

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

もし両方goalspenalties整数(つまり、彼らのデフォルトの形式はOKです)、それが短縮することができています:

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

また、パラメーターはのフィールドでselfあるため、単一の引数を2回使用してそれを行う方法もあります(@Burhan Khalidがコメントに記載されています)。

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

説明:

  • {} デフォルトのフォーマットで、次の位置引数のみを意味します。
  • {0}0デフォルトのフォーマットで、インデックス付きの引数を意味します。
  • {:d} 10進整数形式の次の位置引数です。
  • {0:d}010進整数形式のindex付きの引数です。

引数を選択するとき(位置引数の代わりに名前付き引数を使用する、フィールドにアクセスするなど)や、多くの書式オプション(数値の埋め込み、数千の区切り文字の使用、記号の表示など)を実行するときにできることは他にもたくさんあります。その他の例:

"({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の新しいバージョンの両方で使用できます。好みの問題だと言う人もいますが、新しいものは古いものよりはるかに表現力があり、新しいコードを書くときはいつでも使用する必要があります(もちろん、古い環境を対象としている場合を除きます)。


9
次のこともできます"({0.goals} goals, ${0.penalties})".format(self)
Burhan Khalid '19

中括弧の外に '%'を付ける必要があります。例:{:.2f%}-> {:.2f}%
SuperElectric

@SuperElectricは、この行で:"conversion rate: {:.2%}".format(self.goals / self.shots)?そのままで問題なく動作fします...(Python 3.4)何もないことに注意してください。浮動小数点数としてではなく、パーセンテージとしてフォーマットするように求めています。
mgibsonbr 2015

あなたが正しい; これはPython 3.4で動作するようで、OPがPython3について質問していたので問題ありません。python 2.7.6では動作しないことがわかりました。"{:.2f}%".format(float_num)どちらでも問題なく機能します。
SuperElectric 2015

1
@JohnSchmittはい、この例では、質問で指定されたコードとまったく同じ出力が提供されるはずでした。$古い形式の構文でも新しい中にも、ここでは特別な意味を持っていない、ので変わらず、生成された文字列の中に存在すべきです。
mgibsonbr

67

Python 3.6は、PEP 498による短縮リテラル文字列補間をサポートするようになりました。ユースケースでは、新しい構文は次のとおりです。

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

これは以前の.format標準に似ていますが、次のようなことを簡単に実行できます。

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'

12

その行はPython 3でそのまま機能します。

>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'

OK。涼しい。質問を投稿した後、検索を続けていたところ、%dではなく{%d}を実行する必要があることがわかりました。それともそれを行う唯一の方法はPython2の方法ですか?
JoseBazBaz 2012

2
Python 3では新しい構文が導入されています。これは中括弧ですが、使用する必要はありません。古いものも新しいものも使用できます。しかし、それらは異なります。カーリーを使用している場合は、パーセント記号を使用しません。
Mark Reed、

2

私はこのアプローチが好きです

my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)

大括弧にそれぞれ追加されたdとsに注意してください。

出力は次のようになります。

I scored 3 goals and took 5 penalties
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.