Lambda, filter, reduce und map

Lambda-Operator

Ring als Symbol der for-Schleife

Die einen lieben ihn, die anderen hassen ihn und viele fürchten ihn, den Lambda-Operator. Als Multiparadigmensprache unterstützt Python auch die funktionale Programmierung. Lambda-Funktionen kommen aus der funktionalen Programmierung. Mit Hilfe des lambda-Operators können anonyme Funktionen, d.h. Funktionen ohne Namen erzeugt werden. Sie haben eine beliebe Anzahl von Parametern, führen einen Ausdruck aus und liefern den Wert dieses Ausdrucks als Rückgabewert zurück.

Anonyme Funktionen sind insbesondere bei der Anwendung der map-, filter- und reduce-Funktionen von großem Vorteil.

Allgemeiner Aufbau einer Lambda-Funktion:
lambda Argumentenliste: Ausdruck
Die Argumentenliste besteht aus einer durch Kommata getrennten Liste von Argumenten und der Ausdruck ist ein Ausdruck der diese Argumente benutzt.
Beispiel:

>>> f = lambda x, y : x + y
>>> f(1,1)
2
Die obige Funktion hat zwei Argumente, nämlich x und y und liefert die Summe der beiden Argumente zurück.

map-Funktion

Den Vorteil des lambda-Operators erkennt man beispielsweise im Zusammenspiel mit der map-Funktion.
Map ist eine Funktion mit zwei Argumenten:
r = map(func, seq)
Das erste Argument func ist eine Funktion und das zweite eine Sequenz (z.B. eine Liste) seq. map wendet die Funktion func auf alle Elemente von seq an und schreibt die Ergebnisse in eine neue Liste.
def fahrenheit(T):
    return ((9.0/5)*T + 32)
def celsius(T):
    return (5.0/9)*(T-32)
temp = (36.5, 37, 37.5,39)

F = map(fahrenheit, temp)
C = map(celsius, F)
Die Definition der Funktionen zur Wandlung in Fahrenheit und Celsius hätte man sich auch sparen können, wie wir in der folgenden interaktiven Sitzung sehen können:
>>> Celsius = [39.2, 36.5, 37.3, 37.8]
>>> Fahrenheit = map(lambda x: (float(9)/5)*x + 32, Celsius)
>>> print Fahrenheit
[102.56, 97.700000000000003, 99.140000000000001, 100.03999999999999]
>>> C = map(lambda x: (float(5)/9)*(x-32), Fahrenheit)
>>> print C
[39.200000000000003, 36.5, 37.300000000000004, 37.799999999999997]
>>> 
map kann auch gleichzeitig auf mehrere Listen angewendet werden. Dann werden die Argumente entsprechend ihrer Position und der Reihenfolge der Listenargumente entsprechend mit den Werten aus den Listen versorgt.
>>> a = [1,2,3,4]
>>> b = [17,12,11,10]
>>> c = [-1,-4,5,9]
>>> map(lambda x,y:x+y, a,b)
[18, 14, 14, 14]
>>> map(lambda x,y,z:x+y+z, a,b,c)
[17, 10, 19, 23]
>>> map(lambda x,y,z:x+y-z, a,b,c)
[19, 18, 9, 5]
Wir sehen in den obigen Beispielen, dass der Parameter x seine Werte aus der Liste a, der Parameter y seine Werte aus der Liste b und der Parameter z seine Werte aus der Liste c beziehen.

Filtern

Die Funktion filter(funktion, liste) bietet eine elegante Möglichkeit diejenigen Elemente aus der Liste liste herauszufiltern, für die die Funktion funktion True liefert.
Die Funktion filter(f,l) benötigt als erstes Argument eine Funktion f die Wahrheitswerte liefert. Diese Funktion wird dann auf jedes Argument der Liste l angewendet. Liefert f True für ein x, dann wird x in der Ergebnisliste übernommen.
>>> fib = [0,1,1,2,3,5,8,13,21,34,55]
>>> result = filter(lambda x: x % 2, fib)
>>> print result
[1, 1, 3, 5, 13, 21, 55]
>>> result = filter(lambda x: x % 2 == 0, fib)
>>> print result
[0, 2, 8, 34]
>>> 

reduce-Funktion

Die Funktion reduce(func, seq) wendet die Funktion func() fortlaufend auf eine Sequenz an und liefert einen einzelnen Wert zurück.
Falls seq = [ s1, s2, s3, ... , sn ] ist, funktioniert der Aufruf reduce(func, seq) wie folgt:
Im folgenden Beispiel veranschaulichen wir die Arbeitsweise von reduce an einem konkreten Beispiel:
>>> reduce(lambda x,y: x+y, [47,11,42,13])
113
Im folgenden Diagram sind die Ergebniswerte dargestellt: Veranschulichung von Reduce

Kritik von Guido van Rossum

Guido van Rossum der Erfinder von Python mag übrigens keine der hier eingeführten Funktionen. Sie seien von einem Lisp-Hacker eingeführt worden. Nach dem Willen von Guido van Rossum sollten sie nicht mehr in Python3 übernommen werden, aber er konnte sich nicht durchsetzen.