Python f-Strings: Variablen lesbar in Text einbauen
- Thema
- Python
- Veröffentlicht
- Lesezeit
- 8 Min.
- Getestet mit
- Python 3.14.4
Ein f-String ist in Python ein String mit einem f vor dem Anführungszeichen. Variablen und Ausdrücke schreibst du direkt in geschweifte Klammern, und Python setzt beim Ausführen die Werte ein. Es gibt sie seit Python 3.6. Für Ausgaben im Terminal sind sie deutlich besser zu lesen als Text, den man mit + zusammensetzt.
Wie schreibt man einen f-String in Python?
Ich habe Text und Variablen zuerst mit + verbunden. So lernt man es in den meisten Tutorials als Erstes. Für den Punktestand in einem kleinen Spiel sieht das so aus:
spieler = "Mia"
punkte = 120
print(spieler + " hat " + str(punkte) + " Punkte.")Mia hat 120 Punkte.Als f-String schreibst du denselben Satz so:
spieler = "Mia"
punkte = 120
print(f"{spieler} hat {punkte} Punkte.")Mia hat 120 Punkte.Das f steht direkt vor dem ersten Anführungszeichen, ohne Leerzeichen. Anfangs habe ich immer vergessen, ob es vor die Klammer von print() gehört oder vor die Anführungszeichen. Es gehört zum String, also vor die Anführungszeichen. print() ist nur die Funktion, die den fertigen Text ausgibt. Den f-String kannst du genauso gut erst in eine Variable schreiben und später benutzen.
Vergisst du das f, gibt es keinen Fehler. Python druckt dann einfach {spieler} hat {punkte} Punkte. mit den Klammern. Stehen in einer Ausgabe geschweifte Klammern, fehlt meist das f.
Warum f-Strings besser zu lesen sind als +
Beim f-String liest du den Satz so, wie er später im Terminal steht. Mit + musst du ihn dir aus Stücken zusammensetzen, und dabei gehen schnell Leerzeichen verloren. Dann steht im Terminal „Mia hat120 Punkte.“ Im Zen of Python heißt das „Readability counts“.
Dazu kommt str(). Python verbindet mit + nur Strings mit Strings. Vergisst du das str() um die Zahl, bricht das Programm ab:
TypeError: can only concatenate str (not "int") to strEin f-String wandelt Zahlen und andere Werte selbst in Text um. Für Ausgaben im Terminal nehme ich deshalb f-Strings.
Nachkommastellen mit :.2f begrenzen
Hinter dem Namen in den geschweiften Klammern kannst du nach einem Doppelpunkt angeben, wie der Wert aussehen soll. Ich habe schon öfter .2f genutzt, wenn eine Kommazahl nur zwei Nachkommastellen zeigen soll:
zeit = 12.3456
print(f"Zeit: {zeit:.2f} Sekunden")Zeit: 12.35 SekundenDas f hinter der 2 steht hier für Kommazahl (float), nicht für f-String. Python rundet für die Ausgabe, die Variable zeit behält ihren genauen Wert. Mit .0f bekommst du die Zahl ohne Nachkommastellen, mit .1f eine Stelle.
Zwei weitere Angaben sind praktisch, wenn du Ausgaben ordentlich haben willst:
level = 7
punkte = 120
print(f"Level {level:03}")
print(f"{punkte=}")Level 007
punkte=120:03 füllt die Zahl vorne mit Nullen auf drei Stellen auf. {punkte=} gibt Name und Wert zusammen aus, das ist beim Fehlersuchen bequem. Alle Angaben, die hinter den Doppelpunkt passen, stehen in der Doku zur Format-Spezifikation (öffnet in neuem Tab).
Was in den geschweiften Klammern stehen darf
In die Klammern passt jeder Ausdruck, der einen Wert ergibt, also auch Rechnungen und Methoden wie upper(). Python rechnet ihn aus und setzt das Ergebnis ein:
spieler = "Mia"
punkte = 120
print(f"{spieler.upper()} bekommt doppelte Punkte: {punkte * 2}")MIA bekommt doppelte Punkte: 240Bei Dictionaries brauchst du Anführungszeichen in den Klammern. Nimm dort einfach die andere Sorte als außen:
spieler = {"name": "Mia", "punkte": 120}
print(f"{spieler['name']} hat {spieler['punkte']} Punkte.")Mia hat 120 Punkte.Seit Python 3.12 dürfen innen auch dieselben Anführungszeichen stehen wie außen. Mit der anderen Sorte läuft der Code aber auch auf älteren Versionen.
Willst du geschweifte Klammern als Zeichen ausgeben, schreibst du sie doppelt. Aus f"{{punkte}} = {punkte}" wird {punkte} = 120.
Wofür sich f-Strings eignen und wofür nicht
f-Strings passen überall dort, wo ein Text sofort mit festen Werten gebaut wird: Ausgaben im Terminal, Meldungen im Spiel, Dateinamen wie f"spielstand_{level}.txt". Python füllt den f-String genau in der Zeile, in der er steht. Daraus ergeben sich drei Fälle, in denen du besser zu etwas anderem greifst.
Logging
Das Modul logging baut eine Meldung nur dann zusammen, wenn sie wirklich ausgegeben wird. Dafür übergibst du Vorlage und Werte getrennt, also logging.debug("Punkte: %s", punkte). Ein f-String würde auch Meldungen fertig bauen, die am Ende gar nicht erscheinen. Wie das genau läuft, steht im Logging-HOWTO (öffnet in neuem Tab).
Datenbankabfragen
Baust du eine SQL-Abfrage mit einem f-String aus Eingaben zusammen, kann jemand über die Eingabe eigenen SQL-Code einschleusen. Das nennt man SQL-Injection. Das Modul sqlite3 hat dafür Platzhalter:
import sqlite3
verbindung = sqlite3.connect(":memory:")
verbindung.execute("CREATE TABLE spieler (name TEXT, punkte INTEGER)")
name = "Mia"
verbindung.execute("INSERT INTO spieler VALUES (?, ?)", (name, 120))
print(verbindung.execute("SELECT * FROM spieler").fetchall())[('Mia', 120)]Das ? füllt sqlite3 selbst und sicher mit den Werten aus dem Tupel. Mehr dazu in der Doku zu Platzhaltern in sqlite3 (öffnet in neuem Tab).
Vorlagen für später
Einen f-String kannst du nicht aufheben und später mit anderen Werten füllen. Dafür gibt es str.format():
vorlage = "{name} hat {punkte} Punkte."
print(vorlage.format(name="Mia", punkte=120))
print(vorlage.format(name="Tom", punkte=95))Mia hat 120 Punkte.
Tom hat 95 Punkte.Die Angaben hinter dem Doppelpunkt, etwa :.2f, funktionieren in str.format() genauso.
f-Strings in anderen Sprachen: GDScript, JavaScript, C#
Werte in Text einbauen kann fast jede Sprache, nur die Schreibweise unterscheidet sich:
| Sprache | Schreibweise |
|---|---|
| Python | f"Hallo {name}" |
| GDScript | "Hallo %s" % name oder "Hallo {name}".format({"name": name}) |
| JavaScript | `Hallo ${name}` mit Backticks |
| C# | $"Hallo {name}" |
GDScript in Godot hat keine f-Strings. Dort arbeitest du mit Platzhaltern und dem Operator % oder mit format():
extends Node
func _ready() -> void:
var spieler: String = "Mia"
var leben: int = 3
print("%s hat noch %d Leben." % [spieler, leben])
print("{name} hat noch {leben} Leben.".format({"name": spieler, "leben": leben}))Beide Zeilen geben „Mia hat noch 3 Leben.“ aus. %s steht für Text, %d für eine ganze Zahl, mehrere Werte kommen als Array hinter das %. Die Doku zu Format-Strings in GDScript (öffnet in neuem Tab) zeigt alle Platzhalter. Wie sich GDScript und Python sonst unterscheiden, steht in meinem Beitrag GDScript lernen.
t-Strings in Python 3.14
Seit Python 3.14 gibt es t-Strings. Sie sehen aus wie f-Strings, nur mit t statt f:
name = "Mia"
vorlage = t"Hallo {name}!"
print(type(vorlage))<class 'string.templatelib.Template'>Ein t-String ergibt keinen fertigen Text, sondern ein Template-Objekt, in dem Text und Werte noch getrennt liegen. Gedacht ist das für Bibliotheken, die Werte vor dem Einsetzen prüfen oder umwandeln wollen, etwa für HTML oder SQL. Für eigene Ausgaben bleibt der f-String das Richtige. Den t-String musst du am Anfang nur wiedererkennen, wenn er dir in fremdem Code begegnet. Die Einzelheiten stehen in der Doku zu string.templatelib (öffnet in neuem Tab).
Häufige Fragen
Seit wann gibt es f-Strings in Python?
Seit Python 3.6, erschienen im Dezember 2016. Eingeführt wurden sie mit PEP 498 (öffnet in neuem Tab). Die Kurzform {variable=} für Debug-Ausgaben kam mit Python 3.8 dazu.
Wofür steht das f bei f-Strings?
Das f steht für „formatted“. In der Python-Doku heißen f-Strings formatted string literals (öffnet in neuem Tab), also formatierte String-Literale. Statt f darfst du auch ein großes F schreiben.
Wie runde ich in einem f-String auf zwei Nachkommastellen?
Mit :.2f hinter dem Namen in den geschweiften Klammern, zum Beispiel f"{zeit:.2f}". Aus 12.3456 wird dann 12.35. Die Zahl in der Variable bleibt dabei unverändert, gerundet wird nur der Text.
Soll ich f-Strings oder format() benutzen?
Für Ausgaben, bei denen die Werte schon feststehen, sind f-Strings kürzer und besser zu lesen. str.format() brauchst du, wenn eine Vorlage erst später oder mehrmals mit verschiedenen Werten gefüllt wird.
Mehr zu Python für Einsteiger findest du auf der Python-Seite.
Hat dir der Beitrag geholfen?
Danke, das freut mich.
Danke für die ehrliche Antwort. Was hat gefehlt? Schreib es gern in die Kommentare.
Fehler gefunden oder eine Frage zum Code? Schreib einen Kommentar oder eine E-Mail.
Kommentare
Du brauchst kein Konto. Name und E-Mail sind freiwillig, die E-Mail-Adresse wird nicht angezeigt. Ich lese jeden Kommentar, bevor er erscheint. Mehr dazu im Datenschutz.