Modulelessen (4/4)
Lambda en hogere orde functies
Een lambda is een anonieme functie, gedefinieerd op één regel. Syntaxis:
lambda parametri: espressioneGelijk aan def, maar beknopter en geschikt voor 'wegwerp'
functies doorgeven aan andere functies.
quadrato = lambda x: x ** 2
quadrato(5) # 25
# equivalent to:
def quadrato(x):
return x ** 2Verschillen versus def
| Aspect | def | lambda |
|---|---|---|
| naam | vereist | anoniem |
| lichaam | meerdere uitspraken | een ENKELE expressie |
| terug | expliciet | impliciet (de uitdrukking) |
| docstring | ja | nee |
Geen return binnen een lambda: de waarde van de expressie IS het resultaat.
Wanneer lambda gebruiken?
Bijna altijd: als key argument voor sorteer- of selectiefuncties.
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']key=len vertelt sorted: "om twee elementen te vergelijken, gebruik hun lengte". Voor
aangepaste criteria, gebruik lambda:
utenti = [
{"nome": "Ada", "eta": 36},
{"nome": "Linus", "eta": 54},
{"nome": "Grace", "eta": 85},
]
per_eta = sorted(utenti, key=lambda u: u["eta"])
# sorted by ascending ageAndere typische toepassingen: min(...), max(...), filter(...), map(...).
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n)) # -5 (maximum by absolute value)Functies van hogere orde
Een functie is van hogere orde als deze een functie als argument of accepteert
geeft er één terug. sorted, max, filter, map zijn van een hogere orde. Lambda
bestaat juist om oproepen van hogere orde gemakkelijker te maken.
Wanneer moet u lambda-functies vermijden?
Lambda-functies zijn handig voor korte, wegwerpoperaties (zoals snel sorteren). Als u echter merkt dat u een lambda aan een variabele toewijst (bijvoorbeeld double = lambda x: x * 2), verdient het over het algemeen de voorkeur om een standaard def blok te gebruiken voor leesbaarheid en foutopsporingsdoeleinden (aangezien functies die zijn gedefinieerd met def hun echte naam behouden bij het traceren van fouten).
Probeer het
Gegeven de lijst `words = ['banaan', 'kiwi', 'mela', 'fragola']`, sorteer deze op oplopende lengte in `op_lengte`. Evalueer `op_lengte`.
Toon hint
sleutel=len (of lambda p: len(p)).
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
Gegeven de lijst met tupels `points = [(1, 5), (3, 2), (2, 4)]`, sorteer ze op het SECOND-element in oplopende volgorde en wijs ze toe aan `by_y`. Evalueer `by_y`.
Toon hint
lambda p: p[1]
Oplossing beschikbaar na 3 pogingen
Extra uitdaging
Define an anonymous `lambda` function that takes a number `x` and returns `True` if the number is even, and `False` otherwise. Assign the lambda to the variable `is_even` and test it with `is_even(8)` as the last line.
Toon hint
Schrijf is_even = lambda x: x % 2 == 0 en roep dan is_even(8) aan.
Oplossing beschikbaar na 3 pogingen