String-Formatierung in Python 3


115

Ich mache das in Python 2:

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

Was ist die Python 3-Version davon?

Ich habe versucht, online nach Beispielen zu suchen, aber ich habe immer wieder Python 2-Versionen erhalten.


Es wurde nicht veraltet; Ihr Code funktioniert gut. Lesen Sie hier mehr .
Jackcogdill

32
Hinweis für den Gelegenheitsleser: Das Dollarzeichen hat keine besondere Bedeutung. Es ist hier nur ein Dollarzeichen. (Danke Martijn Pieters)
Kevinarpe


1
Das Dollarzeichen machte dies sehr verwirrend ..
Cchamberlain

Antworten:


173

Hier sind die Dokumente zur "neuen" Formatsyntax. Ein Beispiel wäre:

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

Wenn beide goalsund penaltiesGanzzahlen sind (dh ihr Standardformat ist in Ordnung), kann dies verkürzt werden auf:

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

Und da die Parameter Felder von sind self, gibt es auch eine Möglichkeit, dies zweimal mit einem einzelnen Argument zu tun (wie @Burhan Khalid in den Kommentaren feststellte):

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

Erklären:

  • {} bedeutet nur das nächste Positionsargument mit Standardformat;
  • {0}bedeutet das Argument mit Index 0im Standardformat;
  • {:d} ist das nächste Positionsargument mit dezimalem Ganzzahlformat;
  • {0:d}ist das Argument mit index 0im dezimalen Ganzzahlformat.

Es gibt viele andere Dinge, die Sie tun können, wenn Sie ein Argument auswählen (benannte Argumente anstelle von Positionsargumenten verwenden, auf Felder zugreifen usw.) und viele Formatoptionen (Auffüllen der Zahl, Verwenden von Tausenden Trennzeichen, Anzeigen von Zeichen oder nicht usw.). Einige andere Beispiele:

"({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'

Hinweis: Wie andere bereits betont haben, ersetzt das neue Format das frühere nicht. Beide sind sowohl in Python 3 als auch in den neueren Versionen von Python 2 verfügbar. Einige mögen sagen, dass es eine Frage der Präferenz ist, aber meiner Meinung nach ist die neuere viel ausdrucksstärker als die ältere und sollte beim Schreiben von neuem Code verwendet werden (es sei denn, sie zielt natürlich auf ältere Umgebungen ab).


9
Sie können auch tun"({0.goals} goals, ${0.penalties})".format(self)
Burhan Khalid

Sie müssen das '%' außerhalb der geschweiften Klammern nehmen, z. B. {: .2f%} -> {: .2f}%
SuperElectric

@ SuperElectric meinst du in dieser Zeile : "conversion rate: {:.2%}".format(self.goals / self.shots)? Funktioniert gut für mich wie es ist ... (Python 3.4) Beachten Sie, dass es keine enthält f, ich bitte um Formatierung als Prozentsatz, nicht als Gleitkommazahl.
mgibsonbr

Du hast recht; Es scheint in Python 3.4 zu funktionieren, also ist das in Ordnung, da das OP nach Python3 gefragt hat. Ich habe gerade festgestellt, dass es mit Python 2.7.6 nicht funktioniert. "{:.2f}%".format(float_num)funktioniert gut für beide.
SuperElectric

1
@JohnSchmitt Ja, dieses Beispiel sollte genau die gleiche Ausgabe liefern wie der in der Frage angegebene Code. Das $hat hier keine besondere Bedeutung, weder in der alten noch in der neuen Formatsyntax, sollte also unverändert in der generierten Zeichenfolge vorhanden sein.
mgibsonbr

67

Python 3.6 unterstützt jetzt die Shortand-Literal-String-Interpolation mit PEP 498 . Für Ihren Anwendungsfall lautet die neue Syntax einfach:

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

Dies ähnelt dem vorherigen .formatStandard, lässt jedoch Dinge wie :

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

12

Diese Zeile funktioniert wie sie ist in 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. COOL. Nachdem ich die Frage gestellt hatte, setzte ich meine Suche fort und stellte fest, dass wir {% d} statt nur% d ausführen müssen. Ist das auch richtig? Oder ist der Python2-Weg der einzige Weg, dies zu tun?
JoseBazBaz

2
Python 3 führt eine neue Syntax ein - das sind die geschweiften Klammern -, die Sie jedoch nicht verwenden müssen. Sie können entweder das alte oder das neue verwenden. Aber sie sind anders; Wenn Sie Locken verwenden, verwenden Sie keine Prozentzeichen.
Mark Reed

2

Ich mag diesen Ansatz

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)

Beachten Sie das an die Klammern angehängte d und s.

Ausgabe wird sein:

I scored 3 goals and took 5 penalties
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.