Arbeiten mit Text — Indexing, Slicing und f-Strings
Teile aus Text herausziehen, Text bereinigen und ändern und mit f-Strings lesbare Begrüßungen bauen — plus die Regel, dass Text sich nicht an Ort und Stelle verändern lässt.
Wie möchtest du lernen?
Das Problem, das wir lösen
Ein Name kommt aus einem Formular: " Rafi Ahmed ". Überflüssige Leerzeichen an beiden Enden, und du brauchst nur den Vornamen, plus eine Begrüßung — "Welcome, Rafi!".
Diese Arbeit — Text bereinigen, Teile herausziehen und daraus etwas Neues bauen — gehört zu den häufigsten Aufgaben überhaupt. Benutzernamen, E-Mail-Adressen, IDs, Dateinamen, Adressen, was auch immer eine API zurückliefert: alles Text.
Und noch etwas wird dir heute klar werden, das dich Stunden kostet, wenn du es nicht weißt: In Python lässt sich Text nicht verändern. name.upper() zu schreiben macht name nicht groß. Warum das so ist und was du stattdessen tust, ist der wertvollste Teil dieses Kapitels.
Am Ende dieses Kapitels kannst du
- Ein beliebiges Zeichen per Index erreichen, von vorn und von hinten
- Einen Abschnitt mit einem Slice herausschneiden
- Text mit
strip,upper,lower,replaceundsplitbereinigen und ändern - Erklären, warum das Ergebnis einer Methode aufbewahrt werden muss
- Mit f-Strings lesbare Begrüßungen bauen
Voraussetzungen: Arithmetik — Division, Reste und die Dezimal-Falle.
Anführungszeichen — eins oder zwei
Für Python sind 'Rafi' und "Rafi" dasselbe. Beides gibt es, damit Anführungszeichen im Text keine Probleme machen:
print("It's working")
print('She said "yes"')It's working
She said "yes"Drei Anführungszeichen halten Text, der über mehrere Zeilen geht:
note = """Dear customer,
Your order is confirmed.
Thank you."""
print(note)Dear customer,
Your order is confirmed.
Thank you.Und \n erzeugt einen Zeilenumbruch, \t einen Tabulator:
print("Name:\tRafi\nRole:\tLearner")Name: Rafi
Role: LearnerLänge und Index
word = "PYTHON"
print(len(word))
print(word[0])
print(word[1])
print(word[-1])
print(word[-2])6
P
Y
N
OZwei Dinge solltest du dir sofort fest einprägen:
Die Zählung beginnt bei null. Das erste Zeichen hat den Index 0, das zweite 1. In einem Sechs-Zeichen-Wort ist der letzte Index also 5, nicht 6. Fragst du nach word[6], kommt ein IndexError. Dieser „einer zu viel“-Fehler ist so verbreitet, dass er einen eigenen Namen hat: ein Off-by-one-Fehler.
Negative Indexe zählen von hinten. word[-1] ist das letzte Zeichen, word[-2] das davor. Das ist der einfache Weg ans Ende zu kommen, ohne die Länge zu kennen.
Slices — einen Abschnitt herausschneiden
word = "PROGRAMMING"
print(word[0:7])
print(word[7:11])
print(word[:7])
print(word[7:])
print(word[-4:])PROGRAM
MING
PROGRAM
MING
MINGword[a:b] heißt von a bis zu, aber nicht einschließlich b. Der Endindex bleibt draußen.
Das fühlt sich anfangs umständlich an, bringt dir aber etwas: word[0:7] und word[7:11] fügen sich genau aneinander, ohne wiederholtes und ohne übersprungenes Zeichen. Die erste Zahl wegzulassen heißt „von ganz am Anfang“, die zweite wegzulassen heißt „bis ganz ans Ende“.
Text kann nicht verändert werden
Das ist die wichtigste Regel in diesem Kapitel:
name = "rafi"
name[0] = "R"Traceback (most recent call last):
File "D:\python-lab\lesson-06\demo.py", line 2, in <module>
name[0] = "R"
~~~~^^^
TypeError: 'str' object does not support item assignmentDie erste File-Zeile zeigt den vollen Pfad deiner Datei, auf deinem Computer sieht sie also anders aus. Die eigentliche Meldung steht in der letzten Zeile: Ein Zeichen in bestehendem Text lässt sich nicht austauschen. Wie funktionieren dann Großschreiben und Trimmen überhaupt? Die Antwort: Python ändert das Original nicht, es baut einen neuen Textbaustein und gibt ihn zurück.
name = " rafi "
print(name.strip())
print(name.strip().upper())
print("After all that, name is still:", name)rafi
RAFI
After all that, name is still: rafiname hat sich überhaupt nicht verändert. strip() hat einen neuen, sauberen Text erzeugt, und wir haben ihn nur ausgegeben — wir haben ihn nie gespeichert.
Du musst das Ergebnis also aufbewahren:
name = " rafi "
clean_name = name.strip().upper()
print(clean_name)RAFIOder du weist es derselben Variablen wieder zu — name = name.strip(). Dieser eine Fehler, eine Methode aufrufen und das Ergebnis fallen lassen, passiert am Anfang jedem. Und er wirft keinen Fehler, deshalb dauert es eine Weile, bis man ihn findet.
Nützliche Methoden
raw = " Rafi Ahmed "
print(raw.strip())
print(raw.strip().lower())
print(raw.strip().upper())
print(raw.strip().replace(" ", "_"))
print(len(raw), len(raw.strip()))
print("rafi" in raw.lower())Rafi Ahmed
rafi ahmed
RAFI AHMED
Rafi_Ahmed
14 10
Truestrip()— entfernt Leerraum am Anfang und am Ende (nicht in der Mitte)lower()/upper()— ändert die Groß-/Kleinschreibungreplace(a, b)— setztbüberall ein, woavorkamin— sagt, ob ein Textstück in einem anderen vorkommt
Und split() zerlegt Text in Teile:
full_name = "Rafi Ahmed Khan"
parts = full_name.split(" ")
print(parts)
print(parts[0])
print(len(parts))['Rafi', 'Ahmed', 'Khan']
Rafi
3Das Ding in den eckigen Klammern ist eine Liste, die hat später im Kurs ein eigenes Kapitel. Bis dahin reicht es zu wissen: split() liefert die Teile so zurück, und ein Index holt einen einzelnen Teil heraus.
Vergleichen geht nur mit sauberem Text. Wenn ein Benutzer"Rafi "tippt, ist das nicht gleich"rafi"— ein Leerzeichen am Ende und ein Großbuchstabe machen zwei Unterschiede. Deshalb ist.strip().lower()vor dem Vergleichen in echten Projekten fast schon Pflicht.
f-Strings — der einfache Weg, eine Begrüßung zu bauen
Text und Zahlen zu mischen war bisher umständlich. Ein f-String macht es einfach: ein f vor dem Anführungszeichen, und in die geschweiften Klammern {} kommt rein, was du willst:
name = "Rafi"
items = 3
price = 12.5
print(f"Hello, {name}!")
print(f"{items} items cost {items * price}")
print(f"Rounded: {items * price:.2f}")Hello, Rafi!
3 items cost 37.5
Rounded: 37.50Drei Vorteile auf einen Blick: In den Klammern kann gerechnet werden (items * price), über Typen musst du nie nachdenken (Zahlen werden von selbst zu Text), und :.2f legt die Anzahl der Nachkommastellen fest — was jede Anzeige eines Geldbetrags braucht.
Schau mal, was passiert, wenn das f fehlt:
name = "Rafi"
print("Hello, {name}")Hello, {name}Kein Fehler, nur eine falsche Begrüßung. Einmal gesehen, fällt dir das später sofort auf.
Ein vollständiges Beispiel
account.py:
# Turn a raw form entry into a clean display name and a login id
raw_input_name = " Rafi Ahmed "
domain = "example.com"
clean = raw_input_name.strip()
parts = clean.split(" ")
first_name = parts[0]
last_name = parts[-1]
login_id = f"{first_name.lower()}.{last_name.lower()}"
email = f"{login_id}@{domain}"
initials = f"{first_name[0]}{last_name[0]}"
print(f"Display name : {clean}")
print(f"Login id : {login_id}")
print(f"Email : {email}")
print(f"Initials : {initials}")
print(f"Name length : {len(clean)} characters")Display name : Rafi Ahmed
Login id : rafi.ahmed
Email : [email protected]
Initials : RA
Name length : 10 charactersWarum parts[-1]? Weil ein Name auch drei Teile haben kann. Das letzte Stück von hinten zu nehmen funktioniert, ob der Name nun zwei oder drei Teile hat.
Wenn etwas schiefgeht
IndexError: string index out of range Der angeforderte Index liegt hinter dem Ende des Texts. Denk daran: Wenn len(word) gleich 6 ist, sind die gültigen Indexe 0 bis 5. Für das letzte Zeichen ist word[-1] das Sicherste.
TypeError: 'str' object does not support item assignment Du hast versucht, ein Zeichen im Text zu ändern. Das geht nicht — bau stattdessen neuen Text, zum Beispiel word = "R" + word[1:].
Ich habe die Methode aufgerufen und nichts hat sich geändert Das Ergebnis wurde nirgends gespeichert. name.strip() ändert name nicht; du brauchst name = name.strip().
strip() entfernt nicht die Leerzeichen in der Mitte strip() arbeitet nur an den beiden Enden. Um die inneren zu entfernen, nutze replace(" ", "").
Die f-String-Begrüßung kommt falsch heraus Prüfe, ob das f direkt vor dem Anführungszeichen steht. Ohne es werden die Klammern als normale Zeichen gedruckt.
NameError — der Name im f-Strings ist unbekannt Das, was du in die Klammern geschrieben hast, wurde nie angelegt oder ist falsch geschrieben.
Schritt 4 von 6 — Vorhersagen
Prüfe dein Verständnis
Was ist die Ausgabe dieser vier Zeilen?
word = "PYTHON"
print(word[0])
print(word[-1])
print(word[1:4])- AP N YTH
- BY N YTHO
- CP O YTH
- DP N YTHO
Die Absicht war, Hello, RAFI! auszugeben, aber der Name kommt klein geschrieben und immer noch mit Leerzeichen drumherum heraus. Warum?
name = " rafi "
name.strip()
name.upper()
print(f"Hello, {name}!")- AEine Methode kann an einem Textstück nur einmal aufgerufen werden, nicht zweimal
- BEin f-String kann das Ergebnis einer Methode nicht anzeigen
- C`strip()` und `upper()` verändern das Original nicht — sie liefern neuen Text zurück, also muss das Ergebnis `name` wieder zugewiesen werden
- D`strip()` kann nicht vor `upper()` aufgerufen werden; die Reihenfolge muss umgekehrt werden
Was gibt dieser f-String aus?
item = "pen"
qty = 3
price = 12.5
print(f"{qty} x {item} = {qty * price:.2f}")- A3 x pen = 37.50
- B3 x pen = 37.5
- C{qty} x {item} = {qty * price}
- D3 x pen = 3 * 12.5
Zum Antworten brauchst du ein Konto
Melde dich an, um deine Antworten zu prüfen
Die Fragen stehen oben, und sie im Kopf durchzuarbeiten ist der wichtige Teil. Melde dich an, um die Antworten, die Erklärungen und die dreistufigen Hinweise zu sehen.
Jetzt bist du dran
Schreibe eine Datei namens slug.py, die einen Titel in eine Form für Webadressen umwandelt.
Startwert: title = " Learn Python Step By Step "
Die Ausgabe soll so aussehen:
Title : Learn Python Step By Step
Slug : learn-python-step-by-step
Slug length: 25Vier Bedingungen:
- Trimme die überflüssigen Leerzeichen an beiden Enden
- Alles klein schreiben
- Die inneren Leerzeichen durch Bindestriche ersetzen
- Gib alle drei Zeilen mit f-Strings aus
Dann mach noch etwas Extra: Ändere title auf " Python for Beginners " und führe das Programm aus. Wenn der neue Titel herauskommt, ohne dass du den Code anfasst, hast du eine echte Berechnung geschrieben statt die Antworten von Hand einzutippen.
In dieser Mission steckt noch mehr
Was du oben gelesen hast, ist die vollständige Mission – nichts wurde herausgekürzt. Pro ergänzt:
- Was wirklich unter der Haube passiert – wie Python das ausführt
- Die vollständige Lösung der Übung, Schritt für Schritt erklärt
- Schwierigere Zusatzübungen
- Die Interviewfrage zu diesem Thema, mit Musterantwort
Schritt 6 von 6
Herausforderung — das Kapitel-Quiz
Zehn Fragen von leicht bis schwer. Die letzten sind absichtlich knifflig.
Melde dich an, um das Quiz zu machen