List comprehension verscheen al in vroege versies van Python. Deze syntactische suiker is overgenomen uit functionele talen. Het maakt de code compacter en soms zelfs iets sneller dan een gewone for-lus.
Veel onervaren ontwikkelaars gebruiken list comprehensions zonder de bijzonderheden ervan te begrijpen, wat leidt tot verslechterde leesbaarheid of onverwachte effecten in de code. Nieuwe ontwikkelaars hebben ook moeite om het gebruik van list comprehensions en de functies map/filter/lambda te onderscheiden.
List comprehension is een manier om snel een nieuwe lijst te maken door een expressie toe te passen op elk element van de oorspronkelijke reeks:
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
Belangrijkste kenmerken:
Geeft list comprehension een generator terug?
Nee, het geeft daadwerkelijk een lijst terug. Een generator wordt gemaakt met ronde haakjes:
# Dit is een generator: (x*x for x in range(10)) # Dit is een lijst: [x*x for x in range(10)]
Kan je binnen list comprehension waarden aan variabelen toewijzen?
In de standaard syntaxis niet. Alleen met behulp van de "walrus" expressie (:=) vanaf Python 3.8+:
[x for x in (y := range(5))] # Fout! [x for x in [(y := i*i) for i in range(5)]] # y is alleen zichtbaar in deze lijst
Kun je externe variabelen wijzigen binnen list comprehension?
Een variabele die binnen list comprehension is gedeclareerd, is lokaal en zal niet zichtbaar zijn van buitenaf. Dit verwart vaak nieuwkomers bij geneste constructies.
** Negatieve case Een ontwikkelaar gebruikt geneste list comprehensions voor complexe gegevenstransformaties in één regel. Voordelen: Code is compact, het effect "ik ken Python!" Nadelen: Moelijk te lezen, nieuwe collega's lijden, debuggen wordt een marteling ** Positieve case Een ontwikkelaar gebruikt eenvoudige list comprehensions voor het filteren en transformeren van korte lijsten, en schrijft expliciete functies en lussen voor complexe operaties. Voordelen: De code is gemakkelijk te lezen, te onderhouden en uit te breiden Nadelen: In sommige gevallen is de code iets langer en worden extra variabelen gebruikt