Exemples — Décorateurs & générateurs#
Décorateur de mesure de temps#
from functools import wraps
import time
def chronometrer(fonction):
@wraps(fonction)
def wrapper(*args, **kwargs):
debut = time.perf_counter()
resultat = fonction(*args, **kwargs)
print(f"{fonction.__name__} : {time.perf_counter() - debut:.4f}s")
return resultat
return wrapper
@chronometrer
def calcul_lourd(n):
return sum(i**2 for i in range(n))
Décorateur de cache mémoïsation (manuel)#
from functools import wraps
def memoiser(fonction):
cache = {}
@wraps(fonction)
def wrapper(*args):
if args not in cache:
cache[args] = fonction(*args)
return cache[args]
return wrapper
@memoiser
def fibonacci(n):
return n if n < 2 else fibonacci(n - 1) + fibonacci(n - 2)
Équivalent intégré : functools.lru_cache.
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
return n if n < 2 else fibonacci(n - 1) + fibonacci(n - 2)
Générateur de flux paginé#
def paginer(elements, taille_page):
for i in range(0, len(elements), taille_page):
yield elements[i:i + taille_page]
for page in paginer(list(range(10)), 3):
print(page) # [0,1,2] [3,4,5] [6,7,8] [9]
Pipeline de générateurs#
def lire_lignes(chemin):
with open(chemin, encoding="utf-8") as f:
for ligne in f:
yield ligne.rstrip("\n")
def filtrer_non_vides(lignes):
return (l for l in lignes if l.strip())
def vers_majuscules(lignes):
return (l.upper() for l in lignes)
pipeline = vers_majuscules(filtrer_non_vides(lire_lignes("data.txt")))
for ligne in pipeline:
print(ligne)