Menu

Python-Lambda: anonyme Funktionen, sort-Key und map/filter

Was lambda ist, wofür es gut ist und die wenigen Stellen, an denen es sich wirklich lohnt — plus wann du stattdessen zu einer benannten Funktion greifst.

Eine Funktion, die du nicht benennst

Die meisten Funktionen in Python sind mit def definiert, haben Namen und leben in einer Datei, in der sie wiederverwendet werden können. Ein lambda ist eine kleinere, unbenannte Alternative — nützlich in den wenigen Fällen, in denen eine volle Funktionsdefinition mehr Zeremonie wäre als sie wert ist.

Hier die Form Seite an Seite:

main.py
Output
Click Run to see the output here.

Zwei Funktionen, beide tun genau das Gleiche. Die Lambda-Fassung passt in eine Zeile, denn das ist im Grunde ihr Job: eine Wegwerf-Funktion für einen Wegwerf-Moment.

Syntax

lambda <params>: <expression>

  • <params> ist dieselbe Parameterliste, die ein def nutzen würde — Defaults, *args, **kwargs werden unterstützt.
  • <expression> ist ein einzelner Ausdruck, dessen Wert zum Rückgabewert wird.

Beispiele:

main.py
Output
Click Run to see the output here.

Kein return-Schlüsselwort. Der Wert des Ausdrucks wird implizit zurückgegeben.

Die eine Einschränkung

Ein Lambda darf nur einen einzigen Ausdruck enthalten. Anweisungen sind nicht erlaubt:

main.py
Output
Click Run to see the output here.

Aber der ternäre Ausdruck geht:

main.py
Output
Click Run to see the output here.

Brauchst du mehr als einen Ausdruck, ist das dein Zeichen, auf def zu wechseln.

Wo Lambdas sich wirklich lohnen

Ein Lambda, das einer Variable zugewiesen wird, ist fast immer schlechter als ein benanntes def:

main.py
Output
Click Run to see the output here.

Das ist strikt schlechter als def double(x): return x * 2 — gleiche Lesbarkeit, plus die Lambda-Fassung zeigt Debuggern den wenig hilfreichen Namen <lambda> in Stack-Traces.

Lambdas glänzen an genau einer Stelle: als Inline-Argumente für Higher-Order-Funktionen.

Eigene Sortierschlüssel

Der Klassiker:

main.py
Output
Click Run to see the output here.

Das key-Argument von sorted will eine Funktion, die ein Element nimmt und den Wert für die Sortierung zurückgibt. Ein Einzeiler-Lambda passt genau — ein volles def wäre für so etwas Kleines zu schwer.

Nach mehreren Feldern sortierst du mit einem Tupel:

main.py
Output
Click Run to see the output here.

min, max, filter, map

Gleiche Geschichte — alle nehmen ein optionales Funktionsargument:

main.py
Output
Click Run to see the output here.

Für map und filter ist eine List Comprehension meist sogar klarer:

main.py
Output
Click Run to see the output here.

Die meisten Pythonistas greifen aus diesem Grund zu Comprehensions statt zu map/filter. lambda bleibt ein natürlicher Partner für sorted, min und max, wo es keine Comprehension-Abkürzung gibt.

Lambdas und operator

Wenn dein Lambda nur „einen Schlüssel holen“ oder „ein Attribut holen“ ist, bietet das Modul operator schnellere und klarere Alternativen:

main.py
Output
Click Run to see the output here.

Kein riesiger Gewinn, aber in Code, der ohnehin operator importiert, liest es sich etwas deklarativer.

Wann du zurück zu def wechselst

Ist etwas davon wahr, schreib ein def:

  1. Die Logik passt nicht sauber in einen einzigen Ausdruck.
  2. Du willst die Funktion benennen, weil der Name die Lesbarkeit stützt.
  3. Du würdest dieselbe Logik an mehr als einer Stelle nutzen.
  4. Die Funktion braucht einen Docstring (Lambdas können keinen tragen).

Erinner dich: Python wird nicht nach Zeilenzahl bewertet. Eine dreizeilige benannte Funktion liest sich fast immer besser als ein einzeiliges Lambda, sobald die Logik nicht trivial ist.

Als Nächstes: Dekoratoren

Lambdas reichen Funktionen als Werte weiter. Dekoratoren treiben die Idee einen Schritt weiter: sie lassen dich jede Funktion mit wiederverwendbarem Verhalten umhüllen — Logging, Zeiterfassung, Caching, Auth — mit einem einzigen @ auf der Zeile darüber. Das ist die nächste Seite.

Häufig gestellte Fragen

Was ist ein Lambda in Python?

Ein lambda ist eine kurze, anonyme Funktion, die du in einer Zeile schreibst. lambda x: x * 2 entspricht def double(x): return x * 2, nur ohne Namen. Am nützlichsten, wenn du eine winzige Funktion als Argument an eine andere Funktion übergibst.

Wann soll ich lambda statt def verwenden?

Nimm lambda für einmalige Ein-Ausdrucks-Funktionen, die du direkt an etwas wie sorted, max oder filter übergibst. Für alles mit mehr als einem einzelnen Ausdruck — oder alles, was du benennen würdest — nimm def. Benannte Funktionen sind fast immer klarer.

Welche Grenzen hat lambda?

Ein Lambda darf nur einen einzigen Ausdruck enthalten, keine Anweisungen. Keine Zuweisungen, keine if-Blöcke (wohl aber den ternären a if cond else b), keine mehrzeilige Logik. Kämpfst du mit diesen Grenzen, wechsle zu def.

Lerne mit Coddy zu programmieren

LOS GEHT'S