Geschiedenis van de vraag
Het concept van hogere-orde functies komt uit de functionele programmeertaal en is vanaf het begin beschikbaar in Python. Het stelt ons in staat om abstractere, flexibele en beknopte code te schrijven.
Probleem
Velen onderschatten de mogelijkheden van functies als first-class objecten. Fouten kunnen optreden bij onjuiste overdracht/teruggave van functies, verkeerde aanroepen of verlies van codeleesbaarheid.
Oplossing
In Python is een functie een volwaardig object. Een functie kan als argument worden doorgegeven, worden geretourneerd vanuit andere functies en in collecties worden opgeslagen. Dit wordt een hogere-orde functie genoemd. Dit maakt de implementatie van universele wrappers, callbacks, decorators en een aantal andere patronen mogelijk.
Codevoorbeeld:
def apply_function(func, value): return func(value) def square(x): return x * x result = apply_function(square, 5) # Geeft 25 terug
Belangrijkste kenmerken:
Kunnen hogere-orde functies niet alleen functies retourneren, maar ook gegevens?
Ja, een hogere-orde functie is elke functie die een functie als argument accepteert en/of een functie retourneert. Er zijn geen beperkingen op het geretourneerde waarde.
Geeft de ingebouwde functie map een generator object of de lijst zelf terug? (Python 3+)
In Python 3 geeft map een iterabel generator object terug, geen lijst. Om een lijst te krijgen moet je het expliciet in list(map(...)) wikkelen.
squared = map(lambda x: x**2, [1,2,3]) result = list(squared) # Nu krijgen we [1, 4, 9]
Is het mogelijk om functies aan variabelen toe te wijzen en ze in collecties op te slaan?
Ja, functies kunnen aan variabelen worden toegewezen, kunnen in lijsten, dictionaries worden opgeslagen en als waarden door argumenten worden doorgegeven. Dit zijn gewone Python-objecten.
def greet(): print('Hello') a = greet a() # Roept greet aan
Poging om logging voor meerdere functies te implementeren zonder hogere functies leidde tot duplicatie van code en fouten in elke afzonderlijke handler.
Voordelen:
Nadelen:
Een universele logger-decorator werd geïntroduceerd - alle functies werden uniform gelogd, de code werd schoner.
Voordelen:
Nadelen: