Arbeiten mit Zeichenketten
Ein weiterer wichtiger Datentyp in Programmiersprachen ist die Zeichenkette aka String. Strings sind eine zusammengesetzte Datenstruktur, welche aus einer geordneten Sequenz einzelner Zeichen besteht. Ein Einzelzeichen wird als Char oder Character bezeichnet. Für Strings sind viele hilfreiche Funktion bzw. Methoden definiert, welche es zum Beispiel ermöglichen Teilstrings auszuschneiden, Leerräume am Beginn oder Ende zu entfernen oder den String in Groß- oder Kleinbuchstaben zu überführen.
String Literal
Zur Initialisierung eines String wird ein String Literal angegeben. Dazu werden einfache oder doppelte Anführungszeichen verwendet:
a = "eine zeichenkette"
b = 'eine andere zeichenkette'
Ein String ist immer einzeilig definiert. Es gibt die Möglichkeit zur Angabe von 3 Anführungszeichen ''' oder """ für die Definition von mehrzeiligen Strings:
a = """mehrzeilige
zeichen-
kette
"""
b = '''mehrzeilige
zeichen-
kette
'''
Anführungszeichen
Es gibt generell keine Präferenz ob mit einfachen oder doppelten Anführungszeichen gearbeitet wird. Es müssen nur die selben Anführungszeichen am Anfang und am Ende einer Zeichenkette verwendet werden.
Eine Zeichenkette besitzt eine dedizierte Länge, jenachdem aus wievielen Zeichen diese besteht. Mit der Build-in Funktion len kann die Länge der Zeichenkette abgefragt werden:
a = "eine 34 Zeichen lange Zeichenkette"
len(a) # 34
String Escaping
Für Strings in Python ist der Backslash \ als Escape-Zeichen definiert. Mit diesem Zeichen wird kein Text repräsentiert, sondern dem nachfolgenden Zeichen eine besondere Bedeutung zugeordnet.
Als einfaches Beispiel kann durch das Escape-Zeichen in einem String ein ' oder " eingebettet werden, obwohl das String Literal mit diesem Zeichen definiert wird. Im Beispiel 'Joe\'s Pub' verliert das Zeichen ' die Funktion des Stringabschlusses und wird als normales Zeichen im String verwendet:
name = 'Joe\'s Pub'
Ein weiteres gängiges Sonderzeichen wäre der Zeilenumbruch, welcher mit \n angegeben werden kann.
Angabe des Backslash
Durch das Escaping kommt dem Backslash eine besondere Bedeutung in Strings zu. Wenn man den Backslash als einfaches Zeichen in einem String nutzen will, muss dieser selbst escaped werden. Dies geschieht einfach durch eine Verdopplung: \\
Verständnisfrage
Überlegen Sie wie man die folgende Tabelle mit einem einzeiligen String und Escape-Zeichen erzeugen könnte:
+-----+-----------+------------+
| Nr. | Name | Geburtstag |
+-----+-----------+------------+
| 1 | Hansi | 12.10.1989 |
+-----+-----------+------------+
| 2 | Katharina | 03.06.1975 |
+-----+-----------+------------+
| 2 | Freddie | 29.02.1981 |
+-----+-----------+------------+
Operationen mit Zeichenkette
Ähnlich zu Zahlen sind auch für Strings Operationen definiert. Da mit Strings nicht gerechnet werden kann, gibt es grundsätzlich nur 2 sinnvolle Operationen für Strings.
Konkatenation
Mit der Konkatenation oder Zusammenführung können mindestens 2 Strings zu einem längeren String zusammengeführt werden. Als Operator wird in Python das + Symbol verwendet.
Im folgenden werden die beiden Strings in den Variablen a und b zu einem längeren String in der Variable c konkateniert:
a = "erster teil"
b = "zweiter teil"
c = a + " --- " + b
print(c) # erster teil --- zweiter teil
Vervielfachung
Durch eine Multiplikation mit einer Ganzahl kann ein String vervielfältigt werden:
x = " :-) " * 3
print(x) # :-) :-) :-)
Indexierter Zugriff
Ein String besteht aus einer geordneten Menge (Sequenz) von Einzelzeichen. Dabei kann jedes Zeichen des Strings über einen Index referenziert werden. Für die Referenzierung kann ein positivier Index (von links mit 0 beginnend) oder ein negativer Index (von rechts mit -1 beginnend) gewählt werden.
Der String ein string hätte eine Länge von 10. Somit könnte das erste Zeichen mit 0 oder mit -10 und das letzte Zeichen mit 9 oder -1 referenziert werden.
Index
Index
In Python kann eine Position im String mit eckigen Klammern und dem Index als Ganzzahl angesprochen werden. Im folgenden Beispiel wird der String ein string in der Variable ex definiert. Als Beispiel kann das erste Zeichen e mit ex[0] und das letzte Zeichen g mit ex[-1] abgefragt werden:
ex = "ein string"
print(ex[0]) # e
print(ex[-1]) # g
Teilstrings mit Slicing
In Python ist für den Datentyp String das sog. Slicing definiert. Durch die Angabe eines Startindex und eines Endindex kann ein Teilbereich eines Strings ausgeschnitten werden. Syntaktisch werden die Indizes mit : getrennt in eckigen Klammern angegeben. Ähnlich zum Zugriff auf einen einzelnen Index können auch negative Indexangaben gemacht werden.
Im Beispiel wird im String "Am Abend gehe ich gerne Laufen" der Teilstring "Abend" über den Startindex 3 und den Endindex 8 ausgeschnitten.
a = "Am Abend gehe ich gerne Laufen"
print(a[3:8]) # Abend
Wenn man das Beispiel etwas genauer unter die Lupe nimmt, wird ersichtlich, dass beim Slicing der Startindex inklusive und der Endindex exklusive ist. Konkret ist also der Startindex im Teilstring als erstes Zeichen enthalten, der Endindex jedoch nicht mehr:
012345678901234567890123456789
Am Abend gehe ich gerne Laufen
^ ^
Verständnisfrage
Versuchen Sie andere Wörter aus dem String "Am Abend gehe ich gerne Laufen" über Slicing auszuschneiden. Nutzen Sie dazu auch negative Indexangaben. Überprüfen Sie Ihre Experiment mit einem Python Interpreter.
Implizite Indexangabe
Als syntactic Sugar ist es möglich im Slicing die Indexangabe auszusparen. Implizit wird für den Startindex 0 und für den Endindex die Länge des Strings angenommen.
a = "Am Abend gehe ich gerne Laufen"
print(a[:]) # Am Abend gehe ich gerne Laufen
print(a[:3]) # Am
print(a[24:]) # Laufen
Negative Indexangabe
Es ist auch möglich im Slicing einen negativen Wert für den Start- bzw. Endindex anzugeben. Als Beispiel könnte man sich die Extension eines Dateinahmens aus einem String ausschneiden (sofern dieser die Länge 3 hat):
ex1 = "Urlaubsbild.jpg"
ex2 = "Ein_anderes_Urlaubsbild.png"
print(ex1[-3:]) # jpg
print(ex2[-3:]) # png
Schrittweite
Für das Slicing kann eine Schrittweite angegeben werden. Damit könnte zum Beispiel bewerkstelligt werden, dass nur jedes zweite Zeichen in den Teilstring integriert wird. Die Schrittweite wird durch einen weiteren : innerhalb der eckigen Klammern angegeben.
a = "Am Abend gehe ich gerne Laufen"
a[3:8:2] # Aed
Die Schrittweite kann auch einen negativen Wert erhalten, somit wird im Slicing der Teilstring von hinten nach vorne aus dem original String ausgeschnitten. Bei einer negativen Schrittweite ist darauf zu achten, dass die Schritte vom Startindex zum Endindex auch in umgekehrter Reihenfolge durchgeführt werden:
a = "Am Abend gehe ich gerne Laufen"
a[7:2:-1] # dnebA
Verständnisfrage
Überlegen Sie sich, welcher Startindex bzw. Endindex festgelegt werden muss um den Originalstring komplett umzudrehen. Also wie kann durch Slicing der String "Am Abend gehe ich gerne Laufen" in den String "nefuaL enreg hci eheg dnebA mA" überführt werden?
Typkonvertierungen
Im Abschnitt Arbeiten mit Zahlen wurden die Datentypen int und float eingeführt. Eine Zahl kann immer in einen String überführt werden. Ein String kann nur unter gewissen Umständen in eine Zahl umgewandelt werden. Die Umwandlung eines Wertes von einem Datentyp in einen anderen Datentyp nennt man Typkonvertierung.
Für die Typkonvertierung in einen String gibt es die Built-in Funktion str. Im Beispiel wird die Zahl 10 in einen String konvertiert:
a = str(10)
print(type(a)) # <class 'str'>
Strings können über die Funktionen int oder float in eine Ganzzahl oder Kommazahl überführt werden. Am Beispiel der Funktion int ist eine Konvertierung nur möglich wenn sich eine Ganzzahl im String enthält. Die Funktion int würde einen ValueError erzeugen, wenn die Konvertierung fehlschlägt. Im folgenden Beispiel wird erfolgreich versucht den String "123456" in eine Ganzzahl zu überführen:
a = int("123456")
print(type(a)) # <class 'int'>
In einem anderen Beispiel wird versucht den String "abcd" in eine Ganzzahl zu konvertieren:
b = int("abcd")
Der String "abcd" lässt sich jedoch nicht in eine Ganzahl konvertieren und führt daher zu folgendem Fehler:
ValueError: invalid literal for int() with base 10: 'abcd'
Mit der Funktion float kann ein String in eine Kommazahl überführt werden. So kann zum Beispiel der String "12.35434" in eine Kommazahl überführt werden:
a = float("12.35434")
print(type(a)) # <class 'float'>
Kommandozeilen Ein- und Ausgabe
Die ersten Programme werden vorrangig für die Kommandozeile geschrieben werden. Eine Kommandozeile ist eine Textbasierte Benutzerschnittstelle für einen Computer, aus diesem Grund sind String für die Erstellung von Kommandozeilenprogrammen essentiell. Für die Gestaltung der Benutzereingabe bzw. -ausgabe können die Python Funktionen input und print verwendet werden.
Mit print kann eine beliebige Zeichenkette auf der Kommandozeile ausgegeben werden:
print('Hello world')
Mit der Funktion input wird eine Eingabe über die Kommandozeile von Benutzer:innen abgefragt. Die Eingabe ist in diesem Fall vom Datentyp str. Mit dem Drücken der Enter-Taste wird die Eingabe auf der Kommandozeile abgeschlossen.
name = input('Gib deinen Namen ein:')
Formatierte Ausgabe
Innerhalb einer Zeichenkette können Platzhalter {} definiert werden, welche durch die Funktion format mit beliebigen Werten gefüllt werden können.
template = "Name: {}, Alter: {}"
print(template.format("Peter", 42)) # Name: Peter, Alter: 42
Die Reihenfolge der Platzhalter {} korrespondiert mit der Reihenfolge wie die Parameter an die Funktion format übergeben werden.
Neben dem reinen Ersetzen können auch komplexere Formatierungen durchgeführt werden. Python hat dazu eine kleine "Mini-Sprache" integriert. Eine detailierte Beschreibung dieser Mini-Sprache findet sich in der Python Dokumentation.
res = "Kosten: € {:> 8.2f}".format(159.9868)
print(res) # Kosten: € 159.99