Lambdas in Python sind Funktionen ohne Namen – also „anonyme“ Funktionen.

Vorwissen

Für Lambdas wird vorausgesetzt, dass ihr wisst, was eine Funktion ist. Am besten schaust du dir erstmal den Artikel zu Funktionen an, falls dir Funktionen überhaupt nichts sagen!

Funktionen kurz zusammengefasst

Mit Hilfe von def können wir Funktionen definieren und diese wiederverwenden. Schauen wir uns mal ein einfaches Beispiel hier an:

def plus_5(x):
    return x + 5 

Die Funktion hat den Namen add_5 und mit dieser können wir 5 auf die Zahl x addieren, die wir der Funktion übergeben.

Was ist Lambda?

Nun gibt es aber noch eine zweite Möglichkeit so eine Funktion zu erstellen. Und zwar mit Hilfe von lambda. Die Funktion direkt hat keinen Namen wie oben wenn wir def benutzen, deshalb wird dies auch anonyme Funktion genannt.

Genauer gesagt machen wir das so:

lambda_5 = lambda x: x + 5 

Wie in der Funktion oben, übergeben wir lambda den Parameter, also den Wert x. Auf x wird dann 5 addiert.

Wie ist eine Lambda Funktion aufgebaut?

lambda wert: funktionsprozess 

Der Wert ist hierbei der, den wir der Funktion als Input geben. Der Funktionsprozess enthält den Schritt, den wir innerhalb einer Funktion eigentlich einrücken würden, also den Input mit 5 addieren.

Im Gegensatz zu einer Funktion gibt das lambda nur eine Funktion zurück, die das macht was wir in die expression reinschreiben. Lambda_5 ist damit also gleichzusetzen mit der plus_5 Funktion von oben. Außerdem kann das lambda nur eine expression haben, man kann also keine komplizierten Ausdrücke reinschreiben wie in Funktionen.

Wenn wir uns nämlich mal anschauen, was bei den beiden Sachen ausgegeben wird, sehen wir, dass es genau gleich ist.

def plus_5(x):
    return x + 5
    
lambda_5 = lambda x: x + 5

print(plus_5(5))
print(lambda_5(5))

### Output:
>>> 5
>>> 5 

Bei beiden Funktionen kriegen wir eine 10 als Ausgabe, wenn wir als x den Wert 5 nehmen.

Lambda praktisch anwenden

In Python gibt es wichtige vorprogrammierte Funktionen, mit denen man superleicht komplizierte Dinge mit sehr wenig Code lösen kann. Genau hier kommen Lambdas ins Spiel. Wir schauen uns hierfür mal die Funktionen map(), filter() und reduce() an.

map()-Funktion

Mit Hilfe der map()-Funktion können wir über alle Einträge, beziehungsweise Elemente einer Iterable gehen, das sind sowas wie Listen und Tupeln, und für jedes Element eine vorgegebene Funktion anwenden.

Ein leichtes Beispiel hier:

def ist_gerade(zahl):
    return zahl % 2 == 0
    
zahlen = [1, 2, 4, 5, 7, 9, 42]
map_it = map(ist_gerade, zahlen) 

Hier haben wir eine Funktion ist_gerade, in der wir schauen, ob die Zahl, die wir übergeben gerade ist. Wenn ja, dann wird True, also Wahr zurückgegeben und wenn nicht dann False, also Falsch.

Mit der map() Funktion wenden wir die Funktion ist_gerade auf jede Zahl in zahlen an. Immer wenn eine Zahl in zahlen gerade ist, wird True ausgeworfen und wenn die Zahl ungerade ist ein False. Wenn wir nämlich mal map_it als Liste ausgeben [wir müssen es zu einer Liste casten, da map nur ein map-object zurückgibt und keine Liste, die man sich anschauen kann!] wird dies nochmal verdeutlicht.

print(map_it)
print(list(map_it))

### Output:
>>> <map object at 0x7fe64f5e1ca0>
>>> [False, True, True, False, False, False, True] 

Statt zuerst eine Funktion ist_gerade zu schreiben, können wir auch wie oben beschrieben eine anonyme Funktion – also ein lambda verwendet! Und zwar geht das ganz einfach wie folgt:

zahlen = [1, 2, 4, 5, 7, 9, 42]
map_it = map(lambda zahl: zahl % 2 == 0, zahlen)
print(list(map_it))

### Output:
>>> [False, True, True, False, False, False, True] 

Wir ersetzen die Funktion, die wir oben geschrieben haben mit dem lambda Ausdruck lambda zahl: zahl % 2 == 0. Wir haben also das was nach dem return in der Funktion steht genommen und hinter das lambda gepackt. Ganz einfach!

filter()-Funktion

Die filter()-Funktion ermöglicht uns eine Liste zu filtern. Sie erstellt uns eine neue Liste mit den Filteroptionen denen wir der filter()-Funktion übergeben.

Nehmen wir das Beispiel von oben aus der map()-Funktion:

zahlen = [1, 2, 4, 5, 7, 9, 42]
gerade = filter(lambda zahl: zahl % 2 == 0, zahlen)
print(list(gerade))

### Output:
>>> [2, 4, 42] 

Was das lambda macht, wissen wir ja schon. Beim filter werden alle Zahlen genommen, die das lambda erfüllen und werden in eine neue Liste gepackt. Hier in diesem Falle werden also alle geraden Zahlen genommen. Auch hier müssen wir gerade zu einer Liste machen, da filter nur ein filter-obejct zurückgibt!

reduce()-Funktion

Mit reduce() können wir in einer Liste immer eine Funktion auf paarweise aufeinanderfolgende ausführen. Das ist sehr hilfreich, wenn wir eine sequenzielle Rechnung, also eine Rechnung über die ganze Liste ausführen wollen.

Seit Python 3 ist das reduce() nicht mehr standartmäßig in Python ist, muss es von dem Modul functools importiert werden mit dem Befehl:

from functools import reduce 

Schauen wir uns ein Beispiel an, in dem wir durch eine Liste gehen und diese miteinander addieren:

from functools import reduce

zahlen = [1, 2, 3, 4]
reduce_test = reduce((lambda x,y: x + y), zahlen)
print(reduce_test)

### Output:
>>> 10 

Es werden immer zuerst die ersten zwei Zahlen genommen und diese addiert. Das Ergebnis aus den beiden Zahlen wird dann mit der nächsten Zahl, die in der Liste steht nochmal addiert. Das geht solange weiter, bis die Liste zu Ende ist.

Genauer beschrieben passieren hier die folgenden Schritte:

  1. 1 + 2 = 3
  2. 3 + 3 = 6
  3. 6 + 4 = 10

Die Ausgabe ist dementsprechend 10!

ARTIKEL TEILEN

Hast du Fragen? Hinterlasse einen Kommentar!