Lektionen des Moduls (4/4)
Lambda-Funktionen und Funktionen höherer Ordnung
Eine Lambda-Funktion ist eine anonyme Funktion, die auf einer einzelnen Zeile definiert wird. Syntax:
lambda parametri: espressioneÄquivalent zu def, aber prägnanter und gut geeignet für "Wegwerf"-Funktionen,
die an andere Funktionen übergeben werden.
quadrato = lambda x: x ** 2
quadrato(5) # 25
# equivalent to:
def quadrato(x):
return x ** 2Unterschiede zu def
| Aspekt | def | lambda |
|---|---|---|
| Name | erforderlich | anonym |
| Körper | mehrere Anweisungen | eine EINZELNE Expression |
| Return | explizit | implizit (die Expression) |
| Docstring | ja | nein |
Kein return innerhalb eines Lambdas: Der Wert des Ausdrucks IST das Ergebnis.
Wann man Lambdas benutzt
Fast immer: als key-Argument für Sortier- oder Auswahlfunktionen.
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']key=len sagt sorted: "Um zwei Elemente zu vergleichen, verwende ihre Länge". Verwende
für benutzerdefinierte Kriterien ein 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 Anwendungen: min(...), max(...), filter(...), map(...).
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n)) # -5 (maximum by absolute value)Funktionen höherer Ordnung
Eine Funktion ist höherer Ordnung, wenn sie eine Funktion als Argument akzeptiert
oder eine zurückgibt. sorted, max, filter, map sind höherer Ordnung. Lambda
existiert genau, um Aufrufe höherer Ordnung zu erleichtern.
Wann man Lambda-Funktionen vermeiden sollte
Lambda-Funktionen sind nützlich für kurze, einmalige Operationen (wie schnelles Sortieren). Wenn du dich jedoch dabei ertappst, ein Lambda einer Variablen zuzuweisen (z.B. double = lambda x: x * 2), wird im Allgemeinen ein Standard-def-Block bevorzugt, um die Lesbarkeit und das Debugging zu verbessern (da mit def definierte Funktionen ihre echten Namen in Error-Tracebacks behalten).
Probiere es aus
Gegeben sei die Liste `words = ['banana', 'kiwi', 'mela', 'fragola']`. Sortiere sie nach aufsteigender Länge in `by_length`. Evaluiere `by_length`.
Hinweis anzeigen
key=len (oder lambda p: len(p)).
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Gegeben sei die Liste von Tupeln `points = [(1, 5), (3, 2), (2, 4)]`. Sortiere sie nach dem ZWEITEN Element in aufsteigender Reihenfolge und weise das Ergebnis `by_y` zu. Evaluiere `by_y`.
Hinweis anzeigen
lambda p: p[1]
Lösung nach 3 Versuchen verfügbar
Zusätzliche Herausforderung
Definiere eine anonyme `lambda`-Funktion, die eine Zahl `x` nimmt und `True` zurückgibt, wenn die Zahl gerade ist, andernfalls `False`. Weise das Lambda der Variablen `is_even` zu und teste es mit `is_even(8)` als letzte Zeile.
Hinweis anzeigen
Schreibe is_even = lambda x: x % 2 == 0 und rufe dann is_even(8) auf.
Lösung nach 3 Versuchen verfügbar