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
| Operation | Bedeutung |
|---|---|
map | wende eine Funktion auf jedes Element an |
filter | behalte nur Elemente, die eine Bedingung erfüllen |
reduce / fold | fasse alle Elemente zu einem Wert zusammen |
sort(key) | sortiere nach einem selbst gewählten Schlüssel |
flatMap | map plus Abflachen |
any / all | gilt 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)) # 15Solche 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