Open Source im professionellen Einsatz

Newsletter abonnieren
Seite durchsuchen

HEFTARCHIV | NEWS | E-BIBLIOTHEK | VIDEO | BLOGS | WHITEPAPER | EVENTS | ACADEMY | ABO | SHOP

user friendly

  Home  »  Online Artikel  »  Funktionale Programmierung (2): Python funktional  

RSS-Feed der aktuellen News von Linux-Magazin Online Folgen Sie Linux-Magazin Online auf Twitter
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark

Funktionen höherer Ordnung

Will der Programmierer in Python Listen verarbeiten, stehen ihm die bekannten Funktionen höherer Ordnung "map", "filter" und "reduce" zur Verfügung. Mit ihrer Hilfe lassen sich Funktionen auf Elemente einer Liste anwenden, Elemente aus der Liste herausfiltern und Listen auf ein Rückgabewert reduzieren, indem sukzessive eine Operation auf Paare der Liste angewandt wird. Werten diese Funktionen in Python 2.* noch strikt aus, so sind sie in Python 3.* "lazy".

Die Funktion "reduce", die der Haskell-Funktionsfamilie "fold*" entspricht, wird in Python deutlicher seltener verwendet als in rein funktionalen Programmiersprachen. Dies ist wohl der Grund dafür, dass sie mit Python 3.* keine Built-In-Funktion mehr darstellt, sondern in die "functools" Bibliothek wandert. Ein paar Beispiele sollen den Umgang mit den drei funktionalen Built-In-Funkionen in Python verdeutlichen (Abbildung 10). Durch Lambda-Funktionen und die Bibliothek "operator", die einen reichen Satz an Operatoren zu Verfügung stellt, lassen sich kompakte Ausdrücke formulieren.


Abbildung 10: Map, Filter und Reduce in Aktion.

Ist es für eine funktionale Programmiersprache typisch, komplexe Funktionskompositionen aus elementaren Bausteinchen zu bauen, so leidet in Python die Lesbarkeit des Codes darunter, wie die Komposition der Funktionen "map", "filter" und "reduce" zeigt. Typisch für Python Code ist es, solche Kompositionen durch List Comprehension "sum[ x*x for x in range(21) if x%2 != 0]" auszudrücken. Nun aber alles der Reihe nach.

List Comprehension

"map"- und "filter"-Ausdrücke werden in Python gerne durch List Comprehension implementiert. Eine List Comprehension besteht aus einer Menge von Sequenzen "sequence1 .. sequence2", über die iteriert wird, einem Filter "if condition", der die Elemente aus Menge von Sequenzen gegebenfalls passieren lässt und einem Ausdruck ("expression"), der auf die verbliebenen Elemente angewandt wird. Listing 3 enthält die allgemeine Form der List Comprehension.

Listing 3: List Comprehension

[ expression for item1 in sequence1
             for item2 in sequence2
             ...
             for itemN in sequenceN
             if condition ]

Zwar gilt List Comprehension als Syntactic Sugar zu den Funktionen "map" und "filter", aber sie kann durchaus auch als Alternative zur Listenverarbeitung aufgefasst werden (Listing 4).

Listing 4: List Comprehension ausgeschrieben

s=[]
for item1 in sequence1:
  for item2 in sequence2:
    ...
           for itemN in sequenceN:
             if condition: s.append(expression)

Dass List Comprehension die Funktionalität von "map" und "filter" in eleganter Weise anbietet, illustrieren die nächsten Beispiele (Abbildung 11).


Abbildung 11: Map, Filter und List Comprehension im Vergleich.

In dem letzten Beispiel zum pythagoreischen Tripel findet eine Iteration über 3 Schleifen statt.

Der Quicksort-Algorithmus in Haskell aus dem Vorgänger dieses Artikels lässt sich auch in Python (Listing 5) elegant implementieren, vergleicht man dies mit imperativen Herangehensweisen in C++, C# oder auch Java im Algorithm-Wiki. Gleichzeitig stehen sich im Listing 6 die Implementierung des Sortierverfahrens mittels List Comprehension und "filter" gegenüber. Im Fall von List Comprehension wird das Prädikat "if lt < L[0]", bzw. im Falle der builtin-in Funktion "filter" die Lambda Funktion "lambda lt: lt < L[0] " verwendet, um die ursprüngliche Liste entsprechend dem Pivotelement L[0] zu sortieren. "L[1:]" ist die Liste ohne ihr erstes Element; in der funktionaler Ausdrucksweise als "tail" der Liste bezeichnet.

Listing 5: Quicksort mit List Comprehension und Filter

def qsortListComprehension(L):
    if len(L) <= 1: return L
    return qsortListComprehension( [lt for lt in L[1:] if lt <  L[0]] ) + L[0:1] + qsortListComprehension( [ge for ge in L[1:] if ge >= L[0]] )

def qsortFilter(L):
    if len(L) <= 1: return L
    return qsortFilter( filter(lambda lt: lt < L[0] , L[1:]) ) + L[0:1] + qsortFilter( filter(lambda gt: gt >= L[0] , L[1:]) )
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark
Ähnliche Artikel
Funktionale Programmierung (3): Das MapReduce-Framework Funktionale Programmierung (3): Das MapReduce-Framework
Funktionale Programmierung (1): Grundzüge Funktionale Programmierung (1): Grundzüge
Objekterkennung Python-Skript erkennt Gesichter, Haut und Texte
Vernetzte Welten Das Globus-Toolkit, Version 2
Postverteilung Software zur Verwaltung von Verteilerlisten
Deko mit Nutzen Dekoratoren in Python
Whitepaper
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele

Über die letzten Jahre hinweg haben sich Open Source Lösungen als fester Bestandteil des gesamten Datenintegrationsmarktes etabliert. Viele Unternehmen haben bereits das Open Source Modell für Ihre Datenintegrationsprojekte aufgegriffen. Das vorliegende White Paper illustriert anhand ausgewählter Fallstudien und Anwendungsbeispiele die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.

Download PDF (Registrierung erforderlich)
The Role of Open Source in Data Integration

Obwohl in den letzten Jahren viele technische Fortschritte erzielt werden konnten, verfügen die meisten Datenintegrationsprozesse nach wie vor nur über eine sehr begrenzte Automatisierung. Das vorliegende White Paper von dem Industry Analyst Mark Madson wird zunächst ein grundlegendes Verständnis von Daten Integration vermitteln, die Vorzüge von Open Source Lösungen für Daten Integration erläutern und Ihnen professionelle Empfehlungen geben, damit Sie Ihre Integrationsjobs noch einfacher und produktiver gestalten können.

Download PDF (Registrierung erforderlich)
Kommentare (2)
von
Mathias Huber,
25.01.2010 17:31
Re: Kleiner Fehler in qSortFilter
Haben Sie herzlichen Dank für den Hinweis! Wir haben das Listing korrigiert.
von
hochmohr,
23.01.2010 19:52
Kleiner Fehler in qSortFilter
Zwei kleine Fehler haben sich eingeschlichen:

def qsortFilter(L):
if len(L) <= 1: return L
return qsortFilter( filter(lambda lt: lt < L[0] , L[1:]) ) + L[0:1] + qsortFilter( filter(lambda gt: gt >= L[0] , L[1:]) )