Gegevens bewerken en combineren · oefening
Leesbare comprehensions
De vorige lessen bouwden met gewone lussen nieuwe lijsten met scores en booleaanse controles. Die lussen zijn duidelijk en blijven het juiste hulpmiddel wanneer het werk meerdere stappen heeft.
Wanneer een lus één kleine, voorspelbare bewerking uitvoert, biedt Python een kortere vorm: een comprehension. Begin met deze bekende lus:
long_titles = []
for lesson in lessons:
if lesson["minutes"] >= 10:
long_titles.append(lesson["title"])
Een list comprehension drukt hetzelfde werk uit in één expressie in de vorm van een verzameling:
long_titles = [
lesson["title"]
for lesson in lessons
if lesson["minutes"] >= 10
]
Lees die als: verzamel voor elke les de lestitel als de duur minstens tien minuten is.
Andere resultaten van comprehensions
Een set comprehension bewaart unieke waarden:
chapters = {
lesson["chapter"]
for lesson in lessons
}
Een dictionary comprehension maakt sleutel-waardeparen:
minutes_by_title = {
lesson["title"]: lesson["minutes"]
for lesson in lessons
}
De accolades lijken op elkaar. Een dubbele punt maakt een dictionary comprehension; één losse expressie maakt een set comprehension.
Kies duidelijkheid boven compactheid
Gebruik een comprehension wanneer die het volgende heeft:
één duidelijke uitvoerexpressie;
één bronverzameling;
hoogstens één eenvoudig filter.
Gebruik een gewone lus wanneer het werk meerdere instructies, meerdere beslissingen, foutafhandeling of verklarende tussennamen nodig heeft. Een comprehension is een hulpmiddel voor leesbaarheid, geen wedstrijd om zo veel mogelijk logica op één regel te krijgen.
Laat de haken weg wanneer niets de lijst nodig heeft
Een comprehension bouwt een volledige verzameling. Wanneer die verzameling direct naar sum(), min(), max(), any() of all() gaat, hoeft die nergens echt te bestaan:
Hetzelfde antwoord. De eerste regel bouwt een lijst met twee items, geeft die aan sum() en gooit die weg. De tweede levert de waarden één voor één zonder een tussenliggende lijst te bouwen.
Zonder de haken heet dit een generatorexpressie. Binnen een functieaanroep zoals deze zijn de ronde haken van de aanroep genoeg. Geef hieraan de voorkeur wanneer de verzameling niet het doel is:
sum(lesson["minutes"] for lesson in lessons)
any(lesson["minutes"] > 15 for lesson in lessons)
Behoud de haken wanneer je de verzameling echt wilt: om die op te slaan, terug te geven, twee keer te doorlopen of de lengte op te vragen.
Hier bespaar je twee items en merk je er niets van. Bij een grote verzameling is het het verschil tussen alles in het geheugen houden en één item tegelijk bewaren. Hoofdstuk 11 komt terug op generatorexpressies en legt uit waarom ze pas waarden leveren wanneer die nodig zijn.
Wat maakt dit?
{lesson["chapter"] for lesson in lessons}
Bouw drie nuttige overzichten
Maak de functie af met één list comprehension, één set comprehension en één dictionary comprehension.
Opdracht
Maak build_views af met drie comprehensions.
passing_names: cursistnamen voor pogingen waarbijscore >= required.topics: de set met alle onderwerpwaarden.scores_by_learner: elke cursistnaam gekoppeld aan de score.
Geef de drie verzamelingen in de meegeleverde dictionary terug. Houd elke comprehension leesbaar over meerdere regels.