Zum Inhalt springen
aviral gupta

// B4.3 · ca. 25 Min. · Einstieg

Tupel und Entpacken

Nach dieser Lektion packen Sie Werte in ein Tupel und entpacken sie in Namen, schreiben leere und einelementige Tupel und sagen vorher, was sich an einem Tupel ändern lässt.

Lektion 3 von 6 in B4 Datenstrukturen

Danach können Sie

  • Werte in Tupel packen und in Namen entpacken: bei Zuweisungen, beim Tauschen und in for-Schleifen
  • Leere und einelementige Tupel richtig schreiben
  • Erklären, was die Unveränderlichkeit eines Tupels verbietet und was sie trotzdem erlaubt
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen aus Lektion B4.2: Welche Comprehensions ergeben [(0, 0), (1, 1), (2, 4)]? Wählen Sie alle zutreffenden.

    Wählen Sie alle zutreffenden aus.

  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen: Was gibt das aus?

    a, b = 1, 2
    a, b = b, a
    print(a, b)
  3. Üben · Aufgabe 3 von 7

    Setzen Sie ein Zeichen ein, sodass single ein Tupel mit einem Element ist.

    single = ("hello"____)
    single = ("hello")
  4. Üben · Aufgabe 4 von 7

    Die Schleife entpackt jedes Paar. Was gibt das aus?

    pairs = [("ana", 3), ("ben", 5)]
    total = 0
    for name, score in pairs:
        total += score
    print(name, total)
  5. Üben · Aufgabe 5 von 7

    Ordnen Sie jedem Ausdruck seinen Wert zu.

  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Beide Ziele werden in einer Anweisung zugewiesen. Was gibt das aus?

    x = [0, 1]
    i = 0
    i, x[i] = 1, 2
    print(x)
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Schreiben Sie min_max(nums), das die Liste einmal durchläuft und den kleinsten und den größten Wert als Tupel zurückgibt. Rufen Sie es mit lo, hi = min_max([4, -2, 9, 0]) auf und geben Sie beide aus. Was liefert min_max([7])?

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Eine Route aus Punkten

Eine Route ist eine Liste von (x, y)-Punkten. Jeder Punkt ist ein Tupel, weil seine beiden Werte zusammengehören und sich nie ändern. bounding_box() gibt vier Werte als ein Tupel zurück, und der Aufrufer entpackt sie in vier Namen. Die for-Schleife entpackt jeden Punkt, und eine Zeile tauscht Start und Ziel. Zum Schluss bekommt die Liste einen neuen ersten Punkt: Die Liste ändert sich, das alte Tupel nicht. Fügen Sie einen Punkt hinzu und starten Sie erneut.

main.py

# Each point is a fixed (x, y) pair, so a tuple fits.
route = [(0, 0), (3, 4), (3, 0)]


def bounding_box(points):
    """Return the smallest and largest x and y as one tuple."""
    xs = [x for x, y in points]
    ys = [y for x, y in points]
    return min(xs), min(ys), max(xs), max(ys)


left, bottom, right, top = bounding_box(route)
print("Box:", left, bottom, right, top)

for x, y in route:
    print("Point", x, y)

start, end = route[0], route[-1]
start, end = end, start
print("Swapped ends:", start, end)

origin = route[0]
route[0] = (1, 1)  # the list can change: it now holds a different tuple
print("Route:", route, "origin:", origin)

Ausführen mit

python main.py

Ausgabe

Box: 0 0 3 4
Point 0 0
Point 3 4
Point 3 0
Swapped ends: (3, 0) (0, 0)
Route: [(1, 1), (3, 4), (3, 0)] origin: (0, 0)
  • return min(xs), min(ys), max(xs), max(ys) packt vier Werte in ein Tupel.
  • start, end = end, start tauscht zwei Tupel ohne Hilfsvariable.
  • origin verweist weiter auf den alten Punkt (0, 0): Ein Listenelement zu ersetzen ändert das Tupel nicht.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 2

Drei Zahlen auf einmal

stats(nums) soll den kleinsten Wert, den größten Wert und den Mittelwert als ein Tupel zurückgeben, damit ein Aufrufer lowest, highest, mean = stats(nums) schreiben kann. Der Startcode gibt stattdessen eine Liste zurück. Sorgen Sie dafür, dass er ein Tupel zurückgibt.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Eckige Klammern bauen immer eine Liste.

  2. Hinweis 2

    Durch Kommas getrennte Werte nach return werden in ein Tupel gepackt.

  3. Hinweis 3

    return min(nums), max(nums), sum(nums) / len(nums)

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

def stats(nums: list[float]) -> tuple[float, float, float]:
    """Return the lowest value, the highest value and the mean, as one tuple."""
    return min(nums), max(nums), sum(nums) / len(nums)
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

def stats(nums: list[float]) -> tuple[float, float, float]:
    """Return the lowest value, the highest value and the mean, as one tuple."""
    return [min(nums), max(nums), sum(nums) / len(nums)]

test_main.py

from main import stats


def test_values():
    """Liefert Minimum, Maximum und Mittelwert, in dieser Reihenfolge"""
    lowest, highest, mean = stats([2, 8, 5])
    assert (lowest, highest, mean) == (2, 8, 5.0), f"stats([2, 8, 5]) ergab {(lowest, highest, mean)!r}, erwartet: (2, 8, 5.0)"


def test_returns_tuple():
    """Gibt ein Tupel zurück, keine Liste"""
    got = stats([2, 8, 5])
    assert type(got) is tuple, f"stats gab den Typ {type(got).__name__} zurück, erwartet: tuple"


