ProgrammatiePython ontwikkelaar

Vertel over lambda-functies in Python. Wat zijn hun beperkingen in vergelijking met gewone functies? In welke situaties is het beter om ze te gebruiken, en in welke situaties is het ongewenst?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Lambda-functie is een anonieme (naamloze) functie, gedefinieerd met behulp van het sleutelwoord lambda. Het wordt meestal gebruikt waar een korte functie "eenmalig en ter plaatse" nodig is.

add = lambda x, y: x + y print(add(1, 2)) # 3

Beperkingen van lambda-functies:

  • Een lambda kan slechts één expressie bevatten — dit is ook de geretourneerde waarde; meerregelige berekeningen, return, en voorwaarden zoals if-else zijn niet toegestaan (slechts in de vorm van een ternary expressie).
  • Complexe code met try/except, lussen, etc. kan niet gebruikt worden.
  • Lambda heeft geen volledige documentatie (je kunt geen docstring toevoegen).
  • Lambda-functies zijn moeilijker te lezen, vooral als ze genest zijn.

Wanneer is lambda nuttig:

  • In eenregelige sorteervoeddens/filteren (key-argumenten; bijvoorbeeld in sorted, filter, map).
  • Wanneer hergebruik van code niet nodig is — lokale bewerkingen, snel "een functie invoegen".

Wanneer is het beter om lambda te vermijden:

  • In complexe logica: voor hergebruik, met veel code of voorwaarden, is het beter om dit in een def-functie met een naam en docstring te plaatsen voor duidelijkheid en leesbaarheid.

Misleidende vraag

Vraag: Kunnen lambda-functies variabelen uit een externe scope gebruiken, en hoe beïnvloedt dit hun gedrag bij gebruik binnen lussen?

Antwoord: Lambda-functies kunnen variabelen uit de externe context vastleggen (lexicale sluiting). Bij definiëren binnen een lus leidt dit vaak tot onverwacht gedrag — lambda gebruikt de huidige waarde van de variabele op het moment van aanroepen, niet wat "was op het moment van definitie".

funcs = [] for i in range(3): funcs.append(lambda: i) # alle functies retourneren 2 (i=2 na de lus) print([f() for f in funcs]) # [2, 2, 2]

Om de "oude" waarde vast te leggen:

funcs = [] for i in range(3): funcs.append(lambda i=i: i) print([f() for f in funcs]) # [0, 1, 2]

Voorbeelden van echte fouten door onbekendheid met de subtiliteiten van het onderwerp


Verhaal

In een project werd lambda gebruikt om een lijst van dictionaries op een bepaalde sleutel te filteren. De lambda binnen de lus legde een variabele vast die op het moment van aanroepen een andere (onverwachte) waarde had. Resultaat — onjuiste filtering en fouten in rapportage.


Verhaal

Groot project op Django: complexe validatievorm, geïmplementeerd als een lange expressie binnen een lambda-functie. Later veranderde de bedrijfslogica, de lambda kon niet alle code meer bevatten, waardoor het herzien moest worden naar een gewone functie. Lambda vertraagde de debugging.


Verhaal

In een startup werd lambda onfortuinlijk gebruikt voor het doorgeven van een sorteervunctie, waarbij ze vergaten dat deze een ongeldig type retourneert (bijvoorbeeld, niet een tuple maar een lijst). Dit leidde tot onvoorspelbare sortering en bugs bij data-deduplicatie.