Wie man String-Formatter in Python 3 verwendet
###Einführung
Die str.format()-Methode der String-Klasse in Python ermöglicht Ihnen Variablenersetzungen und Wertformatierungen. Damit können Sie Elemente innerhalb eines Strings durch positionsbasiertes Formatieren zusammenfügen.
Dieses Tutorial wird Sie durch einige der gängigen Anwendungen von Formatierern in Python führen, die dazu beitragen können, Ihren Code und Ihr Programm lesbarer und benutzerfreundlicher zu gestalten.
Voraussetzungen
Sie sollten Python 3 installiert und eine Programmierumgebung auf Ihrem Computer oder Server eingerichtet haben. Wenn Sie keine Programmierumgebung eingerichtet haben, können Sie auf die Installations- und Einrichtungsanleitungen für eine lokale Programmierumgebung oder für eine Programmierumgebung auf Ihrem Server verweisen, die für Ihr Betriebssystem (Ubuntu, CentOS, Debian usw.) geeignet ist.
##Formatierer verwenden
Formatter arbeiten, indem sie ein oder mehrere Platzhalter – definiert durch ein Paar geschweifte Klammern {} – in einen String einfügen und die Methode str.format() aufrufen. Sie geben der Methode den Wert, den Sie mit dem String concatenieren möchten. Dieser Wert wird an der Stelle übergeben, an der sich Ihr Platzhalter befindet, wenn Sie das Programm ausführen.
Lass uns einen String ausdrucken, der einen Formatter verwendet:
Info: Um dem Beispielcode in diesem Tutorial zu folgen, öffnen Sie eine Python-interaktive Shell auf Ihrem lokalen System, indem Sie den Befehl python3 ausführen. Dann können Sie die Beispiele kopieren, einfügen oder bearbeiten, indem Sie sie nach der >>> Eingabeaufforderung hinzufügen.
print("Sammy has {} balloons.".format(5))
Sammy has 5 balloons.
Im obigen Beispiel haben wir einen String mit einem Paar geschweifter Klammern als Platzhalter erstellt:
"Sammy has {} balloons."
Wir haben dann die str.format()-Methode hinzugefügt und den Wert der Ganzzahl 5 an diese Methode übergeben. Dies platziert den Wert von 5 in den String an der Stelle, wo die geschweiften Klammern waren:
Sammy has 5 balloons.
Wir können auch einer Variablen den Wert eines Strings zuweisen, der Formatierungsplatzhalter enthält:
open_string = "Sammy loves {}."
print(open_string.format("open source"))
Sammy loves open source.
In diesem zweiten Beispiel haben wir den String "open source" mit dem größeren String verknüpft und die geschweiften Klammern im ursprünglichen String ersetzt.
Formatter in Python ermöglichen es Ihnen, geschweifte Klammern als Platzhalter für Werte zu verwenden, die Sie mit der str.format()-Methode übergeben.
##Formatierungswerkzeuge mit mehreren Platzhaltern
Sie können mehrere Paare von geschweiften Klammern verwenden, wenn Sie Formatter verwenden. Wenn wir der oben genannten Satz einen weiteren Variablenersatz hinzufügen möchten, können wir dies tun, indem wir ein zweites Paar geschweifter Klammern hinzufügen und einen zweiten Wert an die Methode übergeben:
new_open_string = "Sammy loves {} {}." #2 {} placeholders
print(new_open_string.format("open-source", "software")) #Pass 2 strings into method, separated by a comma
Sammy loves open-source software.
Um eine weitere Ersetzung hinzuzufügen, haben wir ein zweites Paar geschweifte Klammern in den ursprünglichen String eingefügt. Dann haben wir zwei Strings in die str.format()-Methode übergeben, indem wir sie durch ein Komma getrennt haben.
Nach derselben Syntax können wir zusätzliche Ersetzungen hinzufügen:
sammy_string = "Sammy loves {} {}, and has {} {}." #4 {} placeholders
print(sammy_string.format("open-source", "software", 5, "balloons")) #Pass 4 strings into method
Sammy loves open-source software, and has 5 balloons.
In sammy_string haben wir 4 Paare geschweifte Klammern als Platzhalter für die Variablenersetzung hinzugefügt. Dann haben wir 4 Werte in die str.format()-Methode übergeben, wobei wir Zeichenfolgen- und Ganzzahl-Datentypen gemischt haben. Jeder dieser Werte ist durch ein Komma getrennt.
##Neuanordnung von Formatierern mit Positions- und Schlüsselwortargumenten
Wenn wir geschweifte Klammern ohne Parameter leer lassen, wird Python die über die str.format()-Methode übergebenen Werte in der Reihenfolge ersetzen. Wie wir bisher gesehen haben, sieht eine Formatter-Konstruktion mit zwei leeren geschweiften Klammern und zwei übergebenen Werten so aus:
print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
Sammy the shark has a pet pilot fish!
Das erste Paar geschweifte Klammern wird durch den Stringwert von "shark" ersetzt, und das zweite Paar wird durch den Stringwert von "pilot fish" ersetzt.
Die Werte, die innerhalb der Methode existieren, sehen so aus:
("shark", "pilot fish")
Sie sind im Wesentlichen der Tupel-Datentyp und jeder einzelne Wert, der im Tupel enthalten ist, kann durch seine Indexnummer aufgerufen werden, die mit der Indexnummer 0 beginnt.
Wir können diese Indexnummern in die geschweiften Klammern einfügen, die als Platzhalter im ursprünglichen String dienen:
print("Sammy the {0} has a pet {1}!".format("shark", "pilot fish"))
Im obigen Beispiel wird die Ausgabe das sein, was wir erhalten, ohne Indexzahlen in die Klammern einzufügen, da wir die Werte im Tuple in der Reihenfolge aufrufen:
Sammy the shark has a pet pilot fish!
Aber wenn wir die Indexnummern mit den Parametern der Platzhalter umkehren, können wir die Werte, die in den String übergeben werden, umkehren:
print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
Sammy the pilot fish has a pet shark!
Wenn Sie eine Indexnummer von 2 in einem Tupel aufrufen, das Werte an den Indexpositionen 0 und 1 hat, rufen Sie einen Wert ab, der außerhalb des gültigen Bereichs liegt. Wenn Sie eine Indexnummer aufrufen, die außerhalb des gültigen Bereichs liegt, erhalten Sie eine Fehlermeldung:
print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
IndexError: tuple index out of range
Die Fehlermeldung, die wir sehen, bezieht sich darauf, dass das Tupel nur Werte an den Indexnummern 0 und 1 hat, weshalb die Indexnummer 2 außerhalb des Bereichs liegt.
Lass uns ein paar weitere Platzhalter und ein paar weitere Werte hinzufügen, die wir übergeben können, damit wir besser verstehen, wie wir die Formatter ein wenig umsortieren können. Zuerst hier ist ein neuer String mit vier Platzhaltern:
print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
Sammy is a happy, smiling and blue shark!
Ohne Parameter werden die Werte, die in die str.format()-Methode übergeben werden, der Reihe nach in den String eingefügt.
Die Zeichenfolgenwerte, die im Tuplex enthalten sind, entsprechen den folgenden Indexnummern:
| glücklich | lächeln | blau | Hai |
|---|---|---|---|
| 1 | 2 | 3 |
Lass uns die Indexzahlen der Werte verwenden, um die Reihenfolge zu ändern, in der sie im String erscheinen:
print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
Sammy is a shark, blue, and smiling happy!
Da wir mit dem Indexnummer 3 begonnen haben, haben wir den letzten Wert von "shark" zuerst aufgerufen. Die anderen Indexnummern, die als Parameter enthalten sind, ändern die Reihenfolge, wie die Wörter innerhalb des ursprünglichen Strings erscheinen.
Zusätzlich zu Positionsargumenten können wir auch Keyword-Argumente einführen, die über ihren Schlüsselwortnamen aufgerufen werden:
print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
Sammy the shark made a pull request.
Dieses Beispiel zeigt die Verwendung eines Schlüsselwortarguments, das mit Positionsargumenten verwendet wird. Wir können das Schlüsselwortargument pr neben Positionsargumenten ausfüllen und diese Argumente herumbewegen, um den resultierenden String zu ändern:
print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
Sammy the pull request made a shark.
Positions- und Schlüsselwortargumente, die mit String-Formatierern verwendet werden, geben uns mehr Kontrolle über die Manipulation unserer ursprünglichen Strings durch Umordnung.
##Typ angeben
Wir können mehr Parameter innerhalb der geschweiften Klammern unserer Syntax einfügen. Wir verwenden die Formatcode-Syntax {field_name:conversion}, wobei field_name die Indexnummer des Arguments angibt, das wir im Abschnitt zur Neuordnung mit der Methode str.format() behandelt haben, und conversion auf den Umwandlungscode des Datentyps verweist, den Sie mit dem Formatter verwenden.
Der Konversionstyp bezieht sich auf den einzelnen Zeichen-Typcode, den Python verwendet. Die Codes, die wir hier verwenden werden, sind s für Zeichenfolgen, d um Dezimalzahlen (Basis 10) anzuzeigen, und f, das wir verwenden werden, um Fließkommazahlen mit Dezimalstellen anzuzeigen. Sie können mehr über die Format-Spezifikations-Mini-Sprache in der offiziellen Dokumentation von Python 3 lesen.
Lassen Sie uns ein Beispiel betrachten, bei dem ein Integer durch die Methode übergeben wird, wir ihn jedoch als Float anzeigen möchten, indem wir das Argument des Konvertierungstyps f hinzufügen:
print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
Sammy ate 75.000000 percent of a pizza!
Wir verwendeten die Syntax von {field_name:conversion} für das erste geschweifte Klammererset, um einen Float auszugeben. Die zweiten geschweiften Klammern verwenden nur den ersten Parameter {field_name}.
Im obigen Beispiel gibt es viele Zahlen, die nach dem Dezimalpunkt angezeigt werden, aber Sie können diese begrenzen. Wenn Sie f für Fließkommawerte angeben, können Sie zusätzlich die Genauigkeit dieses Wertes festlegen, indem Sie einen Punkt . gefolgt von der Anzahl der Ziffern nach dem Dezimalpunkt, die Sie einbeziehen möchten, hinzufügen.
Wenn Sammy 75,765367% der Pizza gegessen hat, aber wir keine hohe Genauigkeit benötigen, können wir die Nachkommastellen auf 3 beschränken, indem wir .3 vor den Konversionstyp f hinzufügen:
print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
Sammy ate 75.765 percent of a pizza!
Wenn wir nur eine Dezimalstelle wollen, können wir den String und die Methode wie folgt umschreiben:
print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
Sammy ate 75.8 percent of a pizza!
Beachten Sie, dass eine Änderung der Präzision dazu führt, dass die Zahl gerundet wird.
Obwohl wir eine Zahl ohne Dezimalstellen als Float anzeigen, erhalten wir einen Fehler, wenn wir versuchen, den Float durch Verwendung des d-Konvertierungstyps in einen Integer zu ändern:
print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
ValueError: Unknown format code 'd' for object of type 'float'
Wenn Sie keine Dezimalstellen anzeigen lassen möchten, können Sie Ihren Formatierer wie folgt schreiben:
print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
Sammy ate 76 percent of a pizza!
Dies wird Ihre Fließkommazahl nicht in eine Ganzzahl umwandeln, sondern stattdessen die Anzahl der nach dem Dezimalpunkt angezeigten Stellen begrenzen.
##Puffer-Variablenersetzungen
Da die Platzhalter Ersetzungsfelder sind, können Sie durch zusätzliche Parameter die Feldgröße erhöhen, um um ein Element herum Polster oder Platz zu schaffen. Dies kann nützlich sein, wenn wir eine große Menge an Daten visuell organisieren müssen.
Wir können eine Zahl hinzufügen, um die Feldgröße (in Zeichen) nach dem Doppelpunkt : in den geschweiften Klammern unserer Syntax anzugeben:
print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
Sammy has 5 red balloons !
Im obigen Beispiel haben wir der Zahl 5 eine Zeichenfeldgröße von 4 zugewiesen und dem String balloons eine Zeichenfeldgröße von 16 (weil es sich um einen langen String handelt).
Wie wir sehen, sind standardmäßig Zeichenfolgen im Feld linksbündig und Zahlen rechtsbündig. Sie können dies ändern, indem Sie einen Ausrichtungscode nach dem Doppelpunkt platzieren. < bringt den Text im Feld linksbündig, ^ zentriert den Text im Feld und > richtet ihn rechtsbündig aus.
Lass uns die Zahl linksbündig und den Text zentriert ausrichten:
print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
Sammy has 5 red balloons !
Jetzt sehen wir, dass 5 linksbündig ist und Platz im Feld vor rot bietet, während Luftballons zentriert in seinem Feld ist, mit Platz links und rechts davon.
Standardmäßig füllt Python ein Feld mit Leerzeichen, wenn wir das Feld mit Formatierern vergrößern. Wir können das ändern, indem wir das Zeichen, das wir möchten, direkt nach dem Doppelpunkt angeben:
print("{:*^20s}".format("Sammy"))
*******Sammy********
Wir akzeptieren die Zeichenfolge, die in die str.format()-Methode an Position 0 übergeben wird, da wir nichts anderes angegeben haben, einschließlich des Doppelpunktes, und anzugeben, dass wir * anstelle von Leerzeichen verwenden werden, um das Feld zu füllen. Wir zentrieren die Zeichenfolge mit ^, legen fest, dass das Feld 20 Zeichen groß ist, und zeigen auch an, dass wir mit einem Zeichenfolgenumwandlungstyp arbeiten, indem wir s einfügen.
Wir können diese Parameter mit anderen Parametern kombinieren, die wir zuvor verwendet haben:
print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
Sammy ate 76 percent of a pizza!
In den Parametern innerhalb der geschweiften Klammern haben wir die Indexfeldnummer des Fließkommawerts angegeben und den Doppelpunkt hinzugefügt, die Größe der Feldnummer angegeben und den Punkt eingeschlossen, die Anzahl der Stellen nach dem Dezimalzeichen angegeben und dann den Konversionstyp f spezifiziert.
##Verwendung von Variablen
Bis jetzt haben wir Ganzzahlen, Fließkommazahlen und Zeichenfolgen in die str.format() Methode übergeben, aber wir können auch Variablen durch die Methode übergeben. Das funktioniert wie jede andere Variable.
nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
Sammy has 8 balloons today!
Wir können Variablen sowohl für den ursprünglichen String als auch für das, was in die Methode übergeben wird, verwenden:
sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
Sammy has 8 balloons today!
Variablen können leicht für jeden Teil unserer Formattersyntax-Konstruktion ersetzt werden. Das erleichtert die Arbeit, wenn wir Benutzereingaben entgegennehmen und diese Werte Variablen zuweisen.
##Formatierer verwenden, um Daten zu organisieren
Formatierer können am besten gesehen werden, wenn sie verwendet werden, um viele Daten visuell zu organisieren. Wenn wir Benutzern Datenbanken zeigen, kann die Verwendung von Formatierern, um die Feldgröße zu erhöhen und die Ausrichtung zu ändern, Ihre Ausgabe lesbarer machen.
Lass uns eine typische for-Schleife in Python betrachten, die i, i*i und i*i*i im Bereich von 3 bis 12 ausgibt:
for i in range(3,13):
print(i, i*i, i*i*i)
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
Während die Ausgabe in einer Weise organisiert ist, laufen die Zahlen in die Spalten der anderen über, was die Lesbarkeit am Ende der Ausgabe verringert. Wenn Sie mit einem größeren Datensatz mit vielen kleinen und großen Zahlen arbeiten, kann dies ein Problem darstellen.
Lass uns Formatierer verwenden, um diesen Zahlen mehr Platz zu geben:
for i in range(3,13):
print("{:3d} {:4d} {:5d}".format(i, i*i, i*i*i))
Hier, in unseren geschweiften Klammern, haben wir den Feldnamen für die Indexnummer nicht hinzugefügt und mit dem Doppelpunkt begonnen, gefolgt von der Zahl für die Feldgröße und einem d Konvertierungstyp, da wir mit Ganzzahlen arbeiten. In diesem Beispiel haben wir die Größe jeder erwarteten Ausgabe berücksichtigt und jeweils 2 zusätzliche Zeichenplätze bereitgestellt, abhängig von der maximal möglichen Zahlengröße, sodass unsere Ausgabe so aussieht:
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
Wir können eine konsistente Feldgrößenzahl angeben, um gleichmäßige Spalten zu haben und sicherzustellen, dass wir die größeren Zahlen berücksichtigen:
for i in range(3,13):
print("{:6d} {:6d} {:6d}".format(i, i*i, i*i*i))
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
Wir können auch die Ausrichtung der Spalten manipulieren, indem wir <, ^ und > für die Textausrichtung hinzufügen, d in f ändern, um Dezimalstellen hinzuzufügen, die Indexnummern der Feldnamen ändern und mehr, um sicherzustellen, dass wir die Daten so anzeigen, wie wir es möchten.
##Fazit
Die Verwendung von Formatierern für die Variablenersetzung kann eine effektive Methode sein, um Zeichenfolgen zu verketten und Werte sowie Daten zu organisieren. Formatierer stellen eine grundlegende, aber nicht beschreibende Möglichkeit dar, um Variablenersetzungen in eine Zeichenfolge einzufügen, und sind nützlich, um sicherzustellen, dass die Ausgabe lesbar und benutzerfreundlich ist.