Der Python-Kurs: Strings
Willemers Informatik-Ecke
Die Schleife while Python-Kurs Die Schleife for

Inhalt dieser Seite Strings bezeichnet der Programmierer das, was der Normalbürger Texte nennen würde. Meist sind es nur kurze Zeichenketten oder auch mal ganze Sätze. Um einen bestimmten Text, also beispielsweise Ihren Namen, in einem Programm verarbeiten zu können, müssen Sie ihn als Literal definieren. Diese Literale können dann Variablen zugeordnet werden.

Stringliterale, also die Werte, werden durch Anführungszeichen oder Hochkommata eingeschlossen. Mehrzeilige Literale können durch dreifache Anführungszeichen gebildet werden.

gruss = "Hallo!"
name = 'Arnold'
lyrik = """When I see a bird that
walks like a duck and swims like a duck and quacks like a duck,
I call that bird a duck.
(James Whitcomp Riley)"""

Wurde eine Variable mit einem String belegt, liefert die Funktion type als Typen str zurück.

$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> gruss = "Hallo!"
>>> type(gruss)

>>> quit()

Operatoren für Zeichenketten

Python bietet zwei Operatoren, die bei Strings eine besondere Bedeutung haben. Wir lernen daraus: Operatoren (und Funktionen) sind abhängig von dem Typ, für den man sie verwendet.

Die rechteckigen Klammern: Ausschnitte aus Strings

Strings haben eine gewisse Verwandtschaft zu Listen und wie diese die rechteckigen Klammern. Da die Behandlung von Listen und Strings an vielen Stellen gleich ist, lernen Sie hier also auch gleich etwas für das spätere Programmiererleben.

Über die rechteckigen Klammern können Sie Teile der Zeichenkette aus einer Zeichenkettenvariablen ausschneiden. Befindet sich zwischen den rechteckigen Klammern nur eine Zahl, wird nur ein Zeichen geholt, welches aber selbst wieder vom Typ str ist. Es gibt also keinen gesonderten Typ für einzelne Zeichen.

Name = "James Bond"
print(Name[1])
Die Ausgabe liefert ein a, weil der erste Buchstabe auf der Position 0 steht.

Mit zwei durch Doppelpunkt getrennten Werten können Anfangs- und Endposition der gesuchten Zeichenkette festgelegt werden. Der folgende print()-Aufruf liefert also ame.

Name = "James Bond"
print(Name[1:3])
Mit der rechteckigen Klammer können Sie auf verschiedene Weise Teile eines Textes aus einer Zeichenkette ausschneiden.
s[i] liefert den i-ten Buchstaben
s[n:m] liefert den Bereich vom n-ten bis zum m-ten Element
s[:n] liefert den Bereich vom Anfang bis zum n-te Element
s[n:] liefert den Bereich ab dem n-ten Element

Negative Werte zwischen die rechteckigen Klammern indizieren von hinten. -1 liefert den letzten Buchstaben, -2 den vorletzten und so weiter.

Fehler

Ist allerdings ein Wert zwischen den rechteckigen Klammern größer oder gleich der Länge der Zeichenkette, gibt es eine Exception.

Über die rechteckigen Klammern können einzelne Buchstaben in einer Zeichenkette nicht verändert werden.

Codierung von Zeichen in Strings

Buchstaben in Strings sind durchnummeriert. In der ursprünglichen Kodierung stand für jeden Buchstaben ein Byte zur Verfügung. Welche Zahl für welchen Buchstaben steht, kann man in ASCII-Tabellen nachschlagen. Für einen Programmierer ist das aber weder notwendig noch empfehlenswert.

Der Großbuchstabe A wird beispielsweise mit 65, B mit 66 usw. kodiert. Wichtig ist, dass Buchstaben und Ziffern in allen Kodierungen aufsteigend und lückenlos kodiert werden. Kleinbuchstaben beginnen bei 97 und Ziffern mit der 0 bei 48.

Diese Kodierungen lassen sich mit der Funktion ord("A"), ord("a") und ord("0") ermitteln. Sie erhalten 65, 97 und 48.

Sie können nun beispielsweise den Buchstaben um einen Wert verschieben, also aus dem A ein B, aus dem B ein C usw. machen. Sicher haben Sie als Kind auch schon einmal so geheime Botschaften verschlüsselt. Der Informatiker spricht von der Caesar-Chiffre.

buchstabe  = "G"
zahlencode = ord(buchstabe) + 1
kodiert    = chr(zahlencode)

Wenn Sie buchstabe+1 berechnen, erhalten Sie einen Fehler, weil Python Buchstaben und Zahlen nicht einfach mischen will. Also erzeugen Sie mit ord die Kodierung des Buchstabens, erhöhen diese um 1 und wandeln das Ergebnis mit chr wieder in einen Buchstaben.

UTF-8

Aber was, um alles in der Welt ist UTF-8? Das ist eine lange, traurige Geschichte, deren Knackpunkt ist, dass ein Byte nur 256 Zustände annehmen kann und die Anzahl der internationalen Sonderzeichen erheblich größer ist. Auf dem Weg zu UTF-8 hat man alle paar Jahre eine andere Lösungen probiert. Und es steht zu erwarten, dass auch Windows dort irgendwann vollständig angekommen sein wird.

Python verwendet seit Version 3 standardmäßig UTF-8 im Quelltext, lässt also Umlaute zu. Darauf ist auch IDLE (die mit Python mitgelieferte IDE) eingestellt. Wird unter Windows, das oft noch mit UTF-8 fremdelt, der Standardeditor verwendet, kann es Schwierigkeiten geben.

Stringfunktionen

Konvertierung Zahlen und Zeichenketten

