Pratique Python, IA Engineering et bien plus avec des exercices interactifs et des tests automatiques.
Le protocole de sequence en Python repose sur deux méthodes speciales : __len__() et __getitem__(). Si ta classe implémente ces deux méthodes, tes objets se …
Un decorateur, c'est une fonction qui prend une autre fonction en paramètre et renvoie une nouvelle fonction qui l'enveloppe. Imagine un cadeau : la fonction …
Les decorateurs sont tres utiles pour ajouter des vérifications sans modifier la fonction originale. Un cas courant : vérifier que les arguments passes sont du …
Les fonctions en Python sont des objets. Ca veut dire que tu peux leur ajouter des attributs, comme a n'importe quel objet. Par exemple, apres …
Quand tu utilises un decorateur, la fonction decoree perd son nom et sa docstring. Regarde : def mon_deco(func): def wrapper(*args, **kwargs): return func(*args, **kwargs) return …
La memoization est une technique d'optimisation qui consiste a stocker les résultats d'appels précédents pour eviter de recalculer. C'est comme prendre des notes : au …
Jusqu'ici, nos decorateurs ne prenaient pas de paramètres. Mais parfois, tu veux configurer le decorateur. Par exemple, repeter une fonction 3 fois, ou 5 fois, …
Tu peux empiler plusieurs decorateurs sur une meme fonction. L'ordre compte : le decorateur le plus proche de la fonction est applique en premier, puis …
Dans la vraie vie, tu utilises souvent des decorateurs pour gerer les erreurs. Un pattern tres courant : le retry (reessayer). Si une fonction echoue, …
Les decorateurs ne s'appliquent pas qu'aux fonctions. Tu peux aussi decorer des classes. Un cas d'utilisation classique : le pattern Singleton. Le Singleton garantit qu'une …
Pour finir cette serie, un exercice qui ressemble a ce qu'on fait dans la vraie vie. Dans une application web, tu veux souvent restreindre l'acces …
En Python, quand tu écris une boucle for sur une liste, il se passe quelque chose sous le capot. Python appelle d'abord iter() sur la …
Pour qu'un objet soit utilisable dans une boucle for, il doit respecter le protocole itérable. Ça veut dire qu'il doit avoir une méthode __iter__() qui …
Maintenant que tu sais créer une classe itérable, on va en faire une plus utile. Le principe est le même : __iter__ renvoie self, __next__ …
Les générateurs sont une manière beaucoup plus simple de créer des itérateurs. Au lieu d'écrire une classe avec __iter__ et __next__, tu écris une simple …
Tu te souviens de la classe Pairs qu'on a écrite plus tôt ? Il fallait définir __init__, __iter__ et __next__, gérer StopIteration soi-même... C'était une …
La suite de Fibonacci est une séquence où chaque nombre est la somme des deux précédents : 0, 1, 1, 2, 3, 5, 8, 13, …
Tu as peut-être déjà écrit une fonction qui renvoie la liste des nombres premiers. Avec un générateur, on peut faire mieux : au lieu de …
Tu n'es pas obligé d'utiliser un for pour consommer un générateur. Tu peux appeler next() manuellement pour récupérer les valeurs une par une. C'est utile …
Tu connais les compréhensions de listes : [x**2 for x in range(10)]. Elles créent une liste complète en mémoire. Si tu remplaces les crochets par …
Parfois, un générateur a besoin de produire les valeurs d'un autre itérable. Tu pourrais écrire une boucle for avec yield dedans : def mon_generateur(): for …
Un des grands avantages des générateurs, c'est qu'ils peuvent produire une séquence infinie. Comme les valeurs sont calculées à la demande, le générateur ne plante …
Jusqu'ici, on a vu les générateurs comme des producteurs de données : ils produisent des valeurs avec yield. Mais yield peut aussi recevoir des valeurs. …
Le module itertools de Python fournit plein d'outils pour travailler avec des itérables de manière efficace. Deux fonctions particulièrement utiles : itertools.chain(*iterables) enchaîne plusieurs itérables …