Python Tutorial, Teil 2

Datentypen für Zeichen, Zahlen und Bytefolgen

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Im zweiten Teil des Python-Tutorials machen wir uns weiter mit den grundlegenden Konzepten von Python vertraut.
Im zweiten Teil des Python-Tutorials machen wir uns weiter mit den grundlegenden Konzepten von Python vertraut. (Bild: Drilling / Python.org)

Wie bei jeder Programmiersprache bietet es sich auch bei Python an, erste Erfahrungen mit Hilfe von Zeichenkettenoperationen zu sammeln. Darüber hinaus werden wir uns in diesem Teil die unterstützen Datentypen für Zahlen und Bytefolgen ansehen.

Eine Zeichenkette (String) wird in Python auch als „Sequenz“ von Zeichen betrachtet; dies sei erwähnt, weil der Begriff „Sequenz“ in Python von besonderer Bedeutung ist. Das Speichern einer Zeichenkette in einer Variablen kann in Python wie beschrieben ohne Deklaration oder Datentyp-Definition mit

name = "Dies ist ein Text"

erfolgen. Dass mit „print“ eine Ausgabe der Variablen möglich ist, ist trivial. Wir können die Sache daher durch Verwenden einiger elementarer Funktionen etwas spannender gestalten. So zeigt etwa

print ("Die Länge dieser Zeile ist: ", len (name))

mit Hilfe der Funktion „len“ die Länge der Zeichenkette an, einschließlich Leerzeichen. Da es sich bei einem String um eine Sequenz aus Zeichen handelt, hat jedes Zeichen eine Sequenznummer beginnend mit 0, die man sich mit Hilfe von „Slices“ - gekennzeichnet durch eckige Klammern - auch gezielt ausgeben lassen kann. So gibt etwa

print ("Slice;", name[0:6])

die Zeichen 0 bis einschließlich 5 aus, in unserem Falle also „Dies i“. Folglich bedeutet der Ausdruck „[0:6]", dass alle Zeichen bis vor Sequenznummer 6 bzw. sechs Zeichen beginnend mit Sequenznummer 0 ausgegeben werden. Slices kann man übrigens nicht nur bei String-Operationen benutzen, wenngleich es hier nahe liegt. Man kann wie folgt auch auf das Angeben einer vorderen Grenze verzichten, sodass alle Zeichen von Beginn ausgegeben werden, also das Gleiche wie bei der Start-Sequenz 0:

print ("Slice;", name[:6])

Ebenso könnte man das Angeben des Endwertes weglassen, um alle Zeichen ab dem Start bis zum Ende auszugeben. Man kann als zweiten Wert durchaus auch einen negativen Wert angeben. Mit …

print ("Slice;", name[3:-2])

werden die ersten beiden Zeichen fehlen und die letzten beiden (also Endwert minus zwei).

Schleifen

Wie jede andere Sprache kennt auch Python Schleifen-Operationen. Man kann also wie folgt jedes Zeichen der Zeichenkette in einer for-Schleife ausgeben. Um den Schleifen-Block zu kennzeichnen, benötigt man wieder den Doppelpunkt am Ende des Schleifenkopfes und die Einrückungen bei den Schleifenoperationen:

for zeichen in name:
   print (zeichen)

Die neue Variable „zeichen“ wird dabei quasi beim Interpretieren der Schleife definiert. Da sie mit der Variablen „name“ interagiert, wird sie automatisch vom Typ String sein. Selbstverständlich lassen sich auch hier wieder Slices verwenden und nur die Zeichen 0 bis 5 ausgeben:

for zeichen in name[:6]:
   print (zeichen)

