Historique de la question
Le concept de fonctions de haut niveau vient de la programmation fonctionnelle et est présent en Python depuis le début. Il permet d'écrire un code plus abstrait, flexible et concis.
Problème
Beaucoup sous-estiment les capacités des fonctions en tant qu'objets de premier ordre. Des erreurs se produisent lors du passage/retour inapproprié de fonctions, d'appels incorrects ou d'une perte de lisibilité du code.
Solution
En Python, une fonction est un objet complet. Une fonction peut être passée comme argument, retournée d'autres fonctions et stockée dans des collections. C'est ce qu'on appelle une fonction de haut niveau. Cela permet de mettre en œuvre des wrappers universels, des callbacks, des décorateurs et un certain nombre d'autres motifs.
Exemple de code :
def apply_function(func, value): return func(value) def square(x): return x * x result = apply_function(square, 5) # Renvoie 25
Caractéristiques clés :
Les fonctions de haut niveau peuvent-elles retourner non seulement des fonctions, mais aussi des données ?
Oui, une fonction de haut niveau est toute fonction qui prend une fonction comme argument et/ou en retourne une. Il n'y a aucune restriction sur la valeur de retour.
La fonction intégrée map retourne-t-elle un objet générateur ou une liste elle-même ? (Python 3+)
En Python 3, map renvoie un objet générateur itérable, et non une liste. Pour obtenir une liste, il faut explicitement envelopper dans list(map(...)).
squared = map(lambda x: x**2, [1,2,3]) result = list(squared) # Nous obtiendrons maintenant [1, 4, 9]
Est-il possible d'assigner des fonctions à des variables et de les stocker dans des collections ?
Oui, les fonctions peuvent être assignées à des variables, peuvent être stockées dans des listes, des dictionnaires et passées comme arguments en tant que valeurs. Ce sont des objets Python ordinaires.
def greet(): print('Hello') a = greet a() # Appellera greet
Essayer de faire du logging pour plusieurs fonctions sans fonctions de haut niveau a conduit à dupliqué le code et à des erreurs dans chaque gestionnaire distinct.
Avantages :
Inconvénients :
Introduction d'un décorateur logger universel - toutes les fonctions ont commencé à être loguées de manière uniforme, le code est devenu plus propre.
Avantages :
Inconvénients :