Nächstes Kapitel: Listen-Abstraktion (List Comprehension)
Lambda, filter, reduce und map
Lambda-Operator
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) 2Die 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:
- zuerst wird func auf die beiden ersten Argumente s1 und
s2 angewendet. Das Ergebnis ersetzt die beiden Elemente s1 und
s2
Die Liste sieht damit wie folgt aus: [ func(s1, s2), s3, ... , sn ] - Im nächsten Schritt wird func auf func(s1, s2)
und s3 angewendet.
Die Liste sieht damit wie folgt aus: [ func(func(s1, s2),s3), ... , sn ] - Dies wird solange fortgesetzt bis nur noch ein Element übrig bleibt, d.h. man hat die Liste auf ein Element reduziert.
>>> reduce(lambda x,y: x+y, [47,11,42,13]) 113Im folgenden Diagram sind die Ergebniswerte dargestellt:
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.Nächstes Kapitel: Listen-Abstraktion (List Comprehension)