Übrigens lassen sich Strings wahlweise unter Benutzung von Anführungszeichen ('), doppelten Anführungszeichen (") angeben. Strings in dreifachen Anführungszeichen (''') oder (""") haben die Besonderheit, dass sie sich auch über mehrere Zeilen erstrecken und dabei 'einfache' und "doppelte" Anführungszeichen enthalten können. Für Kommentare hingegen verwendet man bei einzeiligen Kommentaren die Raute (#) und bei Block-Kommentaren (mehrzeilig) drei doppelte Anführungszeichen.

Strings verknüpfen

Neben der gezeigten Indizierung bzw. dem Slicing (Schneiden) gibt es noch andere elementare String-Operationen. So kann man mit Hilfe der so genannten Konkatenation mit Hilfe des „+“-Operators zwei Strings zu einem neuen String verketten.

Eine weitere Besonderheit von Strings ist, dass sie genau wie in C, C++ oder Java zu den unveränderlichen (immutable) Datentypen gehören, wie folgendes Beispiel zeigt:

x = "Strings sind unveraenderliche Variablen!"
x[-1] = "."

Es wird zu folgender Fehlermeldung führen

Traceback (most recent call last):
   File "python", line 10, in <module>
TypeError: 'str' object does not support item assignment

Möchte man also in

name = "Dies ist ein Text"
print (name)
print ("Die Länge dieser Zeile ist: ", len (name))
print ("Slice;", name[0:5])
for zeichen in name[:6]:
   print (zeichen)

mittels

name[0] = "d"

ein bestimmtes Zeichen ersetzen, wird das nicht funktionieren, weil die Variable „name“ unveränderlich ist. Man kann aber mit Hilfe des o. g. +-Operators durchaus eine neue Zeichenkette konstruieren, die den gleichen Namen verwendet. So wird

name = name[0] + name[9:]
print (name)

funktionieren und zum Ergebnis „Dein Text“ führen, weil die Zuweisung und Auswertung der Variablen von rechts nach links passiert. So ist „name[9:]“ das Fragment „ein Text“ und „name[0]“ das Fragment „D“ aus der ursprünglichen Variablen „name“. Beide werden mit +-Operator zusammengesetzt und einer neuen Variablen „name“ zugewiesen.

Escape-Sequenzen

Wie in jeder anderen Sprache gibt es auch in Python bestimmte Zeichenfolgen zur Steuerung des Textflusses, die sich auf dem Bildschirm nicht als Einzelzeichen darstellen lassen – wie z. B. \' (einzelnes Anführungszeichen) oder \" (doppeltes Anführungszeichen) – und bei Verwendung in String-Literalen mit Hilfe von Escape-Sequenzen, durch einen Backslash, angegeben werden. Verhindern lässt sich das Auswerten von Escape-Zeichen durch Voranstellen von r oder R, etwa …

print (r"\n bewirkt einen Zeilenvorschub")

Die wichtigsten Escape-Sequenzen in Python lassen sich der Dokumentation entnehmen.

Byte-Strings

Ferner kennt Python 3 das Konzept der Byte-Strings. Python 3 verwendet die Konzepte Text und (binäre) Daten anstelle von Strings und 8-Bit Strings in Python 2.x. Das bedeutet, dass in Python 3 jeder String oder Text Unicode ist, kodiertes Unicode aber wird als Datenstring in Bytes dargestellt. Der Datentyp für Text („str“) ist nicht mit dem Datentyp für Daten („bytes“) identisch und lässt sich mit diesem auch nicht mischen.

Ein String-Objekt besteht immer aus einer Folge von Zeichen in Unicode, ein Byte-Objekt hingegen aus einer Folge von Bytes mit den Werten 0…255, die den ASCII-Werten entsprechen. So konnte man in Python 2.x durch Voranstellen von „u“ explizit Unicode erzwingen. In Python 3 ist das nicht mehr möglich und auch nicht nötig, weil Strings ja automatisch Unicode sind. Durch Voranstellen von „b“ kann man hingegen Byte-Code erzwingen.

Zahlenjongleur

Befassen wir uns abschließend noch einmal mit Zahlen-Variablen und den wichtigsten hier definierten Operationen. Neben gewöhnlichen Integer (x=123) unterscheidet Python folgende weitere Datentypen:

Bei Oktalzahlen liefert z. B. (x = 0o12) den Wert 10, bei Hexadezimalzahlen liefert (x = 0xff) den Wert 255 und ein Literal im Bytecode (x = 0b11111111) ebenfalls den Wert 255.

Python bietet zudem volle Unterstützung für Fließkommazahlen (float). Bei Operatoren mit gemischten Operanden-Typen werden Ganzzahl-Operanden nach Fließkomma konvertiert. So liefert etwa „8 * 2.5 / 2.1“ den Wert 9.523809523809524.

Python ist eine im wissenschaftlichen Umfeld entstandene und beliebte Sprache. Da zeigt sich daran, dass Python auch das Rechnen mit komplexen Zahlen unterstützt. Komplexe oder imaginäre Zahlen werden durch den Suffix „j“ oder „J“ ausgegeben; komplexe Zahlen mit einem Realteil ungleich Null mit „(real+imagj)“ und lassen sich mit der Funktion „complex(real, imag)“ erzeugen. Zum Nachvollziehen der folgenden Beispiele ist es besser, den Python-Interpreter im interaktiven Modus zu verwenden. So liefert etwa …

1j * 1J

das Ergebnis

(-1+0j)

und

1j * complex(0,1)

das Ergebnis

(-1+0j)

Listen

In Python sind auch einige zusammengesetzte Datentypen definiert, die man verwendet, um z. B. andere Werte zu gruppieren. Ein dieser zusammengesetzten Datentypen ist die Liste, definiert als Liste von durch Kommata getrennten Werten (Elementen) innerhalb von eckigen Klammern. Listenelemente müssen allerdings nicht alle vom gleichen Typ zu sein. Ist z. B. …

x = ['Eier', 'Brot', 123, 547]

Dann liefert

print (x)

['Eier', 'Brot', 123, 547]

Wie oben bei den String-Indizes gibt es auch Listen-Indizes beginnend mit 0. Auch hier lassen sich Teilbereiche von Listen bilden oder Listen zusammenfügen. Auch die eingebaute Funktion len() ist auch für Listen definiert. So liefert

print (len(x))

den Wert „4“.

Nachdem wir uns in diesen beiden ersten Teilen mit den grundlegenden Konzepten von Python vertraut gemacht haben, können wir ab dem nächsten Teil mit echter Programmierung starten. Sukzessive widmen wir uns dabei weiteren Kontrollstrukturen wie while-Schleifen sowie Funktionen und rekursiven Funktionen. Darüber hinaus sehen wir uns Konzepte wie die Modularisierung an, bevor es im fortgeschrittenen Teil dieser Workshop-Reihe mit Lambda-Operatoren und einer Einführung in den objektorientierten Programmierstil mit Python weitergeht.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45136188 / IDEs & Programmiersprachen)