EMZETT.
Login

Higher-Order-Funktion (Funktion höherer Ordnung)

Kurz: Eine Higher-Order-Funktion nimmt andere Funktionen als Argument entgegen oder gibt eine Funktion als Ergebnis zurück. Bekannte Beispiele sind map, filter und reduce.

Genauer: Sie setzt voraus, dass Funktionen Werte erster Klasse sind: Man kann sie in Variablen speichern, übergeben und zurückgeben. Das ist der Kern der funktionalen Programmierung, aber heute in fast jeder Sprache möglich. Schleifen mit Zustand werden durch aussagekräftige Operationen ersetzt.

Im Detail

zahlen = [1, 2, 3, 4, 5, 6]
 
quadrate = list(map(lambda x: x * x, zahlen))          # [1, 4, 9, 16, 25, 36]
gerade   = list(filter(lambda x: x % 2 == 0, zahlen))  # [2, 4, 6]
 
from functools import reduce
summe = reduce(lambda acc, x: acc + x, zahlen, 0)       # 21
 
woerter = ["Birne", "Apfel", "Kiwi"]
print(sorted(woerter, key=len))     # ['Kiwi', 'Birne', 'Apfel']
const preise = [10, 25, 5, 40];
const brutto = preise.map((p) => p * 1.19);
const teuer = preise.filter((p) => p > 20);
const gesamt = preise.reduce((summe, p) => summe + p, 0);
console.log(brutto, teuer, gesamt);

Die Standardoperationen

OperationBedeutung
mapwende eine Funktion auf jedes Element an
filterbehalte nur Elemente, die eine Bedingung erfüllen
reduce / foldfasse alle Elemente zu einem Wert zusammen
sort(key)sortiere nach einem selbst gewählten Schlüssel
flatMapmap plus Abflachen
any / allgilt die Bedingung für mindestens ein / alle Elemente?

Funktionen zurückgeben

def addierer(n):
    return lambda x: x + n       # gibt eine Funktion zurück
 
plus5 = addierer(5)
print(plus5(10))                  # 15

Solche Funktionen erzeugen Closures. Zerlegt man eine Funktion mit mehreren Parametern in Ketten von Funktionen mit je einem Parameter, spricht man von Currying.

Siehe auch: Lambda-Ausdruck, Closure, Pure Function, Iterator