ProgrammatiePython ontwikkelaar

Wat is list comprehension in Python, wanneer en waarom wordt het gebruikt, en welke fijne punten zijn er bij het gebruik ervan?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Geschiedenis van de vraag

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.

Probleem

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.

Oplossing

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:

  • Lijstenexpressies werken sneller dan een vergelijkbare for-lus, vooral bij grote hoeveelheden gegevens
  • Ze moeten niet meer dan één of twee niveaus diep genest worden vanwege het verlies van leesbaarheid
  • Je kunt elke expressie gebruiken en zelfs functies aanroepen binnen list comprehension

Ongemakkelijke vragen.

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.

Typische fouten en antipatterns

  • Complexe geneste list comprehensions verlagen de leesbaarheid
  • Gebruik van constructies voor beknoptheid, zelfs waar een gewone for-lus met duidelijke append transparanter zou zijn
  • Fouten met de scope van variabelen naar buiten

Voorbeeld uit het leven

** 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