Skip to content

Functools Python: Fonctions d'ordre supérieur et opérations sur les objets appelables

Python, un langage de programmation de haut niveau, est connu pour sa simplicité et sa lisibilité. L'une des nombreuses fonctionnalités qui distinguent Python est sa bibliothèque standard étendue, qui comprend divers modules pour simplifier le processus de codage. Parmi ces modules, le module functools est un outil puissant qui fournit des fonctions d'ordre supérieur et des opérations sur les objets appelables. Cet article explorera les fonctionnalités du module functools, en fournissant des explications détaillées, des définitions et des exemples.

Le module functools fait partie de la bibliothèque standard de Python, conçu pour fournir des fonctionnalités facilitant le travail avec des fonctions d'ordre supérieur. Une fonction d'ordre supérieur est une fonction qui prend soit une autre fonction en argument, soit renvoie une fonction. Cette capacité permet une plus grande flexibilité et réutilisabilité dans la programmation, permettant aux développeurs d'écrire un code plus efficace et plus propre.

Vous voulez créer rapidement des visualisations de données à partir d'un DataFrame Python Pandas sans code ?

PyGWalker est une bibliothèque Python pour l'analyse exploratoire de données avec visualisation. PyGWalker (opens in a new tab) peut simplifier votre flux de travail d'analyse de données et de visualisation de données dans Jupyter Notebook, en transformant votre dataframe pandas (et votre dataframe polars) en une interface utilisateur de type Tableau pour l'exploration visuelle.

PyGWalker for Data visualization (opens in a new tab)

Partie 1: Comprendre le module functools

Le module functools en Python est une collection de fonctions d'ordre supérieur. Une fonction d'ordre supérieur est une fonction qui peut prendre une ou plusieurs fonctions comme arguments, ou renvoyer une fonction en tant que résultat. Ce concept est un aspect fondamental de la programmation fonctionnelle, un paradigme où les fonctions sont des citoyens de première classe et peuvent être transmises et utilisées comme n'importe quel autre type de données.

Le module functools fournit plusieurs fonctions qui peuvent être utilisées pour manipuler et combiner d'autres fonctions. Celles-ci incluent:

  • functools.reduce(): Cette fonction applique une fonction binaire (une fonction qui prend deux arguments) à un itérable de manière cumulative. Par exemple, si la fonction est l'addition, et l'itérable est une liste de nombres, reduce() renverra la somme de tous les nombres de la liste.

  • functools.partial(): Cette fonction vous permet de fixer un certain nombre d'arguments d'une fonction et de générer une nouvelle fonction. Cela peut être particulièrement utile lorsque vous souhaitez "mémoriser" certains arguments d'une fonction.

  • functools.wraps(): Il s'agit d'un décorateur pour mettre à jour les attributs de la fonction de décoration par ceux de la fonction d'origine. Cela est utile lorsque vous utilisez des décorateurs, car il conserve les métadonnées de la fonction d'origine.

Partie 2: Utilisations pratiques de functools

Le module functools n'est pas seulement un concept théorique, mais il a des utilisations pratiques dans les applications du monde réel. Voyons quelques exemples de la façon dont vous pouvez utiliser functools dans votre code Python.

functools.reduce()

La fonction functools.reduce() est un outil puissant qui peut être utilisé pour traiter et accumuler des données à partir d'un itérable. Voici un exemple:

from functools import reduce
 
numbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x * y, numbers)
 
print(result)  # Output: 120

Dans cet exemple, reduce() prend deux arguments: une fonction et un itérable. La fonction est une fonction lambda qui prend deux arguments et renvoie leur produit. L'itérable est une liste de nombres. reduce() applique la fonction aux éléments de l'itérable de manière cumulative: elle applique d'abord la fonction aux deux premiers éléments, puis au résultat et à l'élément suivant, et ainsi de suite. Le résultat est le produit de tous les éléments de la liste.

functools.partial()

La fonction functools.partial() vous permet de fixer un certain nombre d'arguments d'une fonction et de générer une nouvelle fonction. Cela peut être particulièrement utile lorsque vous souhaitez "mémoriser" certains arguments d'une fonction. Voici un exemple:

from functools import partial
 
def multiply(x, y):
    return x * y
 
# Créez une nouvelle fonction qui multiplie par 2
double = partial(multiply, 2)
 
print(double(4))  # Output: 8

Dans cet exemple, partial() est utilisé pour créer une nouvelle fonction double() qui multiplie son argument par 2. Cela est fait en fixant le premier argument de la fonction multiply() à 2.

functools.wraps()

La fonction functools.wraps() est un décorateur utilisé pour indiquer qu'une fonction enveloppe une autre fonction. Cela est utile lorsque vous utilisez des décorateurs, car il conserve les métadonnées de la fonction d'origine. Voici un exemple:

from functools import wraps
 
