functools : partial et reduce
Créez des fonctions spécialisées avec partial et réduisez des séquences avec reduce.
functools : partial et reduce est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.
Vue d’ensemble de functools
functools est un module de la bibliothèque standard regroupant des fonctions d’ordre supérieur qui utilisent d’autres fonctions ou en renvoient.
import functools
# partial, reduce, lru_cache, wraps, cached_property ...
print(dir(functools))partial()
functools.partial(func, *args, **kw) crée un nouvel objet appelable dont certains arguments sont préremplis.
import functools
def power(base, exp):
return base ** exp
square = functools.partial(power, exp=2)
cube = functools.partial(power, exp=3)
print(square(4)) # 16
print(cube(3)) # 27partial avec des méthodes
Utilisez partial pour adapter des méthodes dont certains paramètres sont fixes afin de les employer comme fonctions de rappel ou gestionnaires d’événements.
import functools, logging
logger = logging.getLogger("app")
log_error = functools.partial(logger.log, logging.ERROR)
log_error("Something went wrong")partial ou lambda
partial est préférable à lambda pour préremplir des arguments, car il peut être sérialisé, possède une bonne représentation et conserve la chaîne de documentation.
import functools
mul = lambda x, y: x * y
double_lambda = lambda x: mul(x, 2) # lambda approach
double_partial = functools.partial(mul, y=2) # partial approach
print(double_partial(5)) # 10reduce()
functools.reduce(func, iterable, initial) réduit l’itérable de gauche à droite au moyen d’une fonction binaire.
import functools, operator
total = functools.reduce(operator.add, [1,2,3,4,5])
print(total) # 15
product = functools.reduce(operator.mul, [1,2,3,4,5], 1)
print(product) # 120Construire max() avec reduce
Illustrez reduce en réimplémentant max() :
import functools
def my_max(seq):
return functools.reduce(lambda a, b: a if a > b else b, seq)
print(my_max([3, 1, 4, 1, 5, 9])) # 9Aplatir des listes imbriquées
Utilisez reduce avec operator.iconcat pour aplatir un niveau d’imbrication.
import functools, operator
nested = [[1,2],[3,4],[5]]
flat = functools.reduce(operator.iconcat, nested, [])
print(flat) # [1, 2, 3, 4, 5]partial pour construire des URL
Un schéma pratique avec partial : fixez une URL de base et créez des assistants spécialisés pour les requêtes.
import functools, urllib.request
def fetch(base, path):
url = base.rstrip("/") + "/" + path.lstrip("/")
with urllib.request.urlopen(url) as r:
return r.read()
github = functools.partial(fetch, "https://api.github.com")
# github("/users/octocat")wraps() : conserver les métadonnées
Lorsque vous écrivez des décorateurs, utilisez @functools.wraps(wrapped) afin que l’enveloppe conserve le nom et la chaîne de documentation de la fonction originale.
import functools
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
return func(*args, **kw)
return wrapper
@decorator
def greet(name):
"""Say hello."""
return f"Hello, {name}"
print(greet.__name__) # greet
print(greet.__doc__) # Say hello.total_ordering
@functools.total_ordering complète les méthodes de comparaison manquantes lorsque vous définissez __eq__ et l’une des méthodes __lt__/__le__/__gt__/__ge__.
import functools
@functools.total_ordering
class Version:
def __init__(self, major, minor):
self.v = (major, minor)
def __eq__(self, o): return self.v == o.v
def __lt__(self, o): return self.v < o.v
print(Version(1,2) >= Version(1,1)) # Truesingledispatch
@functools.singledispatch crée une fonction qui sélectionne différentes implémentations selon le type du premier argument.
import functools
@functools.singledispatch
def process(arg):
raise NotImplementedError(type(arg))
@process.register(int)
def _(n): return n * 2
@process.register(str)
def _(s): return s.upper()
print(process(5)) # 10
print(process("hi")) # HIVérification rapide
Que crée functools.partial(pow, 2) ?
Récapitulatif
partial préremplit les arguments d’une fonction ; reduce réduit une séquence avec une fonction binaire ; wraps conserve les métadonnées des décorateurs ; total_ordering complète les méthodes de comparaison ; singledispatch sélectionne une implémentation selon le type.
Questions Fréquemment Posées
La leçon « functools : partial et reduce » est-elle gratuite ?
Oui — le texte complet de « functools : partial et reduce » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « functools : partial et reduce » ?
Créez des fonctions spécialisées avec partial et réduisez des séquences avec reduce. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Python Academy ?
Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « functools : partial et reduce » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?
Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- itertools : itérateurs infinis et finis
- itertools : combinatoire
- functools : partial et reduce
- functools : lru_cache et cached_property