Daten umformen und verbinden · Übung
Lesbare Comprehensions
Die vorigen Lektionen haben neue Listen mit Punktzahlen und booleschen Prüfungen mithilfe gewöhnlicher Schleifen erstellt. Diese Schleifen sind klar und bleiben das richtige Werkzeug, wenn die Arbeit mehrere Schritte hat.
Wenn eine Schleife eine kleine, vorhersehbare Umformung ausführt, bietet Python eine kürzere Form namens Comprehension. Beginne mit dieser vertrauten Schleife:
long_titles = []
for lesson in lessons:
if lesson["minutes"] >= 10:
long_titles.append(lesson["title"])
Eine Listen-Comprehension drückt dieselbe Arbeit in einem Ausdruck aus, der wie eine Sammlung aufgebaut ist:
long_titles = [
lesson["title"]
for lesson in lessons
if lesson["minutes"] >= 10
]
Lies sie so: Sammle für jede Lektion den Lektionstitel, wenn ihre Dauer mindestens zehn Minuten beträgt.
Andere Ergebnisse von Comprehensions
Eine Set-Comprehension behält eindeutige Werte:
chapters = {
lesson["chapter"]
for lesson in lessons
}
Eine Dictionary-Comprehension erstellt Schlüssel-Wert-Paare:
minutes_by_title = {
lesson["title"]: lesson["minutes"]
for lesson in lessons
}
Die geschweiften Klammern sehen ähnlich aus. Ein Doppelpunkt erzeugt eine Dictionary-Comprehension; ein einzelner Ausdruck erzeugt eine Set-Comprehension.
Bevorzuge Klarheit gegenüber Verdichtung
Verwende eine Comprehension, wenn sie Folgendes hat:
einen klaren Ergebnisausdruck;
eine Quellsammlung;
höchstens einen einfachen Filter.
Verwende eine normale Schleife, wenn die Arbeit mehrere Anweisungen, mehrere Entscheidungen, Fehlerbehandlung oder erklärende Zwischennamen braucht. Eine Comprehension hilft beim Lesen. Sie ist kein Wettbewerb darum, möglichst viel Logik in eine Zeile zu packen.
Lass die Klammern weg, wenn nichts die Liste braucht
Eine Comprehension baut eine ganze Sammlung. Wenn diese Sammlung direkt an sum(), min(), max(), any() oder all() übergeben wird, muss sie überhaupt nicht als Sammlung existieren:
Dasselbe Ergebnis. Die erste Zeile baut eine Liste mit zwei Elementen, übergibt sie an sum() und verwirft sie. Die zweite liefert die Werte einzeln, ohne eine Zwischenliste zu erstellen.
Ohne die Klammern heißt das Generatorausdruck. Innerhalb eines solchen Funktionsaufrufs reichen die Klammern des Aufrufs aus. Bevorzuge ihn immer dann, wenn es nicht um die Sammlung selbst geht:
sum(lesson["minutes"] for lesson in lessons)
any(lesson["minutes"] > 15 for lesson in lessons)
Behalte die Klammern bei, wenn du die Sammlung tatsächlich brauchst: um sie zu speichern, zurückzugeben, zweimal zu durchlaufen oder ihre Länge abzufragen.
Die Ersparnis beträgt hier zwei Elemente und ist nicht sichtbar. Bei einer großen Sammlung ist es der Unterschied zwischen allen Elementen gleichzeitig im Speicher und jeweils nur einem Element. Kapitel 11 greift Generatorausdrücke wieder auf und erklärt, warum sie Werte erst bei Bedarf erzeugen.
Was erstellt dieser Code?
{lesson["chapter"] for lesson in lessons}
Erstelle drei nützliche Ansichten
Vervollständige die Funktion mit je einer Listen-, Set- und Dictionary-Comprehension.
Aufgabe
Vervollständige build_views mit drei Comprehensions.
passing_names: Namen der Lernenden für Versuche, bei denenscore >= requiredgilt.topics: das Set aller Themenwerte.scores_by_learner: jeder Name einer lernenden Person wird der Punktzahl zugeordnet.
Gib die drei Sammlungen im vorgegebenen Dictionary zurück. Halte jede Comprehension über mehrere Zeilen lesbar.