def my_decorator(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print("Avant d'appeler la fonction")
        result = f(*args, **kwargs)
        print("Après avoir appelé la fonction")
        return result
    return wrapper
 
@my_decorator
def add(x, y):
    """Ajoute deux nombres"""
    return x + y
 
print(add.__name__)  # Output: add
print(add.__doc__)   # Output: Ajoute deux nombres

Dans cet exemple, wraps() est utilisé dans la définition d'un décorateur my_decorator(). Le décorateur ajoute un comportement (affichage de messages) avant et après l'appel de la fonction qu'il décore. En utilisant wraps(), les métadonnées de la fonction d'origine (son nom et sa documentation) sont préservées.

Partie 3: functools vs itertools

La bibliothèque standard de Python inclut également un autre module pour traiter les opérations sur les itérables: itertools. Alors que functools fournit des fonctions d'ordre supérieur et des opérations sur les objets appelables, itertools fournit un ensemble d'outils pour créer des itérateurs. Ces outils peuvent être utilisés pour des boucles efficaces, la génération de permutations et de combinaisons, et d'autres tâches de manipulation de données.

Les modules functools et itertools se complètent mutuellement et peuvent souvent être utilisés ensemble. Par exemple, vous pouvez utiliser itertools.cycle() pour créer un itérateur infini, et functools.partial() pour créer une fonction qui génère un nombre fini d'éléments à partir de cet itérateur.

En conclusion, le module functools est un outil puissant dans la bibliothèque standard de Python qui fournit un ensemble de fonctions d'ordre supérieur et des opérations sur les objets appelables. En comprenant et en utilisant functools, vous pouvez écrire un code Python plus efficace et plus propre. Que vous soyez un débutant qui commence tout juste avec Python ou un développeur expérimenté cherchant à améliorer vos compétences, functools est un module qui mérite d'être exploré.

Partie 4: Nouvelles fonctionnalités de functools en Python 3.10

Python 3.10 a introduit de nouvelles fonctionnalités dans le module functools, améliorant ses capacités et le rendant encore plus puissant.

Une des nouvelles fonctionnalités est la fonction functools.cache(). Cette fonction est un remplacement plus simple et plus efficace pour functools.lru_cache(). Elle crée un cache qui stocke les résultats des appels de fonction, de sorte que lorsque la fonction est appelée à nouveau avec les mêmes arguments, le résultat peut être renvoyé à partir du cache au lieu d'être recalculé. Cela peut accélérer considérablement l'exécution des fonctions qui sont appelées de manière répétée avec les mêmes arguments.

Voici un exemple d'utilisation de functools.cache():

from functools import cache
 
@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)
 
print(fibonacci(10))  # Sortie: 55

Dans cet exemple, cache() est utilisé comme décorateur pour la fonction fibonacci(). Cette fonction calcule le nième nombre de Fibonacci, et elle est appelée de manière récursive. En utilisant cache(), les résultats des appels précédents sont stockés, de sorte qu'ils peuvent être réutilisés dans les appels ultérieurs. Cela accélère considérablement le calcul des nombres de Fibonacci.

Partie 5: functools dans des applications du monde réel

Le module functools n'est pas seulement un concept théorique, mais il a des utilisations pratiques dans des applications du monde réel. Il est utilisé dans divers domaines, de la science des données et de l'apprentissage automatique au développement web et à l'automatisation.

En science des données et en apprentissage automatique, functools peut être utilisé pour créer des pipelines de traitement de données complexes. Par exemple, vous pouvez utiliser functools.partial() pour créer des fonctions qui prétraitent les données d'une certaine manière, puis combiner ces fonctions à l'aide de functools.reduce() pour créer un pipeline qui traite les données en plusieurs étapes.

En développement web, functools peut être utilisé pour créer des middleware et des décorateurs. Par exemple, vous pouvez utiliser functools.wraps() pour créer des décorateurs qui ajoutent des comportements aux gestionnaires de requêtes web, tels que l'authentification et le journalisation.

En automatisation, functools peut être utilisé pour créer des tâches composées de plusieurs étapes. Par exemple, vous pouvez utiliser functools.partial() pour créer des tâches qui effectuent une certaine action avec un ensemble spécifique de paramètres, puis utiliser functools.reduce() pour combiner ces tâches en un flux de travail.

Conclusion

En conclusion, le module functools est un outil puissant dans la bibliothèque standard de Python qui fournit un ensemble de fonctions d'ordre supérieur et des opérations sur les objets appelables. En comprenant et en utilisant functools, vous pouvez écrire un code Python plus efficace et plus propre. Que vous soyez un débutant qui commence tout juste avec Python ou un développeur expérimenté cherchant à améliorer vos compétences, functools est un module qui mérite d'être exploré.


FAQ

Qu'est-ce que le module functools en Python ?

Le module functools fait partie de la bibliothèque standard de Python et fournit des fonctions d'ordre supérieur et des opérations sur les objets appelables. Il inclut des fonctions comme reduce(), partial() et wraps() qui peuvent être utilisées pour manipuler et combiner d'autres fonctions.

Comment la fonction partial() fonctionne-t-elle dans le module functools de Python ?

La fonction partial() dans le module functools de Python vous permet de fixer un certain nombre d'arguments d'une fonction et de générer une nouvelle fonction. Cela peut être particulièrement utile lorsque vous souhaitez "mémoriser" certains arguments d'une fonction.

Quel est le but de la fonction wraps() dans le module functools de Python ?

La fonction wraps() dans le module functools de Python est un décorateur qui indique qu'une fonction enveloppe une autre fonction. Cela est utile lorsque vous utilisez des décorateurs, car cela conserve les métadonnées de la fonction originale.