ich hab heute eher ne Diskussion und weniger ne technische Frage.
Es ist ja bekannt, dass Python auf kurz oder lang das "lambda" keyword verlieren wird und reduce(), filter() und map() sollen auch bald ersatzlos gestichen werden.
Quelle: http://www.artima.com/weblogs/viewpost.jsp?thread=98196
Der Artikel ist alt (2005), das Thema ist also schon länger bekannt.
In Python 3.4 (development, Stand 24.02.2014) sind trotzdem noch alle o.g. features drin, komischerweise.
Aber angenommen, man will jetzt schon anfangen, umzudenken, ... wie macht man das am besten?
Aus einem Blog von Guido hab ich schon die pythonichen Pendants zu filter() und map():
Code: Alles auswählen
def filter(func, data):
return [x for x in data if func(x)],
Code: Alles auswählen
def map(func, data):
return [func(x) for x in data]
Und was mach ich mit lambda und reduce? Irgendwo hab ich gelesen man soll einfach innere Funktionen für lambda nutzen, je nachdem wo man es braucht. Ansonsten, wenn man dieselbe Lambda-Funktion an mehreren Stellen braucht, soll man ne ganz normale Funktion draus bauen und fertig. Das Konzept von lambda in Python ist mir sowieso nicht ganz klar. So, wie ich das sehe ist das nur ne andere Schreibweise, die darauf ausgelegt ist, kurz und knapp zu sein (zwingend eine Zeile, sonst syntax error) - mächtiger wird Python dadurch nicht. Da verstehe selbst ich, wieso man was dagegen hat, für so ein pille-palle feature ein keyword zu verwenden. Aber vielleicht kann jemand ein sinnvolles Beispiel nennen, wie man ein lambda umgeht, und trotzdem elegant und knapp bleibt?
Ausserdem ist mir noch aufgefallen, dass das builtin-map() ca. 50% schneller ist, als die selbstgebastelte-map().
Ich kann ja verstehn, wieso man map() aus Prinzip oder wegen Redundanz weg haben will, aber will man wirklich -50% Performance deswegen einbußen?
Und wenn nein, wie gedenken die Entwickler, nochmals 50% mehr performance bei "[func(x) for x in data]" rauszuquetschen, als ohnehin schon.
Und zu reduce() hab ich ehrlich gesagt überhaupt keine sentimentalen Gefühle, das hab ich höchstens für Addierung oder XOR von irgendwelchen Listen gebraucht und für sonst nix.
Dennoch hab ich ne Hirnblockade für reduce() eine elegante Reimplementierung auszudenken, ohne Listen und .append() zu verwenden und Objekte immer wieder zu überschreiben/reassignen.
Ich habe mich nicht ausreichend mit 3.x befasst (aus Faulheit und Bequemlichkeit) und sollte es aber bald, daher an dieser Stelle die Diskussion:
A) Wie würdet ihr die fehlenden features lambda, reduce(), filter(), map() in Python implementieren/verwenden?
B) Welche features entfallen noch in Zukunft von denen ich noch nichts weiss (gibt's vielleicht ne komplett-Übersicht über Features, die definitv über Board geworfen werden?)*
C) Wie würde man features aus B) in Python implementieren/verwenden?
D) Wie rechtfertig man (oder umgeht) den Performanceverlust (siehe Beispiel map())?
Bin froh über alle hilfreichen Meinungen, Antworten, Links, ... zum Thema.
*) Stattdessen hab ich hier ne Liste von features gefunden, die definitiv in Python bleiben. xD (Genau das Gegenteil, von was ich suche!)
