Der Python-Kurs: Tupel
Willemers Informatik-Ecke
for-Schleifen Python-Kurs Listen

Erzeugung und Zerlegung von Tupeln

In Python können Sie zwei oder mehrere Werte bzw. Variablen zu einer Variable vom Typ Tupel (tuple)zusammenführen. Ein typisches Beispiel dafür ist eine Koordinate oder eine Position auf einem Spielfeld, die aus x und y besteht.
position = 12, 5
Die Bestandteile eines Tupels werden also durch ein Komma getrennt und als Zeichen der Verbundenheit gern mit Klammern umgeben.
x = 12
y = 5
position = (x, y)
Ein Tupel ist immutable, also unveränderlich. Das bedeutet, dass ein Tupel bei seiner Erzeugung mit Werten belegt wird und danach nicht mehr geändert werden kann.

An die Bestandteile eines Tupels kommen Sie heran, indem Sie zwei Variablen auf die linke Seite des Zuweisungszeichens, also des Gleichheitszeichens setzen. Sollte das Tupel mehr als zwei Elemente haben, müssen auf der linken Seite entsprechend viele Variablen stehen.

x, y = position
Wenn Sie Ihre Koordinate verändern wollen, zerlegen Sie sie in ihre Bestandteile, verändern den Wert wie gewünscht und erzeugen eine neue Koordinate, die natürlich auch in derselben Variablen gespeichert werden kann wie die alte Koordinate.
x, y = position
x += 1
position = x, y
Nun steht die Position auf 13,5, ist also quasi nach rechts weitergewandert.

Mehrere Elemente eines Tupels

Natürlich können Sie auch mehr als zwei Werte in ein Tupel stecken. Bei Koordinaten in einem Raum benötigen Sie beispielsweise drei Werte: x, y und z. Auch bei einem Datum würden Sie mit Tag, Monat und Jahr drei Werte haben. Beispielsweise könnten Sie das Datum des 31.8.1996 als Tupel definieren:
datum = 31, 8, 1996
So wie das Datum zusammengesetzt wurde, kann es auch wieder auseinandergenommen werden. Dazu werden drei Variablen auf die linke Seite des Zuweisungszeichens gesetzt.
tag, monat, jahr = datum
Die Variable tag enhält anschließend 31, monat 8 und jahr enthält 1996. Alle drei Variablen sind vom Typ int. Es müssen allerdings drei Variablen sein. Bei zweien würde Python nicht wissen, wie es gerecht aufgeteilt werden kann.

Auseinandernehmen über rechteckige Klammern

Auf die Elemente eines Tupels können Sie mit rechteckigen Klammern zugreifen, wie es im Zusammenhang mit den Zeichenketten beschrieben ist.

So enthält datum[0] den Wert 31, datum[1] den Wert 8 und datum[2] den Wert 1996.

Vergleich von Tupeln

Sie können Tupel miteinander vergleichen. Dabei werden die einzelnen Elemente nacheinander verglichen.
altdatum = (31,8,1996)
neudatum = (28,12,1998)
if altdatum == neudatum:
   print("Beide sind gleich")
Sie können Tupel auch mit Kleiner und Größerzeichen vergleichen. Dann wird an dem ersten ungleichen Element festgemacht, welches kleiner ist.
altdatum = (31,8,1996)
neudatum = (28,12,1998)
print(altdatum < neudatum)
Hier ergibt sich der Wert False, weil 31 nicht kleiner als 28 ist. Das ist natürlich wenig befriedigend. Wenn Sie allerdings ein Datum in der Reihenfolge ablegen, dass zuerst das Jahr, dann der Monat und zum Schluss der Tag kommt, passt es wieder.
altdatum = (1996,8,31)
neudatum = (1998,12,28)
print(altdatum < neudatum)

Gemischte Typen

Tupel müssen nicht nur aus Zahlen bestehen. Es dürfen gern auch andere Typen sein. Sie dürfen sie sogar mischen.

Hurra, ein Auto

meinErstesAuto = ("Renault", "R4", 34, 125)
Hier ist die Reihenfolge der Werte als Marke, Typ, Leistung in PS und Geschwindigkeit in km/h angenommen.

Wollen Sie allerdings wirklich ein Auto modellieren, sollten Sie vielleicht doch besser eine Klasse verwenden.

Tupelkombination

Aber bleiben wir noch bei unserem Datum. Wir können wie oben gesehen den 31.8.1996 in einem Tupel realisieren. Auf analoge Weise können wir auch eine Uhrzeit in einem Tupel speichern.

datum = (1996,8,31)
uhrzeit = (13,45)
Da ein Tupel unterschiedliche Typen aufnehmen kann, kann es auch Tupel aufnehmen. Sie können also ein Tupel für einen Zeitpunkt definieren, das ein Datum und eine Uhrzeit aufnimmt.
datum = (1996,8,31)
uhrzeit = (13,45)
zeitpunkt = (datum, uhrzeit)
print(zeitpunkt)
Auf dem Bildschirm sehen Sie nun:
((1996, 8, 31), (13, 45))
Wenn Sie nun versuchen, auf die Uhrzeit zuzugreifen, können Sie nicht einfach das vierte Element verwenden. Tatsächlich müssen Sie das Tupel so zerlegen, wie es zusammengesetzt wurde.
dat, uhr = zeitpunkt
h, m = uhr
print(h)
Nun haben Sie die 13 auf dem Bildschirm. Sie können dies etwas kürzer auch auf dem Weg über die rechteckigen Klammern erreichen.
print(zeitpunkt[1][0])
Auch dies ergibt die 13. Die erste Klammer greift auf das zweite Element des Zeitpunktes zu, da der Index immer bei 0 beginnt. Das ist dann die Uhrzeit. Die zweite rechteckige Klammer wählt daraus nun das erste Element und das ist die Stunde.

Übungsaufgaben

Koordinatenwanderung zum Rand

In dem Tupel pos befindet sich eine ganzzahlige Spielfeldkoordinate.
pos = 12,7
Diese soll nun diagonal in Richtung des Nullpunktes wandern und bei jedem Schritt ausgeben, welche Position erreicht ist. Sie werden die while-Schleife benötigen. Und Sie werden aufpassen müssen, wie die Schleifenbedingung lautet, damit keine Koordinate negativ wird und die Schleife rechtzeitig abbricht.

Probieren Sie es danach noch einmal mit der Koordiate 3,7!

Erhöhen der Uhrzeit

In einem Tupel zeit befindet sich die Uhrzeit aus Stunden und Minuten. Diese Uhrzeit soll um eine Minute weitergeschaltet werden. Prüfen Sie dabei, ob die 59 überschritten wird. Dann muss die Minute wieder auf 0 und die Stunde erhöht werden. Dabei wiederum müssen Sie beachten, dass die 23 nicht überschritten wird, sondern dann ebenfalls auf 0 gesetzt werden muss.

Erhöhen des Datums

Was mit der Zeit funktioniert, sollte doch für ein Datum auch gut klappen. Erhöhen Sie also das Datum in datum, das als Jahr, Monat, Tag definiert ist. Bei den Monaten wird es etwas eklig. Das einfachste ist, Sie definieren ein Tupel mit den Tagen des jeweiligen Monats und prüfen danach, ob der Monat überschritten wurde.

Ignorieren Sie ruhig das Schaltjahr. Außer natürlich wenn Sie die if-Anweisung noch einmal üben wollen.