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.

JoseBazBaz
quelle
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
pyformat.info und python-course.eu/python3_formatted_output.php (Nicht meine Websites)
Christophe Roussy
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).

mgibsonbr
quelle
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'
JDong
quelle
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)'
Mark Reed
quelle
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
Fullstacklife
quelle