Session de mentorat TOSA
Session du 13 septembre 2024 à 21h00
Structures de Données
TOSA & Certifications
Qualité & Architecture
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Session de mentorat TOSA
Dans cette session on aborde principalement le concept de générateurs et d'itérateurs. On voit également l'utilisation des décorateurs dans un contexte Python pur et Django. Pour finir, on passe en revue la différence entre extend et append sur les listes et quelques particularités des compréhensions de liste imbriquées.
00:00:00 :C'est parti. Ça enregistre.Du coup, celui-là, on va commencer par ce que tu as demandé.Et on va commencer par les générateurs.J'ai préparé un petit...
00:00:16 :J'ai essayé de faire concis.Alors, je vais grossir.En plus, c'est bien parce qu'en plus, ça peut être très bien des questions au TOSA, ça aussi.
00:00:29 :Donc, c'est bien de le connaître.C'est petit quand même. Je vais essayer de le grossir à fond, mais...En fait, non, ça ne grossit pas le...
00:00:38 :OK. Alors, attendez. C'est génial.Ça ne grossit pas le readme. Vous ne voyez pas bien, vous, le readme ?Attendez, je ne vais pas caster encore.
00:00:48 :Ça risque pas de fonctionner.Je vais me mettre sur l'écran du bas, peut-être.Hop.Est-ce que vous voyez mon écran ?Oui.Le code est trop petit, le code, peut-être, non ?
00:01:06 :Moi, je vois l'écran. Je vois Python.Et vous voyez bien ce qu'il y a dedans, le code, ou pas, là ?Oui, générateur en Python.
00:01:18 :Et vous voyez bien ce qu'il y a dedans, le code, ou pas, là ?Oui, générateur en Python.Et vous voyez le code qu'il y a, par exemple, que je sélectionne ?
00:01:26 :Là, c'est petit.C'est vraiment petit, on ne voit pas grand-chose.OK.Je pense que là, c'est mieux.OK, OK.Hop, là, c'est mieux.Parce que celui-là, il avait une question sur le générateur.
00:01:44 :J'ai essayé de faire un truc simple, sans trop... On peut facilement s'y perdre.J'ai mis un schéma, en plus, dans mon...Je ne sais pas si je peux le grossir, le schéma, d'ailleurs.
00:01:54 :Ouais, non, moyennement.Ouais, moyennement.J'ai mis un...Parce que, là, j'ai mis que le générateur,c'est aussi un type d'itérateur, c'est un itérable.Liste du générateur, tuple set, c'est un itérable.
00:02:12 :Et, en fait, le générateur, c'est un type d'itérable.Tuple set, c'est un itérable.Et, en fait, on peut produire un itérateur.Ça, je laisserai méditer après.
00:02:25 :On va vraiment parler maintenant du texte que j'ai préparé.Alors...Les itérateurs et les générateurs, du coup, c'est des équipes puissantspour bosser avec des séquences de données dans vos programmes.
00:02:39 :Donc...Les itérateurs.Par exemple...Je l'ai mis où ?Itérable.Voilà.Ici, avec ma liste, vous avez un itérable.Donc, liste, tuple, ça, c'est un itérable.
00:02:59 :Et, implicitement, avec Python,quand vous faites une boucle de force sur votre itérable,en fait, Python va utiliser un itérateur.Voilà.C'est comme si, en fait,c'est comme si vous faisiez vraiment manuellement un itérateur.
00:03:17 :Vous utilisez la fonction iter sur votre listepour créer un itérateur.Et ensuite,vous allez pouvoir utiliser la fonction nextpour printer, en fait, chaque élément au fur et à mesure.
00:03:33 :Et, donc, votre itérateur,une fois que vous avez parcouru toutes les données,vous avez une exception stopItération qui est élevée.Et donc, ici, on la gère.
00:03:43 :Et, en gros, l'itérateur est effusé.En gros, quand vous faites une boucle fort,quand tu utilises une boucle fort en Python,c'est comme si, implicitement, vous avez créé un itérateur.
00:03:53 :Et si vous voulez le faire de manière explicite,c'est comme si vous faisiez ça, en gros.Donc, voilà.Là, ça, c'est pour les itérateurs.Un petit exemple.
00:04:05 :Du coup,avec la fonction iter sur un itérable.Donc, comme on a dit tout à l'heure, une liste, par exemple,fonction de caractère, un tuple.
00:04:17 :Vous allez utiliser la fonction iter sur votre itérable.Et l'objet, par contre, l'objet est déjà en mémoire.Par exemple, je le mets ici.Vous avez votre liste.
00:04:29 :Vous allez créer un itérateur.Donc, iter de votre liste, la fruite.Donc, là, j'ai mon itérateur qui est ici, dans ma variable.Et je peux le parcourir.
00:04:39 :Donc, si je fais next, il est fruit.Je lui affiche d'abord la pomme.Si je refais un next, la banane.Un next, un orange, et ainsi de suite, jusqu'au bout.
00:04:48 :Et quand j'arrive au bout,je lève une stop iteration, comme je l'avais dit tout à l'heure.Ici, je lève cette erreur.Donc, voilà.Quand vous faites ça sur un itérable, du coup, votre itérateur,quand vous le transformez comme ça,votre liste fruit, elle est déjà en mémoire.
00:05:16 :Maintenant, les générateurs.Donc, avec un générateur,donc là, avec un itérateur, vous avez next, fruit,et vous produisez à chaque fois vos...Vous parcourez et vous retournez à chaque fois chaque élément,à chaque next.
00:05:31 :Les générateurs.Un générateur, du coup,vous n'allez pas tout stocker dans la mémoire.Que là, en fait, tout est déjà stocké en mémoire quand on fait ça.
00:05:39 :Mais avec un générateur, non.Donc, voilà.Avec un générateur, pour les grandes quantités de données,c'est très pratique.Et oui, c'est vrai que j'ai déjà vu, ça peut s'utiliser avec des flux infinis.
00:05:50 :Donc là, en fait, pour créer un itérateur,vous allez soit utiliser une fonction génératrice.Donc là, vous avez une fonction maximum.Et vous allez utiliser le mot yield à la place d'un return.
00:06:02 :Vous l'avez déjà vu, ça, ou pas ?Oui, j'ai l'a aussi, mais pas beaucoup utilisé.OK.Un piton noir.Ouais.OK.Donc là, en fait, ça permet de créer un générateur.
00:06:18 :Donc ça veut dire que votre générateur, vous allez pouvoir vous boucler dessus.Vous allez tout afficher comme ça à la suite.Il n'y a pas de problème.
00:06:29 :Mais vous pouvez faire comme on a fait tout à l'heure.Faire un next sur votre carré générateur.Faire un next.Et vous allez appeler les éléments un par un.
00:06:44 :Et comme je l'ai dit tout à l'heure, avec les générateurs,sauf que vous ne chargez pas tout en mémoire.C'est très, très économique en mémoire.
00:06:51 :Et une fois que vous arrivez au bout de votre générateur,quand vous avez utilisé sur tout, avec next par exemple,il est consommé.Et donc, vous ne pouvez plus itérer sur lui.
00:07:02 :Il va falloir créer un nouveau, en fait.Donc, un générateur, vous allez pouvoir le créer avec une fonctionou avec une expression génératrice.Donc, vous êtes habitués à la compréhension de listes.
00:07:15 :Là, vous faites avec une parenthèse.Mais avec des crochets, mais avec une parenthèse,là, en fait, ça crée une expression génératrice.Et donc, on est dans le cas d'un générateur.
00:07:30 :Donc, ce que je disais, du coup, c'est que les générateurs,vous allez pouvoir les utiliser avec next ou vous utilisez une boucle fort.Donc là, par exemple, mon carré, il est où ?
00:07:44 :Mon carré générateur qui est là, ma fonction.Donc, c'est mon générateur.Ici, j'utilise.Donc, il est là, carré générateur 5.Donc, ce qu'il va faire, c'est que dans mon range ici,je vais retourner à chaque fois l'élément au carré.
00:08:04 :Alors, j'en étais où ?Je suis là.Donc, je peux faire un next à chaque fois.Donc là, je vais ficher 0, 1.Ensuite, quand j'arrive sur 2 au carré, j'ai 4.
00:08:22 :Donc, à chaque fois, je fais un next.Donc, l'utilité de faire un next dessus, ça permet un contrôle plus précis.Et en fait, je sais que par exemple,donc là, je vous laisse faire si vous voulez,mais de toute façon, ça sera sur réseau public.
00:08:37 :Mais je sais qu'il y a certaines APIoù, par exemple, il faut utiliser des générateursplutôt que des fonctions traditionnelles.Donc, ça se voit dans les API aussi, pas mal, j'ai vu.
00:08:49 :Et après, vous pourrez bien utiliser une boucle forme.Donc, pourquoi avoir du coup un générateur ?Ou pourquoi des fois ne pas utiliser tout simplement une ITER comme ça ?
00:09:09 :Donc, ITER, en fait, vous chargez tout en mémoire.Que là, non.Vous appelez vraiment les éléments un par unet vous n'avez pas tous les éléments en mémoire.
00:09:18 :Et donc, c'est quand même plus pratique.Enfin, la syntaxe, c'est quand même assez concis, c'est assez clair.Parce qu'en fait, ce que vous pouvez faire,vous pouvez vous créer un itérateur personnalisé,donc qui n'est pas un générateur.
00:09:37 :Parce qu'un générateur, du coup, est un itérateur.Mais quand vous faites un itérateur personnalisé,le code, c'est un peu plus la galère.Que quand vous faites un générateur,vous n'avez pas besoin de tout redéclarer.
00:09:54 :Votre générateur, vous le faites avec votre autre mot, yield, ici.Voilà.Vous voyez qu'il y a quand même beaucoup moins de syntaxeque de partir sur un itérateur personnalisé,qui demande plus de lignes,qui est un peu plus compliqué.
00:10:11 :Donc après, on peut l'utiliser de la même façon.Du coup, un itérateur standard,donc yield n'est pas un générateur,un itérateur standard...Pas celui-là, non.
00:10:24 :Avec la fonction iter, excusez-moi.Celui-là, on reviendra après ça.Quand vous utilisez la fonction iter sur une liste, par exemple,tout est déjà chargé en mémoire.
00:10:33 :Donc ce n'est pas super optimum.Ensuite, on a vu le générateur,qui est aussi un itérateur,mais c'est un générateur.Donc, il va générer les éléments à la demande.
00:10:44 :C'est économique en mémoire.Et donc, avec next, fort, ça fonctionne.Et ensuite, ici, on a vu en dernier la classepour créer un itérateur personnalisé.
00:10:53 :Donc, il faut redéfinir les méthodes iter et next.Next, c'est la méthode qui va être utiliséequand on va utiliser la fonction next.Excusez-moi.Donc, votre itérateur personnalisé, en fait,c'est aussi efficace qu'un générateur en mémoire,sauf que quand vous regardez ici,c'est quand même plus complexe d'écrire un itérateur personnalisé
00:11:15 :que d'utiliser un générateurqui est quand même beaucoup plus simple, je trouve, à écrire.Voilà.Est-ce que j'en ai un exemple sur générateur ?Là, j'en avais un, par exemple.
00:11:28 :J'ai ma fonction génératrice.Donc là, j'ai mon générateur,mon simple générateur, ma fonction.Et ici, j'ai mon expression génératrice.Si je fais un printdtype ici,on est bien sur une classe générateur.
00:11:47 :Donc, deux façons de faire,l'expression génératrice ou ma fonction avec le mot-clé yieldà la place d'un return.Qu'est-ce que je voulais dire ?Et on peut faire un test.
00:12:00 :Là, je retourne bien 1, 2, 3.Mais comme je l'ai dit tout à l'heure,si vous l'appelez une fois de plus,j'ai un stop itération.
00:12:17 :Il est déjà consommé.Donc, ça voudrait dire que pour ça,je serais obligé de créer un nouveau.Simple générateur.Et voilà, je repars à 1.
00:12:35 :Une fois qu'il est consommé, c'est terminé.Il faut recréer un nouveau pour pouvoir le réutiliser.Est-ce que celui-là et les autres, ça va ou pas ?
00:12:46 :Oui, ça va.Donc, à la place de, si je comprends bien,à la place de return, on met yield, c'est ça ?C'est ça.En fait, ton mot-clé yield va te créer ton générateur.
00:13:00 :En plus, c'est vraiment que dans mon mémoire.Où est ta fonction, ton expression génératrice ?Je pense, parce que je l'ai utilisé sur C-Sharp,c'est pratiquement la même logique, je crois.
00:13:11 :Sur C-Sharp, je l'ai utilisé là-bas,parce que là, je ne l'utilise plus.Mais en Python, je n'ai pas l'option.Ok.Et ça va là ou pas ?
00:13:27 :Oui, ça va, ça va.Franchement, après, il faut le relire à tête reposée,mais j'ai tout écrit ici.Et je me mets un petit résumé en conclusion icisur les itérateurs standards, générateurset les classes itérateurs personnalisées.
00:13:43 :D'accord, d'accord.Donc, voilà.Je sais que la première fois, ce n'est pas forcément...Je sais que moi, le premier Mentora,c'était Pierre-André qui en avait parlé.
00:13:53 :Franchement, il n'y a pas tout confié dès le début.Oui, ça, ça.Il m'a fallu deux Mentora, trois, pour me dire,bon, ok, c'est bon, j'arrive à comprendre.
00:14:02 :Mais relire à tête reposée, puis après,on peut reparler, il n'y a pas de problème.Ça marche, ça marche.Mais j'espère que ça va mieux qu'avant le Mentora.
00:14:09 :Oui, ça va, ça va.C'était, au fait, parce que je ne savais même pasqu'il fallait mettre Yield dans le générateur.Donc, je ne savais pas ça.
00:14:17 :Que tu pourrais te créer une classe personnalisée,en fait, en...Effectivement, oui.Un itérable, donc comme une liste,il y a la fonction spéciale, la méthode spéciale Iter,donc pour transformer en itérable.
00:14:31 :Ensuite, ton itérable, il va avoir en plus la méthode Next,que tu vas pouvoir, du coup, utiliseren utilisant la fonction Next.Il y a plein de petites choses comme ça à savoir.
00:14:44 :Qu'est-ce que j'allais dire après, voilà.Donc, il faut savoir qu'un générateur, du coup,c'est un itérateur aussi,mais un itérateur n'est pas forcément un générateur.
00:14:55 :Voilà.D'accord, d'accord.Voilà.Et je voulais vous parler d'autre chose aussi.Est-ce que vous connaissez le Walrus ?Walrus...Je pense que Thibault l'a une fois expliqué,je me suis oublié même.
00:15:12 :Ouais.Alors...Walrus...Attends, je ne vois pas le chat.Non.Est-ce que je connais le Walrus, toi ?Parce que ça, je l'ai au Tosa, moi.
00:15:25 :Ok.Ça, je l'ai au Tosa, et je ne me souviens plus du Walrus.Quand est-ce qu'il est arrivé ?Attends, je regarde juste ça.Ouh là !
00:15:33 :J'ai un gros bug de Google Chrome.C'est figé.Walrus...Il est arrivé en quelle version, je crois ?Avec Python 3.8.Ok.Donc, en fait, c'est arrivé avec Python 3.8.
00:15:47 :Voilà.Alors, par exemple.Ici, je vais avoir ma variable nombre.Hop.Et je vais dire...Mince.Bon, tiens.Et je dis...Si le nombre...Il est supérieur à 10,là, je fais un print,et je vais mettre...
00:16:15 :Nombre supérieur à 10.Je suis un malade.Là, il n'y a pas de problème.Donc, le nombre est supérieur à 10.Et là, vous allez me dire...
00:16:28 :Ok, c'est génial.On s'en fout.Sauf que, pour comprendre le principe du Walrus,je vais vous montrer une techniquequi va vous permettre de faire des économies de lignes.
00:16:43 :Après, chacun...Alors, je sais qu'il y en a qui ne trouvent pas ça lisible.Donc, oui.Moi, perso, je ne suis pas un grand fan de l'utiliser à tout va,mais des fois, ça peut être sympa d'utiliser.
00:16:51 :Alors, je vais vous montrer.Ici, nombre.Donc là, on va utiliser la variable que je dirai tout à l'heure.Je vais commenter ça.Et je vais faire la même chose,mais littéralement.
00:17:02 :S'il est nombre...Donc là, j'ai mon petit morse.Input.On fait un nombre.J'ai mis le compte de parenthèse.Tac.C'est ça.Super.R10.Et là, ici, je vais faire pareil.
00:17:23 :Et vous allez voir.En fait, là, je fais exactement la même chose.En gros, l'opérateur morse, le Walrus,qui est arrivé avec Python 3.8,je crois qu'Octosay m'avait posé la questionde quand c'est arrivé, il me semble.
00:17:42 :Je ne sais plus.Ou à quoi sert le Walrus.Ici, en fait, vous avez votre conditionet vous vous assignez, en fait, à votre variable en même temps.
00:17:49 :Est-ce que vous le voyez bien ou c'est un peu trop bizarre ?OK.Honnêtement, j'utilise...Quasiment jamais.J'ai utilisé une fois, peut-être, dans un projet Djangopour une fonction où je n'ai plus quoi.
00:18:08 :Honnêtement, je n'utilise pas beaucoup.Donc là, c'est ma petite sandbox.Et j'ai préparé pas mal d'exemples.De toute façon, pour que vous voyez un peu,c'est celui que j'ai fait, d'ailleurs.
00:18:18 :J'ai fait celui-là.Là, dans votre boucle wild, par exemple,ici, j'utilise un wild response différent de Q.Donc ici, j'ai ma variable response.Et là, j'utilise un wild response différent de Q.
00:18:30 :Donc ici, j'ai ma variable response.Et là, en fait, c'est toujours pareil.J'utilise dans la même ligne.OK.Alors, dans une des compréhensions,là, par contre, ça commence, je trouve,des fois, à devenir limite très peu lisible.
00:18:54 :Moi, perso, là, je trouve que...Je ne sais pas.Je n'aurais pas tendance à en abuser tout le temps.Mais après, c'est peut-être aussi une préférence.
00:19:03 :Mais là, par exemple, je ne serais pas super fan, en fait.Par exemple, j'ai un petit exemple.Vous pouvez très bien faire ça aussi.En fait, là, j'ai...
00:19:16 :Dans cet exemple-là, par exemple,je vais avoir ma...Comment dire ?Je vais additionner mes nombres.Mais sauf qu'à chaque fois, en fait,je vais assigner la valeur 1 à ma variable Cet assigner le 2 à ma variable D.
00:19:35 :En gros, là, j'ai fait différemment,plus traditionnellement, on va dire, avec A et B.Mais sauf que là, j'ai tout assigné d'un coup.Et si je rappelle ensuite C et D,eh bien, on voit bien que la valeur est bien assignée.
00:19:47 :Surtout...Bon, là, après, je rentre un peu dans le détail,mais si vous faites ça,ça ne fonctionnera pas.Vous ne pouvez pas faire comme ça,parce qu'en plus,l'addition a une priorité supérieure au valrus,donc ça ne fonctionnera pas.
00:20:05 :Donc quand vous avez vos valrus,ici, donc toujours,voilà.Du coup, vous avez découvert quelque chose, ou pas ?Non.Nickel.Ça vous paraît un peu farfelu,mais ça vous paraît un peu chaud à utiliser,ou pas très lisible,ou à première vue, vous en pensez quoi, vous ?
00:20:38 :Assez court, mais ce n'est pas forcément lisible,mais bon, il s'en habite aussi de lire les trucs comme ça, quoi.Oui, c'est ce que je me dis aussi.
00:20:49 :Moi, perso, j'utilise rarement.Mais vraiment rarement.Je trouve ça...Enfin...Ça dépend.Par exemple, là, oui, à la limite, oui,mais quand vous allez commencer à trouverque vous n'avez pas de valrus,par exemple, là, oui, à la limite, oui,mais quand vous allez commencer à tomber dans des...
00:21:09 :dans des listes de compréhension, des calculs et tout,ouais, ça commence à devenir un peu plus chaud, je trouve.Mais je pense que c'est une question d'habitude.
00:21:18 :Moi, perso, je ne suis pas très habitué.Mais bon, voilà, il faut savoir que ça existeet que c'est arrivé depuis ton 3.8.Donc, c'est Sylothosa.
00:21:25 :Moi, perso, j'ai une question dessus,donc comme ça, au moins, tu l'auras vu.Et si tu l'as, comme ça, tu pourras répondre.Donc, voilà.Écoutez, j'ai autre chose aussi que j'avais préparée.
00:21:40 :Je l'ai mis où ?Je l'ai mis où ?Est-ce que vous êtes habitué au décorateur ou pas ?Allez, créez-vous-même, je veux dire.Utiliser, ça va, mais créer votre décorateur vous-même.
00:21:58 :OK.OK.Moi, par exemple, avec Django,ça m'arrive sur un projet sur deuxde devoir créer mon propre décorateur, par exemple.Franchement, vous allez voir,il n'y a rien de fouet que de créer son propre décorateur.
00:22:14 :Je vous présente ma sandbox.Imaginez, ici, donc,en fait, le décorateur,ça va permettre d'étendre le comportement d'une fonction,d'une classe, sans changer de côté.
00:22:26 :D'une fonction, d'une classe,sans changer le code source de la fonction en question.Mais vous allez étendre son comportement.Donc, vous allez ajouter des fonctionnalitésaux codes existants de votre fonction, par exemple.
00:22:36 :En fait, dit comme ça,le décorateur, c'est une fonctionqui prend une autre fonction comme argumentet renvoie une nouvelle fonctionqui modifie le comportement de la fonction originale.
00:22:48 :Je vais vous le montrer en démo,parce que dit comme ça, c'est limite incompréhensible.Pour la première fois qu'on me l'a expliqué,je ne l'ai pas compris.
00:22:56 :Donc, là, vous allez voir.Donc, là, j'ai mon décorateur.Là, je crée un décorateur à la maison.Je le fais moi-même.Il prend une fonction, ici.
00:23:03 :Voilà.Donc, là,j'ai mon décorateur.Donc, là, je sers un printavant l'exécution.Ensuite, je vais utiliser ma fonctionque je vais décorer.Et ensuite, ici,mon décorateur, il va écrireaprès l'exécution.
00:23:28 :Donc, là, on est d'accordqu'il ne sert à rien de fou.Mais le décorateur, il va me servirde printer avant l'exécution,après l'exécution,l'exécution,en plus de ma fonction.
00:23:38 :Et il ne faut pas oublierde retournervotre drapeur.Non, surtout pas dans...Pas dans l'instancier,mais retourner le drapeur lui-même.Et donc, maintenant,imaginez que j'ai une fonctionqui...
00:23:53 :Ma fonction,elle va dire quoi ?On va printer, c'est ma fonction.Donc, là, je suis biendans la fonction.Maintenant, ce que je fais,je vais faire un printde ma fonction.
00:24:10 :OK, pas de problème,elle ne retourne nonparce qu'on ne retourne rien avec.Maintenant, ce que je vais faire,je vais appeler mon décorateur.J'ai fait une...
00:24:24 :J'ai fait quoi ?Excusez-moi,j'ai fait une erreur.J'ai mon drapeur.Qu'est-ce que j'ai fait ?J'ai printé ma fonction.Qu'est-ce que j'ai fait ?
00:24:38 :Ma fonction...Mon décorateur,il est où ?Je ne sais pas où il est.OK.Mon drapeur,je print.Ici, j'ai ma fonction.OK.Mon drapeur,je print.
00:24:51 :Ici, j'ai ma fonction.Je print et je retourne mon drapeur.Ah, c'est normal.C'est ça.J'avais mal à noter.Je ne comprenais pas.OK.Donc, là, vous avez vu,quand je print,maintenant,je viens avant la fonction.
00:25:09 :Donc, ce que mon décorateur,il modifie le comportementavant la fonction,avant l'exécution.Ensuite, j'ai ma fonction qui est ici.Donc, ma fonction va faireun print de ma fonction.
00:25:18 :Là,et mon décorateur,lui, ce qu'il fait aussi,c'est après l'exécution.Donc, en gros,voilà,vous avezvotre décorateur,donc votre fonctionqui va prendre en argumentune fonctionet qui va ensuiteéteindre ses fonctionnalitésici.
00:25:34 :Voilà.Il ne faut pas oublierde retourner son drapeur, surtout.Donc, là, c'est très basique.Est-ce que comme ça, ça va ?Ou pas ?
00:25:44 :Ça me fait plaisirsi vous me dites que ça va.Honnêtement, par contre,quand vous aurez finiaprès la session,vous n'allez pas retenircomment on fait.
00:25:59 :Il faudra souvent revenir dessus.De toute façon, je vais mettre le repoparce que ça ne se fait pasen un claquement de doigts.Excusez-moi,j'ai un problèmeavec mon Google Chrome.
00:26:12 :C'est une horreur.Dès que j'ai deux ongles à ouvrir,il ne fait plus rien.Alors,maintenant, on peut utiliser çaavecdes arguments.Je vais vous montrer.
00:26:25 :De toute façon, on va finir par ça.Avec des arguments.On va le rappeler pareilsur le décorateur.Il prend toujours ma fonctionen argument.
00:26:37 :Et là, ici, mon drapeur,tout à l'heure, il était vide.Là, on va direqu'il peut prendre des arguments.Voilà.Et donc, ici,je vais faire un print.
00:26:49 :Là, je vais fairel'appelde la fonction.Donc là, ma fonction, ici,c'est func.C'est ça.Donc là, je vais retirer son...Je vais retourner son...
00:27:04 :Et ensuite,je peux très bien direavecles argsC'est pour montrercomment on peut utiliserles arguments.Avec les argset les points args.
00:27:19 :Voilà.OK.Et ensuite, ce que je fais,c'est que je fais...Je vais faire, par exemple,un résultat de ma fonction.Hop.Et ici,je vais avoir mes args.
00:27:35 :Voilà.Ici.Tac.Et ensuite,je vais faireprint.Donc, ma fonctionretourne.Et là, je vais mettrele...Je n'ai pas mis le...le s dans ma string.
00:27:57 :Excusez-moi.Voilà.Et donc, voilà.Et là, ici,je retourne mon résultat.Et là,j'ai un résultat.Voilà.Et là,je le retourne bienmon rapport.
00:28:11 :Donc là, c'est quand j'utilise des...J'utilise mes arguments avec.J'utilise les arguments dans ma fonction.Donc, je recommence.Ici, je vais avoir une addition.Donc, on va additionner A et B.
00:28:21 :Et je vais faire un retour de Aplus B.Tout simplement.Et maintenant, je vais faireun printde additionun print de addition.On va aller bêtement.
00:28:36 :On va faire ça.J'ai bien 3.Maintenant, je vais prierpour que mon décorateur fonctionne.Mon décorateur,si je le print,voilà.Donc, j'appellela fonction addition.
00:28:47 :Donc, voilà.Ça, je l'avais montrédans mon tour à dernier.On peut utiliser, là, ici,sur notre fonction,le name, ici,pour retirer le nom de notre fonction.
00:28:55 :Retourner le nom de notre fonction.Donc, j'appelle la fonctionadditionavec les args.Donc, là, en arguments,j'ai bien mis 1 et 2en arguments.
00:29:04 :Avec les arguments1 et 2,ici, je n'ai pas dede kawars.Et ici,ma fonction,elle retourne bien 3.Et donc,j'ai bien monfonction retourne résulte.
00:29:21 :Résulte, c'est le résultatde ma fonction.C'est qu'elle retourne.Elle retourne bien 3.Voilà.On peut mettre un retour ici,mais bon,c'est pour vous montrerqu'ici, si on ne retourne rien,on a...
00:29:34 :Enfin, on ne retourne bien rien, ici.Donc, voilà.Les arguments,je sais que c'est un peu plus chaudque les arguments,mais est-ce que ça va, quand même ?
00:29:45 :Bon, il faudra voir plusieurs foispour faire les vôtres.OK.Avant de finir la session,spéciale,petite dédicacepour ceux qui utilisent Django.Il n'y a pas de bêtise.
00:30:03 :J'ai un projet.Je vais...Alors, où j'utilise ?Ça, c'est une bonne question.Je ne sais plus.Je voudrais bien montrerdécorateur.Là, par exemple,voilà.
00:30:23 :C'est ça.Là, c'est décorateur.Les décorateurs que j'ai créésspécifiques à Django,pour mon projet.Donc, ici,j'ai bien mon compagnie requered.Donc, j'ai ma vuequi va...
00:30:34 :Je vais pendre en...En argument,je vais venir chercher ma vue.J'ai mon wrapper,donc avec la request,parce que dans une vue Django,vous avezle request,mes arguments,mes coworks.
00:30:50 :Ici,si dans ma request,dans ma session,dans mes cookies,je n'ai pas de compagnie,je fais un redirect.Voilà.Là, ici, je fais quoi ?
00:31:01 :Ici, je vais chercher...Voilà.Par exemple,ici, je vais carrément aller chercherdans mes coworks.Voilà.J'utilise où, par exemple ?Hop.Là, ici, par exemple.
00:31:16 :Donc, voilà.Là, je vais carrément me servirdu PKde ma fonctionque je vais utiliserdans mon décorateur.Donc, voilà.Les décorateurs,c'est quand même très pratiqueparce que ça évited'écrire trop de logiquedans votre...
00:31:34 :des répétitions de codedans vos vues Django,par exemple,dans mon cas, là.Et donc,je mets ça,mon décorateur,je l'écris dans un moduleet puis après,j'utilisequand j'en ai besoin.
00:31:46 :Hop.On l'a vu,quand j'en ai besoin.Donc, voilà.Est-ce quec'est...Est-ce que ce soir,c'était intéressant ou quoi ?Ça vous a plu ou...
00:31:57 :Oui, Gab.Ouais.Juste,en fait,les décorateurs,ils s'exécutentavant l'exécutionde la fonctionouils s'exécutenten même tempsque la fonctionlà où on met le décorateur ?
00:32:16 :Ben, regarde là,par exemple,mon décorateur.Qu'est-ce que je fais ?Quand on regarde ici,ton décorateur,là, pour ce cas-là,je suis où ?
00:32:32 :Tac.Ça va être exécuté pour moi.Dans l'ordre d'exécution,pour moi, c'est...Est-ce qu'il y a...Attends.Oui, j'allais direpour moi,c'est en même temps,mais...
00:32:45 :Alors.Je vais essayer.Parce que je voulais savoirquand est-ce qu'on vautiliser un décorateur,en fait ?C'est pour amenerdes donnéesdans la fonctionou bien traiterdes donnéesqui viennent de la fonction ?
00:32:58 :Ça, je...Quand est-ce qu'on utiliseen fait ?Juste,pour ta question,en fait,le décorateur,il est exécutépour moi,avant la fonctionqu'il décore.
00:33:13 :Donc,avant la fonctionqu'il décore.Ouais,pour moi,c'est exécutéavant la fonction.Ouais,c'est ça.C'est avant la fonctionqu'il est exécuté.En fait,oui,c'est d'abordle décorateurqui a exécuté ça.
00:33:31 :Et ensuite,oui,parce qu'en fait,il exécute d'abordle décorateuret en fait,ton décorateur,il va retournerune nouvelle fonctionqui enveloppela fonction originale.
00:33:42 :Voilà.C'est le décorateuret après le décorateur,il va retournerta fonction originalequi est enveloppée dedans.D'accord,d'accord.Donc là,par exemple,mon décorateur,il va exécuterla logique,la def rapportavant queaddition soit exécutée.
00:34:02 :Oui,parce qu'en fait,ton décorateur,excuse-moi,il va appeleroui,quand tu appelles la fonction décorée,c'est ça,tu appelles en faitla fonction renvoyéepar le décorateur.
00:34:22 :C'est vraiment la fonctionqui est renvoyéepar le décorateur,tu vois.Donc,décorateur ici par exemple,rappeur.Oui.C'est ça que tu vas retourner.D'accord.
00:34:32 :Et maintenant,def additionva utiliser le résultatde rappeurpour exécuter addition.Eh bien,ici,c'est ça,c'est qu'en fait,addition,tu vas appeler en faitton rappeur,oui.
00:34:49 :Parce qu'en fait,j'ai dû faireun petit mémo,je crois d'ailleurs.Ouais,bah tiens,cool.J'avais oublié.Ici,comme je disais,il prend en argumentune autre fonctionet il renvoiela nouvelle fonctionqui modifie le comportementde la fonction originale.
00:35:05 :OK.Là,ta fonction originale,ça renvoie du coupla nouvelle fonctionqui modifie le comportementde la fonction originale.C'est vraiment çaqu'il faut se dire.
00:35:18 :D'accord,d'accord.Et du coup,par exemple,toi,tu aimes bien faire du Django,il faut vraiment direque quand tu vas utiliserun décorateur,tu vas renvoyer du coupta fonctionde le rappeur.
00:35:32 :Donc,si tu as faitdes modifications,tu peux peut-être avoirta vue,mais si tu as des modificationsen dedans,en fait,c'est vraiment ton rappeurque tu vas envoyer.
00:35:42 :C'est pour ça que,par exemple,dans ton rappeur,je ne sais pas,tu peux faire des chosesqui font des redirects.Et bien,tu as beau appeler,en fait,ton décorateuravec ta vue,et bien,ta vue,elle va passer de l'EQTsi la conditionqui va être avant,
00:35:58 :par exemple,ça fait un redirectsur cette condition.D'accord.Je comprends.J'ai un articleDécorateurDjango.Je ne sais pas s'il avaitretrouvé que je peuxcelui-là peut-être.
00:36:16 :Ah !J'ai un articlesuper intéressant.Je vous metsCécile, je crois,qui n'est pas très Django,quoi.Mais,du coup,je suis désolé,toi ça va peut-êtremoins t'intéresser.
00:36:31 :Attendez,je vais l'envoyer sur le chat.Il est où ?Là.Je m'y perds.C'est là.Ah, Cécile,t'as écrit ici.Du coup,j'avais un doute.
00:36:44 :Ah !OK.Alors,c'est pas toi qui m'as ditque t'étais pas trop intéressépar Django,alors je ne sais plusqui m'a dit ça.
00:36:58 :Du coup,là,j'ai envoyé le liensur un article,et en fait,c'est intéressantplus que du Python pure.D'accord.C'est un articleassez intéressantsur la créationde décorateursavec Django.
00:37:11 :C'est vraiment spécifiqueà Django,on va dire,mais bon,ça reste du Python,mais là,il montre les exemplesavec Django.Donc,vous tous qui faites du Django,du coup,ça va vous intéresser.
00:37:23 :Vraiment,lisez-le,vous allez voir,vous allez comprendreassez facilement.Donc,voilà.Donc,voilà,j'espère quec'était pas tropgalère à comprendrecomment j'expliquais.Ça allait,c'était pas forcémentdes trucs facilesà jongler entre les générateurset les décorateurs.
00:37:43 :Le walrus,ça va,mais...Ah,super.Bon,c'est que j'ai réussià expliquer,alors.Ah,nickel.Merci,en tout cas.Est-ce que vous avezdes questions,ou pas ?
00:37:59 :Pas pour moi,en tout cas,merci.OK.Sinon,celui-là,non,du coup ?Peut-être,je ne sais pas,je vais te mettresur le code,là,de mon fort.
00:38:22 :En fait,c'est surles compréhensionsde listeavec du boucle fortque je n'ai toujourspas affirmé.Ça,c'est l'entraînement,oui.Pardon ?Oui,il a ditque c'est l'entraînement,c'est vrai.
00:38:39 :Je ne sais pasdans quelle ordreDjango exécute.Attends,je vais te mettre ça.Parce que là,c'est Copilotqui m'a généréle code.Oui.
00:38:51 :Tu vois,Payens ?Euh...Attends.Je vais partagermon écran,si tu veux.Oui,vas-y.Je vais partagermon écran.Ah ouais,il te fait de la boucle...
00:39:08 :Attends,ton écran,j'ai où ?Il est là.Euh...Oui,du coup,je vais te mettresur l'écran du haut.Attends,je vais arrêterde partager le mien.
00:39:20 :OK.Hop.Voilà.Allô ?Ouais.OK.Euh...Si vous voyez mon écran ?Alors ?Ou bien,ce n'est pas visible ?Ouais,ça va à peu près.
00:39:59 :Tu m'as appelé ?Oui.Tu vois,par exemple,c'est...Bon,là,par exemple,je récupèretous les messagesdu Trudez.Euh...Mon premier messagecontient,par exemple,si tu viens sur ça,euh...
00:40:21 :Trudez.Bon,le modèle,en fait,c'est plus mieux.Le modèle...Tu vois,Trudez ?Ouais,OK.Le Trudez a le nomcreated by...Ouais.Le forum.
00:40:46 :Ouais.Le forum,created at,obtained at.Maintenant,le message,si tu vois,euh...OK,tu as un message,OK,d'accord.Voilà,le message appartientà quel Trudez,par exemple ?
00:41:02 :OK, d'accord.Le modèle,c'est de récupérertous les messages,euh...du Trudez,en affichant,par exemple,quand tu viens ici,par exemple,là,je ne sais pas sima page est affichée,ici,euh...
00:41:17 :Tu vois,par exemple,ça ?Ouais.En fait,s'il y avait,je ne sais pas,s'il y avait,euh...un deuxième message,comment vois-tu ?
00:41:28 :Tu vois,en fait,je récupèretous les messages,euh...de ce Trudez.OK.Bon,là,j'ai deux replies,comme tu m'avais suggéré,ça,ça marche,comme ça.
00:41:42 :Donc,dans le Trudez,si tu viens ici,euh...euh...euh...euh...euh...un message,un message,un message,un message,un message,un message,un message,un message,un...
00:42:04 :C'est un peu lent,moi, moi, je ne sais pas,c'est quoi ?Hum...Tu vois ?Là,il n'a pas de parent ID,mais si tu prends les deux, là,et ils sont...
00:42:33 :Voilà, ils ont le même thread, en fait.Donc je récupère tous les messages du thread, en fait.Ah, attends...Message for thread...Mais, en fait, comment il lit, en fait, ça ?
00:42:44 :Comment il lit, ça ?C'est quel book sport qu'il a exécuté en premier ?Attends, j'essaie juste de comprendre ce qu'il a écrit...Donc là, dans tous les messages...
00:42:53 :Regarde ici, là, c'est les messagesqui ont le même thread.Là, c'est le thread.Je récupère d'abord le forum, ici,parce que je l'envoie un slog,je récupère, il est de quel forum,et à partir de là-bas, je récupère le thread.
00:43:12 :Ah !OK, OK.Déjà, tu as tes conditions IF,ce qui fait que,si tu n'as pas de message parent,si tu n'as pas de message parent,donc c'est vraiment les messagesqui ne sont pas dans les messages, entre guillemets.
00:43:26 :Effectivement, oui.OK, tu as tes conditions qui conditionnent ça.Donc, en fait...Oui, effectivement.Tu ne récupères que les messages...qui sont dans le même thread.
00:43:35 :OK. Est-ce que je mettrais none ?Oui, tu peux.Ou IF NOT, message parent, peut-être ?Bon, on va voir.Bref, on ne va pas chipoter là-dessus,pour l'instant.
00:43:44 :Et, du coup,donc là, FOR MESSAGE,MESSAGE PARENT...Là, c'est la boucle, d'abord,qui est exécutée en premier,ou bien c'est lui, là.Ça, je ne comprends pas, en fait.
00:43:59 :Attends, juste...Tu vois, THREAD là,c'est lui qui est là,que je récupère ici.Ah oui, THREAD, OK.Donc, voilà, tu as tes threads,tu as cherché ce qui correspond à tes threads.
00:44:15 :Maintenant,pour THREAD IN THREAD,il récupère le message de ce thread.Maintenant,après, il revient iciFOR MESSAGE INMESSAGE OBJECT FILTER.Mais pour le threadqui a le IDqui vient du thread, là, en fait.
00:44:40 :De ça.Je ne comprends pas comment il agit en ça, en fait.Alors, attends, par exemple,juste, si tu...Attends, on va laisser la condition, déjà.
00:44:52 :Pour que j'enlève la condition, attends.Non, non, vas-y, c'est celle qui est en dessous.C'est celle qui est en dessous, par exemple.OK, ouais, ici, REPLY.
00:44:58 :Alors, là, il va exécuter FOR MESSAGEIN MESSAGE.Oui.Ça, c'est pour récupérer tous les messages.Par exemple, si tu viens ici,c'est tous les messages qui sont répondus par toi.
00:45:12 :Ça, c'est MESSAGE.Le REPLY, c'est pour récupérer tous les replies de ce message-là.OK.En fait, c'est tous les messages de chaque message.Alors, vas-y, remets le code.
00:45:23 :Tu vois, REPLY, il faut...Donc, FOR MESSAGE, il utilise...Donc, il va d'abord exécuter le FOR MESSAGE IN MESSAGES.OK.Et là, il retourne le REPLY, là, c'est ça?
00:45:40 :Hein?S'il met FOR MESSAGE IN MESSAGES,pour chaque message qui vient,le message, là, c'est tous les messages ici, en fait.Tous les messages qui n'ont pas de parent ID.
00:45:54 :Ouais, et là, dans le deuxième,tu ne récupères que les messages,que les réponses de messages, c'est ça?Oui, là, j'ai récupéré tous les sous-messages, en fait,de chaque message.
00:46:01 :Ouais, c'est ça.Bon, en gros, en fait, là, il t'exécute,donc FOR MESSAGE IN MESSAGES.Et ensuite, il va t'exécuter le FOR REPLY.C'est le REPLY IN MESSAGES.
00:46:15 :Non, en fait, pour MESSAGE IN MESSAGES,il retourne un REPLY, c'est ça?Ben, il exécute d'abord le FOR MESSAGE IN MESSAGES,donc pour les messages dans les messages.
00:46:28 :Il fait un RETURN en ce moment,ou bien il ne fait pas de RETURN?Il n'y a pas de RETURN là-bas?S'il met FOR MESSAGE IN MESSAGES,il n'y a pas de RETURN?
00:46:36 :Il ne retourne rien?Avant d'exécuter le deuxième FOR?Il fait d'abord FOR MESSAGE IN MESSAGES,et après, il va faire le deuxième FOR.Après, il tourne REPLY?
00:46:47 :Ouais, en fait, il utilise le deuxième FOR,voilà, donc il n'a que REPLY,et ensuite, il va utiliser le deuxième FOR.C'est d'abord le FOR MESSAGE IN MESSAGES,et ensuite, il va avoir ton FOR REPLY,FOR REPLY IN MESSAGES,après, il retourne son résultat.
00:47:00 :C'est d'abord comme ça.OK, OK.FOR MESSAGE.Retiens-toi, ici, pour cet exemple-là.C'est celui-là en premier,et ensuite, c'est le REPLY.OK.Donc, il exécute le FOR MESSAGE IN MESSAGES,après, il vient pour chaque message,il prend son SOUS-MESSAGE,et il retourne ce SOUS-MESSAGE ici.
00:47:26 :Ouais, c'est ça, c'est ça, oui.Voilà, j'ai pas bien résumé.D'accord.En fait, c'était l'ordre de ces deux FOR làqui m'a paniqué.Les deux FOR, c'est un peu chiant,c'est pas des compétitions.
00:47:37 :Je suis n'habitué d'apprendre.Mais ouais, t'as d'abord le FOR MESSAGE IN MESSAGES,et après, t'as le REPLY.J'ai pas mon accent anglais, là.Voilà.Merci.
00:47:48 :Je t'ai oublié sur l'EXTEND.Pardon ?J'ai oublié de te montrer pour l'EXTEND et APPEND.OK, la liste, oui, oui, oui.Est-ce que vous avez le tempspour me voir rapidement ou pas ?
00:48:01 :Oui.Rapidement, c'est bon ?Bon, je me dépêche.En gros, je me dépêche, je me dépêche,parce que j'ai dit que je me verrais,et ça, c'est pareil pour les...
00:48:09 :Faut le savoir aussi,pour ceux qui font le dosage.On va finir avec ça.C'est tout bête.Hop.Je fais un passage rapide dans mon écran.
00:48:20 :Tac.Voilà.Il explique ici, APPEND,il va ajouter la liste comme un seul élément.Donc, je lance mon exemple.Avec APPEND.Il va ajouter la liste comme un seul élément.
00:48:41 :Ici, je fais un...Donc, j'ai ma liste.À ma liste, je fais un APPEND de la liste 4-5.Et là, on voit bien qu'en résultat,il ajoute ma liste comme un seul élément.
00:48:49 :OK ?Est-ce que là, on est d'accord ?Ouais.OK.Par contre, si je fais un EXTEND,je fais exactement...J'envoie la même chose, mais avec EXTEND.
00:48:59 :J'ai juste la différence.Et là, regarde.Il ajoute chaque élément de la liste individuellement.Donc, il l'ajoute individuellement.Mais ça veut dire que comme s'il y a un sous-niveau...
00:49:24 :Donc là, en fait, il va ajouter 4-5.Mais à l'intérieur de ma liste, ici,j'ai une sous-liste 1-2.Donc ici, j'aurais bien quand même une sous-liste.
00:49:32 :Bon, je ne vais pas m'obliger à complexifier pour le fun,mais en gros, il faut bien retenirqu'ici, il va ajouter la liste comme un seul élément.
00:49:42 :Et ici, en fait, il va prendre chaque élémentet il va les ajouter dans la liste.C'est tout.Ah, d'accord.Donc EXTEND ajoutechaque élément à la liste.
00:49:59 :En fait, il va ajouter deux éléments, ici.Il va ajouter 4 et 5.Et là, avec APPEND, il va ajouter...Un seul élément. Un seul élément avec 4-5.
Aucune occurrence trouvée pour « ».
Sources
00:02:05
Concepts des itérateurs et générateurs
00:02:51
Exemple pratique des itérateurs
00:05:16
Introduction aux générateurs
00:07:41
Création de générateurs avec yield
00:15:00
Explication sur le Walrus operator
00:21:43
Introduction et création de décorateurs
00:27:10
Utilisation des décorateurs avec des arguments
00:30:08
Exemple de décorateurs avec Django
00:32:07
Question de Sylla sur l'ordre d'exécution dans les décorateurs
00:37:33
Question sur les compréhensions de liste
00:48:17
Différence entre append et extend
Bravo, tu es prêt à passer à la suite