def test_single_value():
    """Ein einzelner Wert ist Minimum, Maximum und Mittelwert"""
    got = stats([4])
    assert got == (4, 4, 4.0), f"stats([4]) lieferte {got!r}, erwartet: (4, 4, 4.0)"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Übung 2 von 2

Eine Bestenliste

leaderboard(scores) erhält (name, points)-Paare und soll Zeilen wie "ben: 30" liefern, die höchste Punktzahl zuerst; bei Gleichstand alphabetisch. Der Startcode behält die Eingabereihenfolge und greift per Index auf jedes Paar zu. Sortieren Sie mit einem key, der ein Tupel liefert, und entpacken Sie jedes Paar in name und points.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Tupel werden Element für Element verglichen: (-30, "ben") kommt vor (-21, "cleo"). Das Minus stellt hohe Punktzahlen nach vorne.

  2. Hinweis 2

    sorted(scores, key=lambda pair: (-pair[1], pair[0])) sortiert nach Punkten, dann nach Namen, und lässt scores unverändert.

  3. Hinweis 3

    Dann: [name + ": " + str(points) for name, points in ranked]

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

def leaderboard(scores: list[tuple[str, int]]) -> list[str]:
    """Return "name: points" lines, highest points first, ties by name."""
    ranked = sorted(scores, key=lambda pair: (-pair[1], pair[0]))
    return [name + ": " + str(points) for name, points in ranked]
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

def leaderboard(scores: list[tuple[str, int]]) -> list[str]:
    """Return "name: points" lines, highest points first, ties by name."""
    return [pair[0] + ": " + str(pair[1]) for pair in scores]

test_main.py

from main import leaderboard


def test_highest_first():
    """Setzt die höchste Punktzahl an den Anfang"""
    got = leaderboard([("ana", 12), ("ben", 30), ("cleo", 21)])
    assert got == ["ben: 30", "cleo: 21", "ana: 12"], f"erhalten: {got!r}, erwartet: ['ben: 30', 'cleo: 21', 'ana: 12']"


def test_ties_by_name():
    """Gleiche Punktzahlen stehen alphabetisch"""
    got = leaderboard([("zoe", 5), ("adam", 5), ("mia", 9)])
    assert got == ["mia: 9", "adam: 5", "zoe: 5"], f"erhalten: {got!r}, erwartet: ['mia: 9', 'adam: 5', 'zoe: 5']"


def test_input_unchanged():
    """Lässt die Liste des Aufrufers unverändert"""
    scores = [("ana", 1), ("ben", 2)]
    leaderboard(scores)
    assert scores == [("ana", 1), ("ben", 2)], f"die Liste des Aufrufers wurde zu {scores!r}"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Häufige Fehler

Ein Element eines Tupels ändern

point = (3, 4)
point[0] = 5

Was Python ausgibt

TypeError: 'tuple' object does not support item assignment

Warum, und die Lösung

Tupel sind unveränderlich. Bauen Sie ein neues Tupel und binden Sie den Namen daran: point = (5, point[1]). Müssen sich die Werte wirklich einzeln ändern, ist eine Liste die bessere Wahl.

In die falsche Anzahl von Namen entpacken

x, y = (1, 2, 3)

Was Python ausgibt

ValueError: too many values to unpack (expected 2, got 3)

Warum, und die Lösung

Entpacken braucht einen Namen pro Element. Die Meldung sagt, wie viele erwartet und wie viele geliefert wurden. Ergänzen Sie einen Namen, x, y, z = …, oder entpacken Sie einen Slice: x, y = values[:2].

Klammern ohne Komma

size = (5)
print(len(size))

Was Python ausgibt

TypeError: object of type 'int' has no len()

Warum, und die Lösung

Klammern allein gruppieren nur: (5) ist die Ganzzahl 5. Das Komma macht das Tupel, schreiben Sie also size = (5,) oder size = 5, für ein Tupel mit einem Element.

Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Das Komma macht das Tupel

Ein Tupel ist eine feste Folge von Werten: t = 12, 34, "x" packt drei Werte in ein Tupel. Python gibt Tupel in Klammern aus, und im Code brauchen Sie die Klammern oft auch, etwa in einem Funktionsaufruf, aber das Tupel entsteht durch das Komma. (5) ist also einfach die Zahl 5, während (5,) und 5, Tupel mit einem Element sind. Ein leeres Tupel ist (). Tupel kennen Indizes, Slices, len(), + und *, wie Listen.

Entpacken

x, y = point entpackt eine Sequenz in Namen; die Anzahl der Namen muss zur Anzahl der Elemente passen, sonst löst Python ValueError aus. Das klappt mit jeder Sequenz: a, b, c = "xyz". a, b = b, a tauscht zwei Variablen, weil die rechte Seite in ein Tupel gepackt wird, bevor etwas zugewiesen wird. Eine Funktion gibt mehrere Werte als Tupel zurück, und der Aufrufer entpackt es: lowest, highest = min_max(nums). for name, score in pairs: entpackt jedes Paar der Reihe nach.

Unveränderlich, mit Grenzen

Ein Tupel lässt sich nicht ändern: t[0] = 9 löst TypeError aus, und Tupel haben weder append noch remove. Sie können ein neues Tupel bauen, t + (4,), und einen Namen daran binden. Ein Tupel kann veränderliche Objekte enthalten, etwa eine Liste, und diese Liste kann sich weiter ändern: Das Tupel verweist weiter auf dieselbe Liste. Nehmen Sie ein Tupel für eine feste Gruppe zusammengehöriger Werte, etwa einen Punkt oder ein Datum, und eine Liste für eine Sammlung, die wächst.

Quellen

Zuletzt geprüft am 29. September 2026