Aufwärmen · Aufgabe 1 von 7
// 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.
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)Üben · Aufgabe 3 von 7
Setzen Sie ein Zeichen ein, sodass single ein Tupel mit einem Element ist.
single = ("hello"____)single = ("hello")Ü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)Üben · Aufgabe 5 von 7
Ordnen Sie jedem Ausdruck seinen Wert zu.
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)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.pyAusgabe
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
Hinweis 1
Eckige Klammern bauen immer eine Liste.
Hinweis 2
Durch Kommas getrennte Werte nach return werden in ein Tupel gepackt.
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.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.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
Hinweis 1
Tupel werden Element für Element verglichen: (-30, "ben") kommt vor (-21, "cleo"). Das Minus stellt hohe Punktzahlen nach vorne.
Hinweis 2
sorted(scores, key=lambda pair: (-pair[1], pair[0])) sortiert nach Punkten, dann nach Namen, und lässt scores unverändert.
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.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.py herunterladenHäufige Fehler
Ein Element eines Tupels ändern
point = (3, 4)
point[0] = 5
Was Python ausgibt
TypeError: 'tuple' object does not support item assignmentWarum, 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.