Zeichenketten eignen sich nicht zum Rechnen. Aber beispielsweise nach der Eingabe durch die Funktion input() enthält eine Variable eine Zeichenkette.

Enthält die Eingabe nur Zahlen, die zum Verrechnen bestimmt sind, müssen sie vorher in Zahlentypen umgewandelt werden. Dabei helfen die Funktionen int() und float() oder die Funktion eval(). Als Parameter erhalten sie jeweils die Zeichenkette. int() liefert einen ganzzahligen Wert zurück, float() eine Fließkommazahl, also eine mit Nachkommastellen.

ganzzahlvar = int(zeichenkette)
nachkommavar = float(zeichenkette)
Oder allgemeiner: Um aus einer Zeichenkette einen Wert zu ermitteln, verwendet man die Funktion eval(). Die Funktion interpretiert komplette Python-Ausdrücke und ist aus diesem Grund ein potentielles Einfallstor für Befehls-Injection. Darum sollte es mit Bedacht verwendet werden.
zahlvar = eval(zeichenkette)
zahlvar = float(zeichenkette) # Alternative für Fließkommazahlen
zahlvar = int(zeichenkette) # Alternative für ganzzahlige Werte
Um einen Zahlenwert in eine Zeichenkette zu wandeln, wird die Funktion str() verwendet.
zeichenkette = str(zahlvar)

Sonder- und Steuerzeichen

Neben den Buchstaben und Ziffern enthalten Strings auch Sonderzeichen. So kann man innerhalb eines Strings mehrere Zeilen ablegen, indem man das Sonderzeichen für einen Zeilenumbruch \n einfügt.

Mit dem Tabulatorzeichen \t können Abstände zwischen Texten gesetzt werden. Dabei wird die nächste durch 8 teilbare Bildschirmposition angesprungen.

Da der Backslash \ zur Einleitung der Sonder- und Steuerzeichen verwendet wird, kann er leider nicht so einfach in den Text eingesetzt werden, ohne interpretiert zu werden. Leider hat Microsoft sehenden Auges dieses als Verzeichnistrenner verwendet. Damit müssen nun Windows-Programmierer einen Backslash verdoppeln, wenn Sie das Zeichen verwenden wollen. Kleiner Trost: Inzwischen kann vom Programm aus auch der Slash / als Verzeichnistrenner verwendet werden.
\n Zeilenumbruch
\t Tabulatorzeichen
\\ \ als Zeichen

Ausgabe mit print

Die Ausgabe erfolgt mit der Funktion print(). Es können mehrere Werte an print() übergeben werden, die dann durch Komma zu trennen sind. Die Ausgabe erfolgt dann in der gleichen Zeile.

Soll am Ende kein Zeilenvorschub erfolgen, können Sie den Parameter end der Methode print() in ein Leerzeichen oder in einen leeren String ändern.

print("Anfang", end=" ")
print("Ende")
Nun erscheinen Anfang und Ende durch ein Leerzeichen getrennt in derselben Zeile.

Formatierte Strings für die Ausgabe

Um bei einer Ausgabe sprechende Tabellen zu erhalten, muss man die Strings aus mehreren Bestandteilen zusammensetzen und miteinander verknüpfen. Das kann sehr kleinteilig werden. Dabei hilft format.

Die Methode format() wird durch einen Punkt getrennt an die Zeichenkette gehängt. Innerhalb der Formatierungszeichenkette wird durch ein geschweiftes Klammerpaar die Position der Werte angegeben. Die Werte werden als Parameter an format() übergeben.

print("Das Quadrat von {} ist {}".format(3, 9)

In den geschweiften Klammern können die Anzahl der Vorkommastellen angegeben werden. Darauf folgt ein Doppelpunkt und dann die Anzahl der Nachkommastellen.

Die geschweiften Klammern werden mit den Werten in format nacheinander bestückt. Die Beziehungen können explizit durch die Positionen angegeben werden. Dann stehen in den geschweiften Klammern die Positionsnummern, bei 0 beginnend. Alternativ können auch Namen vergeben werden. Diese werden dann in den Klammern von format referenziert.

zahl = 12
print("Das Quadrat von {0} ist {1}".format(zahl, zahl*zahl))
print("Das Quadrat von {wert} ist {quadrat}".format(wert=zahl, quadrat=zahl*zahl))
In den geschweiften Klammern können hinter einem Doppelpunkt auch die Anzahl der Stellen angegeben werden, die die Werte einnehmen. Bei Ganzzahlenwerten können daran auch d für Dezimal und x für Hexadezimal angegeben werden.
zahl = 12
print("Das Quadrat von {0:3} ist {1:4x}".format(zahl, zahl*zahl))

Übungsaufgaben

Mein Name ist ...

Die Variable name soll den String "James Bond" enthalten.

Noch ein James Bond

Die Zubereitung des Martinis ist durcheinandergeraten. Es heißt nun "gerüttelt, nicht geschürt". Bilden Sie aus diesem String, den Sie in der Variablen m finden, den Originalspruch "geschüttelt, nicht gerührt" bilden. Sie dürfen nur Ausschnitte aus m zusammensetzen. Das geht auch, weil alle benötigten Buchstaben vorhanden sind.

Verschlüsseln mit Caesar

Erstellen Sie eine while-Schleife, die durch den String botschaft läuft und dessen Buchstaben in einem neuen String mit einer Caesar-Chiffre um 1 code ablegt.

Der Einfachheit halber benutzen wir nur Kleinbuchstaben. Alle Zeichen außer den Kleinbuchstaben sollen unverändert bleiben. Alle Kleinbuchstaben verwandeln Sie in den nächsten Kleinbuchstaben. Wenn Sie das z verschlüsseln wollen, verwenden Sie a, damit die Verschlüsselung den Buchstabenraum nicht verlässt.