2.30. Comprehensions¶
Een comprehension bouwt een nieuwe list, set, dict of generator op uit een bestaande iterable, in één enkele expressie. Het is een vervanging voor het veelvoorkomende patroon waarbij je begint met een lege container en in een lus toevoegt.
2.30.1. List-comprehensions¶
squares = [x * x for x in range(5)]
print(squares)
Uitvoer:
[0, 1, 4, 9, 16]
Dezelfde lus volledig uitgeschreven:
squares = []
for x in range(5):
squares.append(x * x)
De comprehension-vorm is één expressie die de list ter plaatse opbouwt. Er is geen squares = [] en geen .append – het resultaat is de waarde van de comprehension.
De voorste expressie produceert elk item; de for-clausule benoemt de lusvariabele; een optionele if filtert items eruit.¶
2.30.2. Filteren met if¶
Een optionele if-clausule behoudt alleen de items die overeenkomen:
evens = [x for x in range(10) if x % 2 == 0]
print(evens)
Uitvoer:
[0, 2, 4, 6, 8]
Het filter draait vóór de voorste expressie – x % 2 == 0 wordt eerst gecontroleerd; alleen overeenkomende waarden bereiken x voor de uitvoer.
2.30.3. Dict- en set-comprehensions¶
Dezelfde vorm werkt met dict- en set-literals.
Een dict-comprehension heeft een key: value-paar vóór de for:
squares = {x: x * x for x in range(5)}
print(squares)
Uitvoer:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Een set-comprehension gebruikt accolades en een enkele expressie:
unique_lengths = {len(w) for w in ["a", "bb", "c", "bb"]}
print(unique_lengths)
Uitvoer:
{1, 2}
2.30.4. Generator-expressies¶
Ronde haakjes produceren een generator-expressie in plaats van een list. De waarden worden één voor één berekend, op aanvraag:
total = sum(x * x for x in range(1000))
Er wordt nooit een list van een miljoen items gebouwd. De waarden stromen één voor één naar sum(), die ze optelt en elke waarde onderweg weggooit.
Generator-expressies zijn de juiste keuze bij het voeden van waarden aan een reducerende functie (sum(), max(), any(), all()) of enige andere code die een iterator verbruikt – ze besparen het geheugen dat de equivalente list zou hebben gebruikt.
2.30.5. Wanneer je geen comprehension moet gebruiken¶
Comprehensions zijn beknopt maar niet altijd duidelijker. Grijp naar een gewone for-lus wanneer:
Het lichaam meer dan één statement nodig heeft (een comprehension past precies één expressie).
Het lichaam neveneffecten heeft (printen, naar een bestand schrijven) – comprehensions zijn bedoeld voor het bouwen van een collectie, niet voor het uitvoeren van acties.
Het filter of de transformatie zoveel onderdelen heeft dat de comprehension niet langer van links naar rechts leesbaar is.