Historia pytania
Koncepcja funkcji wyższego rzędu pochodzi z programowania funkcyjnego i jest dostępna w Pythonie od samego początku. Pozwala na tworzenie bardziej abstrakcyjnego, elastycznego i zwięzłego kodu.
Problem
Wielu niedocenia możliwości funkcji jako obiektów pierwszej klasy. Błędy pojawiają się przy nieprawidłowym przekazywaniu/zwrocie funkcji, błędnych wywołaniach lub utracie czytelności kodu.
Rozwiązanie
W Pythonie funkcja jest pełnoprawnym obiektem. Funkcję można przekazywać jako argument, zwracać z innych funkcji i przechowywać w kolekcjach. To właśnie nazywa się funkcją wyższego rzędu. Umożliwia to realizację uniwersalnych opakowań, callbacków, dekoratorów i szeregu innych wzorców.
Przykład kodu:
def apply_function(func, value): return func(value) def square(x): return x * x result = apply_function(square, 5) # Zwróci 25
Kluczowe cechy:
Czy funkcje wyższego rzędu mogą zwracać nie tylko funkcje, ale również dane?
Tak, funkcja wyższego rzędu to każda funkcja, która przyjmuje funkcję jako argument i/lub zwraca funkcję. Nie ma ograniczeń dotyczących wartości zwracanej.
Czy wbudowana funkcja map zwraca obiekt-generator czy samą listę? (Python 3+)
W Pythonie 3 map zwraca iterowalny obiekt-generator, a nie listę. Aby uzyskać listę, należy jawnie opakować w list(map(...)).
squared = map(lambda x: x**2, [1,2,3]) result = list(squared) # Teraz otrzymamy [1, 4, 9]
Czy możliwe jest przypisywanie funkcji do zmiennych i przechowywanie ich w kolekcjach?
Tak, funkcje są przypisywane do zmiennych, mogą być przechowywane w listach, słownikach i przekazywane jako argumenty jako wartości. To zwykłe obiekty Pythona.
def greet(): print('Hello') a = greet a() # Wywoła greet
Próba wdrożenia logowania dla kilku funkcji bez funkcji wyższego rzędu doprowadziła do powielania kodu i błędów w każdym pojedynczym handlerze.
Zalety:
Wady:
Wprowadzono uniwersalny dekorator-logger — wszystkie funkcje zaczęły być logowane jednolicie, kod stał się czystszy.
Zalety:
Wady: