Geschichte der Frage
Das Konzept der Higher-Order-Funktionen stammt aus der funktionalen Programmierung und ist seit den Anfängen von Python verfügbar. Es ermöglicht das Erstellen von abstrakterem, flexiblerem und prägnanterem Code.
Problem
Viele unterschätzen die Möglichkeiten von Funktionen als First-Class-Objekten. Fehler treten bei falscher Übergabe/Rückgabe von Funktionen, falschen Aufrufen oder beim Verlust der Lesbarkeit des Codes auf.
Lösung
In Python ist eine Funktion ein vollwertiges Objekt. Eine Funktion kann als Argument übergeben, aus anderen Funktionen zurückgegeben und in Kollektionen gespeichert werden. Dies wird als Higher-Order-Funktion bezeichnet. Dadurch können universelle Wrapper, Callback-Funktionen, Dekoratoren und eine Reihe anderer Muster implementiert werden.
Code-Beispiel:
def apply_function(func, value): return func(value) def square(x): return x * x result = apply_function(square, 5) # Gibt 25 zurück
Schlüsselfeatures:
Können Higher-Order-Funktionen nicht nur Funktionen, sondern auch Daten zurückgeben?
Ja, eine Higher-Order-Funktion ist jede Funktion, die eine Funktion als Argument akzeptiert und/oder eine Funktion zurückgibt. Es gibt keine Einschränkungen für den Rückgabewert.
Gibt die eingebaute Funktion map ein Generatorobjekt oder eine Liste zurück? (Python 3+)
In Python 3 gibt map ein iterierbares Generatorobjekt zurück, kein Liste. Um eine Liste zu erhalten, muss man explizit in list(map(...)) einwickeln.
squared = map(lambda x: x**2, [1,2,3]) result = list(squared) # Jetzt erhalten wir [1, 4, 9]
Ist es möglich, Funktionen Variablen zuzuweisen und sie in Kollektionen zu speichern?
Ja, Funktionen können Variablen zugewiesen, in Listen, Dictionaries gespeichert und als Werte übergeben werden. Dies sind gewöhnliche Python-Objekte.
def greet(): print('Hello') a = greet a() # Ruft greet auf
Der Versuch, Logging für mehrere Funktionen ohne Higher-Order-Funktionen zu implementieren, führte zu Code-Duplizierung und Fehlern in jedem einzelnen Handler.
Vorteile:
Nachteile:
Ein universeller Dekorator-Logger wurde eingeführt — alle Funktionen wurden einheitlich protokolliert, der Code wurde klarer.
Vorteile:
Nachteile: