Python-Kurs / Tupel und das Entpacken von Sequenzen verstehen
Ein Tupel ist eine geordnete Folge, deren Verweise auf die enthaltenen Elemente sich nicht ersetzen lassen. Tupel eignen sich für kurze Datensätze und mehrere Rückgabewerte; veränderbare Objekte innerhalb eines Tupels bleiben jedoch veränderbar.
Tupel erzeugen und die Grenze der Unveränderlichkeit erkennen
Für ein Tupel ist das Komma entscheidend. Klammern machen die Gruppierung gut lesbar, sind aber bei einem gewöhnlichen, durch Kommas getrennten Ausdruck nicht immer erforderlich. Ein Tupel mit einem Element braucht ein abschließendes Komma: (3500,). (3500) ist dagegen nur die geklammerte ganze Zahl 3500.
Speichern Sie das folgende vollständige Beispiel als tuple_form.py und führen Sie es mit python tuple_form.py im Projektterminal aus:
single = (3500,)
record = ("lunch", 8000)
print(type(single).__name__)
print(record[0])
Die beiden Ausgaben sind tuple und lunch, jeweils in einer eigenen Zeile. Die erste bestätigt den Typ des Einzelelement-Tupels; die zweite liest den ersten Wert des Datensatzes. Wie bei Listen beginnt die Zählung bei null.
Die feste äußere Struktur sagt nicht, dass jedes referenzierte Objekt fest ist. Bei pair = ([1], 2) scheitert pair[0] = [], weil es einen Tupelverweis ersetzen würde. pair[0].append(3) ist dagegen zulässig und führt zu ([1, 3], 2): Die enthaltene Liste wird geändert. Die Python-Einführung zu Tupeln und Sequenzen erläutert diese Unterscheidung.
Ein vollständiges Beispiel zum Entpacken ausführen
Speichern Sie den gesamten Code als tuples.py in UTF-8 im Übungsordner. Starten Sie mit dem Projektinterpreter python tuples.py; unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein. Weitere Pakete oder Dateien sind nicht nötig.
record = ("lunch", 8000, "food")
name, amount, category = record
print(name, amount, category)
first, *rest = [3500, 8000, 2500]
print(first, rest)
a, b = 1, 2
a, b = b, a
print(a, b)
Erwartete Ausgabe:
lunch 8000 food
3500 [8000, 2500]
2 1
Die erste Zuweisung entpackt den Datensatz nach Position: name erhält lunch, amount erhält 8000 und category erhält food. Die Bedeutung der Namen wird vom Programm festgelegt, nicht automatisch aus dem Tupel erkannt.
Im zweiten Teil bekommt first den ersten Wert der Liste. *rest sammelt die übrigen Werte als neue Liste, daher die eckigen Klammern in der zweiten Ausgabe. Zuletzt werden die Werte von a und b getauscht. Die rechte Seite wird ausgewertet, bevor die Ergebnisse den linken Namen zugewiesen werden.
Anzahl und Bedeutung der Werte beim Entpacken prüfen
Ohne ein Sternziel muss die Anzahl der Werte genau der Anzahl der Zielnamen entsprechen. Drei Namen benötigen drei Elemente. Bei zu wenigen oder zu vielen Elementen entsteht ValueError. Gerade Daten aus Dateien oder Netzwerkantworten sollten Sie auf ihre erwartete Form prüfen, bevor Sie feste Positionen voraussetzen.
Ein Sternziel wie *rest nimmt die übrigen Elemente als Liste auf; diese kann auch leer sein. Innerhalb derselben Zielgruppe ist nur ein solches Sternziel zulässig. Das Beispiel funktioniert mit einer Liste auf der rechten Seite: Entpacken ist nicht auf Tupel beschränkt. Die Sprachreferenz zu Zuweisungen beschreibt die Regeln.
Auch ein Dictionary ist iterierbar. Entpacken Sie es direkt, erhalten Sie dessen Schlüssel, nicht automatisch Schlüssel-Wert-Paare. Verwenden Sie beim Durchlaufen items(), wenn Sie je Eintrag Schlüssel und Wert gemeinsam benötigen. Dass die Anzahl passt, garantiert also noch nicht, dass Sie die beabsichtigte Information entpacken.
Entpacken ersetzt keine fachliche Prüfung. Ein Datensatz mit drei Werten kann weiterhin einen ungültigen Betrag oder vertauschte Feldbedeutungen enthalten. Benennen Sie die Positionen eindeutig und prüfen Sie bei externen Daten sowohl Struktur als auch Inhalt.
Zwischen Listen, Tupeln und benannten Feldern wählen
| Aufgabe | Geeignete Struktur |
|---|---|
| Eine wachsende Folge von Beträgen | Liste für das Hinzufügen und Entfernen von Elementen |
| Ein kurzer Datensatz mit klaren festen Positionen | Tupel, etwa Name und Betrag |
| Viele Felder, deren Bedeutung über Namen verständlich sein soll | Dictionary oder eine passend definierte Datenklasse |
Ein Tupel kann nur dann Dictionary-Schlüssel sein, wenn alle enthaltenen Elemente hashbar sind. Hashbarkeit ist eine Eigenschaft für die stabile Verwendung als Schlüssel; ein Tupel mit einer Liste erfüllt sie nicht. ("lunch", 8000) kann als Schlüssel dienen, ([1], 2) führt dabei zu TypeError. Die Dictionary-Referenz beschreibt die Anforderungen an Schlüssel.
- Entfernen Sie im vollständigen Beispiel nur das dritte Element
"food"ausrecord. Die Zuweisung an drei Zielnamen muss mitValueErrorscheitern. - Verwenden Sie für den verkürzten Datensatz anschließend zwei Zielnamen,
name, amount, und passen Sie auch den zugehörigenprint-Aufruf an. Das Programm soll wieder laufen. Nur die Zuweisung zu ändern und danach den fehlenden Namencategoryauszugeben, wäre ein anderer Fehler. - Stellen Sie Datensatz, drei Namen und Ausgabe wieder her und vergleichen Sie die vollständige Originalausgabe.
- Prüfen Sie getrennt das Tupel
pair = ([1], 2): Vergleichen Sie die fehlschlagende Ersetzung vonpair[0]mit dem erfolgreichen Anhängen an dessen Liste.
Wenn Sie die Bedeutung zahlreicher Positionsnummern nachschlagen müssen, sind benannte Felder oft verständlicher. Die Listenübung zu Änderungen und Kopien hilft beim Prüfen, ob Sie eine feste äußere Folge oder tatsächlich unabhängige verschachtelte Daten benötigen.




