Session du 10 juillet 2024 à 20h00
Pratique & Live Coding
Bases du Langage
Programmation Orientée Objet (POO)
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Palindromes, emojis et POO en Python
Découvre comment résoudre des exercices Python concrets : vérificateur de palindrome, compteur d’émojis et introduction à la programmation orientée objet.
00:00:00 :En fait j'ai un ami qui fait du trading et il m'a dit que c'était possible de faire desscripts pour pouvoir en gros analyser les marchés et que en gros ça nous place sur certainsmarchés et de le faire automatiquement, d'automatiser la chose en fait, c'est vrai.
00:00:23 :Ça doit pouvoir se faire via les API si les sites de trading en question le proposenttu imagines que oui. Donc il y a une API qui te permet de faire des appels pour pouvoir par
00:00:34 :exemple déposer de l'argent sur telle ou telle action, ce genre de choses. Si ton broker tepropose ça, ça doit pouvoir être possible de le faire. À partir du moment où il y a une API,
00:00:44 :tu peux automatiser le truc. Et on peut chercher ça où à peu près ? Sur GitHub ? Ouais je pensetu peux trouver des projets sur GitHub. D'accord merci. Tu peux peut-être trouver aussi des
00:00:57 :vidéos sur YouTube potentiellement s'il y en a. Je pense que c'est des ressources qui doivent setrouver. Bon ça valide. Je vais vous envoyer la feuille de présence aussi. D'ailleurs normalement
00:01:15 :j'ai résolu mon problème de micro, du coup ça devrait être mieux. Je vais juste revérifierque ça a bien corrigé comme je voulais.Ok là vous m'entendez bien ? Oui le son il est bien. Ok nickel. J'ai résolu normalement le
00:02:08 :souci. Est-ce qu'il y a des questions, des sujets que vous voulez aborder en particulier ou deschoses, des difficultés que vous avez rencontré ou quoi depuis lundi ? Sinon j'ai préparé quelques
00:02:22 :exercices. Sincèrement j'ai rien fait depuis lundi. Après c'est bien de prendre un petit peu de tempspour ça aussi. J'étais avec la famille du coup j'ai rien fait. C'est juste un truc mais c'était
00:02:40 :pas... Ok ok pas de soucis. C'est bien de prendre un peu de temps sur soi et pas se dégoûter.Pas de questions derrière, on va peut-être pouvoir faire quelques exercices. Je vais vous
00:03:05 :faire un petit partage. J'en ai préparé trois, on en fera plus s'il faut. Est-ce qu'il y en a quil'ont fait celui-là ? Le vérificateur de palindrome. Ouais. T'as réussi à le finir jusqu'au bout ou t'as rencontré des difficultés ?
00:03:27 :Moi je me suis aidé de tchatché péter. Moi si je l'ai fait, mais bon à la fin j'ai utilisé lasolution de Tibo. Ok. Et Wilfried et Walid ? Ouais ouais je l'ai fait. Moi je ne l'ai pas encore abordé.
00:03:46 :Est-ce que vous voulez quand même qu'on le revoit ou on passe à un autre ? Moi ça m'intéresseraitvu que j'ai pas du tout... Pour ma part moi en tout cas après les autres je sais pas. Ok.
00:04:03 :Bah écoutez, celui-là il n'est pas très long, on peut prendre un petit peu le temps. Je vais essayer de fairecomme la dernière fois et d'expliquer un petit peu pas à pas comment j'appréhende l'exercice.
00:04:13 :Du coup déjà, si on lit l'énoncé, dans cet exercice on va vérifier si une phrase est une palindrome ou non.Un palindrome, qu'est ce que c'est ? C'est un mot ou une phrase qui peut se lire dans les deux sens.
00:04:24 :Donc par exemple un roc cornu ou... Est-ce qu'il y a des exercices... Enfin il y a des non-connus en tête en un mot.J'en ai pas sous la main mais... Enfin un roc cornu par exemple si on le lit dans le temps ça fait un
00:04:38 :roc cornu, vous voyez ? Ça se lit dans les deux sens. Donc du coup votre script il doit vérifier en fait si laphrase est un palindrome et du coup à ce moment-là retourner true et sinon retourner false dans unevariable qui s'appelle résultat. Déjà première chose, on sait qu'on a une variable résultat.
00:04:55 :Ensuite, pour moi du coup quand je lis l'exercice comme ça, un palindrome puisque c'est quelque chosequi doit se lire dans les deux sens, la façon la plus simple donc de vérifier c'est de prendre çaet de le retourner. Pour ça il y a deux manières. Soit on utilise la fonction reversed, soit on
00:05:19 :utilise le slicing. Donc la syntaxe de slice. Là je vais utiliser slice parce que je trouve ça plusintéressant et c'est des choses qu'on voit un peu moins souvent et donc ça permet un petit peu dele réviser. C'est l'application de Python par rapport à d'autres langages. Donc voilà, on va utiliser slice
00:05:40 :mais on peut aussi utiliser la fonction reversed. Donc déjà quand je lis le problème je me disil y a deux manières de retourner une phrase dans le sens inverse. Soit on le fait avec la méthode
00:05:50 :reversed, soit on le fait avec du slicing. Avec le slicing j'expliquerai après quelle syntaxe onutilisera. Deuxième chose, ici on voit qu'on a des espaces. Pour ne pas s'embêter, on veut juste
00:06:03 :vérifier que les phrases, que ce soit l'une est égale à l'inverse de l'autre, on va enlever tousles espaces. On va supprimer tous les espaces. Deuxième chose, on va aussi supprimer toutes
00:06:14 :les majuscules pour ne pas avoir des problèmes de casse etc. Donc ça on peut le faire en uneseule phrase. Par exemple je vais l'appeler, ça va être un mot qui va être en lowercase,
00:06:27 :donc je vais l'appeler mot lower. Et donc pour ça on va donc utiliser tout simplement la méthodelower qu'on va appliquer sur notre mot qui est juste là. Donc ça c'est la première étape. Donc là
00:06:38 :déjà ça va enlever toutes les majuscules qu'il y a dedans. J'ai fait un ctrl z, c'est pas ce que jevoulais, je vais le récupérer. Je vais le retrouver là normalement. C'est pas grave, je vais le réécrire.
00:06:53 :Donc on applique déjà la méthode lower sur notre mot qui est ici, ça va nous permettred'enlever toutes les majuscules. Première étape. Deuxième étape, on va utiliser la méthode replace
00:07:08 :qui va nous permettre de remplacer donc ce qu'on souhaite par ce qu'on souhaite. En l'occurrenceon va remplacer les espaces par aucun espace. Est-ce que jusqu'à là ça va?
00:07:18 :Oui pour moi ça va très bien. Donc je parle pas. Oui mais ça a l'air d'aller. C'est juste pour Naïr,je pense, c'est lui qui demande plus d'explications puisqu'il n'est pas familier à ce genre d'exercice.
00:07:41 :C'est pour ça que je demande si c'est bien clair. Je vais réécrire du coup le qu'ons'appelle donc notre résultat. Comme on disait tout à l'heure on avait une, donc pour l'instant je vais juste l'écrire sur le côté.
00:07:53 :Et comme je l'ai dit, deuxième chose qu'on veut vérifier c'est du coup si ça, une fois qu'on aenlevé les espaces, je vais l'afficher comme ça au moins on pourra voir pas à pas.
00:08:04 :Je vais enlever ça pour pas qu'il y ait d'erreur. Donc déjà voilà on obtient ça. Maintenant ce qu'on veutfaire c'est, on va le faire vraiment étape par étape. Je vais juste accepter Axel. Bonsoir Axel.
00:08:18 :Je vais épingler la feuille de présence. Donc on va se prendre notre mot à l'envers et notre motà l'envers. Donc là on va utiliser le slicing pour se mettre à l'envers. Pour ça, comme on fait,
00:08:33 :on prend du coup notre mot lower, donc en lowercase, et donc le slicing c'est avec lescrochets. Et pour mettre un mot à l'envers en slicing, c'est deux points, deux points, moins un,
00:08:45 :deux points de tête. Et donc là, si on print maintenant le mot à l'envers, si je me suis pastrompé. Ok, je me suis trompé. Je me suis trompé en effet. C'est plus deux points, deux points, moins un, c'est
00:09:38 :que mon mot lower est égal à le mot lower inversé. Non, c'est parce qu'en fait, je crois,vous avez mis, juste après la variable, t'as mis le 2 plus 3. Non mais oui, c'est parce que
00:09:51 :c'était parce qu'en fait, la syntaxe c'est avec le if en fait qu'il faut le faire, je l'ai juste mal fait. Et donc là,on définit donc si c'est bon, notre résultat est égal à true, et sinon notre résultat est égal à false.
00:10:03 :Voilà, donc ça c'est la première manière de le faire. Maintenant aussi, il y a, qu'on s'appelle,là qu'on s'appelle la deuxième manière, avec reversed. Il n'y a personne qui l'a fait là,
00:10:17 :du coup, dans ceux qui l'ont fait avec reversed ? Moi j'ai fait pareil avec replace, mais justeavec une fonction. Non mais je parle pour vérifier que c'est égal entre à l'envers et... Non, non, j'ai utilisé le slicing moi.
00:10:40 :Dans la solution peut-être, oui, il a utilisé le... Il explique les deux, je crois. Ok, ok. Alors le reversed de tête,il va falloir utiliser un join. On va faire un join. Alors, je réfléchis. Déjà c'est résultat égal false,
00:11:10 :parce que je n'écris pas n'importe quoi. Donc ça déjà, ça devrait nous valider. Et maintenant,si on veut le faire d'une autre manière, on va faire du coup un bool reversed. On va l'appeler,
00:11:23 :par exemple, qui va du coup être égal à... Donc on va enlever les espaces. Enfin, on va juste joinavec la fonction reversed. Voilà. Et on peut le faire tout en une phrase même, je pense. On peut
00:11:58 :se faire un petit truc. On va essayer de faire tous les conditions, etc. Plutôt que s'embêteravec un if-else comme ça. On va le faire avec le principe de le faire en une seule ligne. Et du
00:12:09 :coup on va se faire... Donc résultat va être égal à true. Donc ça est égal à ça. Sinon false. Etdonc ça, si je ne dis pas de bêtises, on devrait être bon aussi. Non. Autant pour moi. J'ai fait
00:12:34 :une erreur quelque part. Déjà, il y a le égal égal. Voilà. Et après, il fallait que je définisse monmot reversed avant. Exactement, c'est ça que je voulais te dire. Mon mot reversed. Et du coup,
00:12:49 :mon mot reversed. Quelle valeur il doit prendre de base? En fait, non, c'est juste remplacer ça parça. Et on devrait être bon. Et ça doit revenir au même. Oui, voilà, c'est ça. Ok, ça c'est la
00:13:07 :deuxième solution. Mais personnellement, je trouve ça plus facile avec le spacing. C'est un peu plusclair quand on connaît les syntaxes. Parce que là, en plus, avec reverse, on est obligé d'utiliser join
00:13:22 :en plus. Donc c'est quand même un peu plus clair avec le spacing. Je vais vous zoomer peut-être unpetit peu. On me le demande souvent, mais j'oublie de temps en temps. Voilà, ça c'est la solution
00:13:41 :avec le spacing. Ok, est-ce que c'est bon pour celui-là? J'ai partagé le code avec le reverse,avec une fonction. Oui, tu as carrément fait une fonction. Oui, c'est exactement les deux mêmes.
00:14:00 :Ensuite, celui-là, c'est juste histoire de revoir un petit peu les dictionnaires,faire du comptage. Je ne sais pas si vous l'avez fait celui-là? Est-ce que ça vous dit quelque chose?
00:14:21 :Ça, je ne l'ai pas fait moi. Personne ne l'a fait celui-là? Je ne me rappelle pas. Non,non, je ne me rappelle pas de voir ça. Ou je l'ai zappé ou je ne l'ai pas vu. Je ne me rappelle
00:14:41 :plus. Ou je l'ai fait ou je l'ai oublié. Donc, en fait, ce qu'on vous demande, tout simplement,si on lit l'énoncé, c'est qu'on a une string qui contient des emojis et on veut récupérer dans undictionnaire pour chaque emoji le nombre d'emojis qu'il y a dans notre string. C'est-à-dire que,
00:15:09 :par exemple, pour cette string-là, on doit avoir ce résultat-là, c'est-à-dire qu'il y a quatre foiscet emoji-là, une fois cet emoji-là, une fois celui-là et deux fois celui-là. Est-ce qu'il y
00:15:20 :en a déjà qui ont des pistes de comment on peut faire? Quelle structure de données on va utiliser?Est-ce que les emojis ont des codes? Je pense que l'on doit utiliser une boucle fort. Oui,
00:15:44 :on peut, oui, on va pouvoir utiliser une boucle fort, oui. Mais comment savoir que l'emoji-là estdans le dictionnaire? La structure, en fait, elle va tenir en trois lignes. On va stocker chaque
00:16:00 :emoji dans une structure de données précise et après on va parcourir cette structure de donnéeslà et on va compter chaque élément comme un seul. Et pour ça, il faut utiliser une structure de
00:16:13 :données précise. Est-ce que vous savez? Oui, on peut utiliser un dictionnaire. Alors là,en l'occurrence, on ne va pas utiliser un dictionnaire, non. Mais le dictionnaire déjà
00:16:25 :défini. Oui, ça, ça va être le dictionnaire pour le comptage. Mais ici, on va utiliser autrechose. C'est une structure de données qui, en fait, oblige à avoir des valeurs uniques.
00:16:36 :On va utiliser un set. Donc, pour ça, on va du coup se définir un set. Donc là,on va mettre les emojis simples. Et en fait, comment on va les stocker? On va tout simplement
00:17:01 :faire un set des emojis. Et en fait, il va récupérer comme s'il n'y a pas de doublonsavec les sets. Il va récupérer chaque unique. Et après, c'est tout simple. On fait une boucle
00:17:13 :fort pour chaque emoji. Alors, on peut faire juste le print de singles emojis. Là, on va voir letruc. Parce que je ne comprends pas comment il peut... Comment il... En fait, quand tu crées un
00:17:32 :set à partir d'une variable, il va supprimer tous les doublons. Il ne peut pas avoir de doublonsdans un set. Ça ne va définir que les valeurs uniques. Et donc, en fait, ce que tu as à faire
00:17:42 :derrière, c'est tout simple. C'est juste de parcourir ce set. Chaque emoji dans ton set,tu vas en fait ajouter dans ton dictionnaire. Pour chaque... Comment ça s'appelle? Pour chaque
00:18:05 :emoji, pour chaque unité, tu vas rajouter... En fait, tu vas créer tes valeurs où chaque emoji,ça va être égal à emoji.count. On va utiliser la méthode count de Python. De la liste de base,
00:18:27 :enfin de notre string de base qui contient les emojis, si vous préférez. Et du coup,il va juste parcourir... Comment ça s'appelle? Il va parcourir ce set-là. Celui-là qui est
00:18:40 :affiché ici. On va, par exemple, commencer par celui-là. Et donc, il va créer sa clé valeur,si vous voulez. Par exemple, celle-ci. Si on commence par celle-là. Et donc, pour cette clé-là,
00:18:54 :la valeur, ça va être le nombre d'emojis qui correspondent à ça dans notre variable de base.Voilà. Pour l'emoji-là qu'on a parcouru, par exemple celui-là, il va aller récupérer combien
00:19:12 :il y en a ici. Ok? Et donc, c'est tout simplement. Ma question, c'est pourquoi mettre les parenthèsesde la liste à côté de emojiCount? Là? Non, en bas. Dans la boucle fort. C'est la clé du dictionnaire.
00:19:34 :Là? Ouais, ça. Pourquoi mettre les crochets? C'est pour définir que la clé va être égale à l'emoji.Et que ça donne ça, en fait. Tu vois, ta clé, elle est là. Deux petits points, ça va à l'heure. Et
00:19:46 :pour définir ta clé, tu utilises les crochets. Ah, ça fait, j'ai oublié ce courant-là. Il fautque je repasse dessus. Pour un dictionnaire, en fait, tu définis sa valeur, du coup, en mettant le
00:19:56 :nom de la clé avec des crochets est égale à la valeur. Et même si, en gros, la clé n'existe pasavant, ça va la créer. Donc là, par exemple, la clé, elle n'existait pas. Mais du coup, il va la
00:20:08 :créer en ayant pour valeur l'emoji quand on a parcouru notre set. Donc d'abord celui-là, puis celui-là,puis celui-là. Et donc après, du coup, si j'affiche EmojiCount. Ah oui, ok, j'ai rajouté un S là.
00:20:32 :Est-ce qu'il y a des trucs que vous voulez que je repasse sur celui-là? Peut-être Nahir, t'as peut-être pascompris un truc ou quoi? Moi, je comprends. Mais est-ce que si je copie l'emoji, là où il y a les
00:20:50 :emojis, moi ça peut... les images vont sortir comme ça ou... Je me demande comment il arrive à...Il y a des codes derrière l'emoji. Là, on a mis l'emoji, mais ça pourrait être n'importe quoi.
00:21:05 :Je comprends, je comprends. Mais derrière, c'est le code ASCII, c'est sûr. C'est le code ASCII derrière.Je voulais savoir, ouais, ouais. Parce que je voulais juste essayer si je peux copier ça comme ça est,
00:21:17 :chez moi, par exemple, mon éditeur local. Est-ce que ça va afficher les images?Est-ce que ça va afficher les images? Je ne sais pas si tu comprends ce que je... OK. Par exemple, l'emoji, la variable emoji,
00:21:35 :je résiste parce que je ne sais pas si je copie exactement la variable et le contenu, chez moi,local, par exemple, sur PageTime, est-ce qu'il va afficher comme ça et comme ça? Ça va l'afficher comme ça.
00:21:47 :Dans ton terminal, les emojis? Oui, oui, comme ça, ça va l'afficher exactement comme ça.C'est pas dit, non. Je pense que c'est grâce au playground. Voilà, exactement, ça je voulais savoir.
00:22:02 :Mais après ça, tu peux le faire pour d'autres scénarios. Tu peux le faire pour compter des lettres, pour compter des chiffres, etc.Ouais, effectivement. Là, c'est fait avec des emojis pour que ce soit de toute façon plus explicite, mais tu pourrais compter le nombre d'occurrences d'une lettre
00:22:15 :ou dans une phrase, tu vois, par exemple. Ouais, comme ça. OK. Et du coup, j'ai pris un petit troisième,un petit peu de programmation orientée objets. Est-ce qu'il y en a qui l'avaient fait, celui-là?
00:22:31 :C'est un avancé, c'est un peu compliqué. C'est où le titre, le truc... J'ai réfléchi le code, j'ai pas doué, mais...Vous devez compléter la classe e-mail. Oui, une classe e-mail. Je crois l'avoir fait, oui, je l'ai fait.
00:22:52 :Je pense que je l'ai fait. Moi, personnellement, je pense pas, je me rappelle pas de ce genre d'exercice.Je l'ai fait, je l'ai fait. Où est cet exercice? Il est dans le parcours aussi ou il est...
00:23:05 :Moi, je sais pas, je vais piocher dans l'exercice, je t'avoue. Il est dans l'exercice, exercice, ouais.Ah, t'es pioché là-dedans et puis il devait être là. Pour ça, moi, j'ai pas regardé tout ça, donc c'est pour ça.
00:23:15 :Moi, je viens d'arriver à la formation orientée objets, donc je suis encore au-dessus de là, je suis au...Ouais. Je suis... Comment ça s'appelle? En plus, t'en avais parlé la dernière fois, Walid, les... Comment c'est? J'ai oublié...
00:23:30 :C'est ce qu'on met avec l'arbre aux bases.Les décorateurs.Les décorateurs.Ouais.Ouais. OK. Après, je peux le faire quand même, ça peut être intéressant quand même, je pense.
00:23:43 :Ouais, ouais, mais justement, comme ça, au moins, on s'informe.OK. Donc, déjà, première chose, on va se faire l'énoncer. Donc, dans cet exercice, vous devez compléter la classe email.
00:23:56 :Attends, pire, je vais faire ça. Voilà. On vous donne ça de base.Donc, dans cet exercice, vous devez compléter la classe email et on vous donne plusieurs conseils.
00:24:07 :Il faut créer déjà une méthode sendTo. Donc, premièrement, vous devez créer une méthode sendTo avec le paramètre email.OK. Déjà, première chose, def sendTo avec comme paramètre email.
00:24:22 :Ensuite, il faut créer un attribut numberOfEmailSends.Alors, déjà, un attribut, du coup, pour ceux qui commencent la PO, c'est, en fait, une variable de classe, en fait, si vous voulez.
00:24:36 :C'est comme la content et e-send. C'est donc une variable qui va être associée à votre classe.Donc, là, vous devez créer un attribut de classe nommé numberOfEmailSends sur la classe email.
00:24:46 :Donc ça, qu'est-ce que ça veut dire ? C'est qu'on va mettre au tout début, on va se créer un attribut de classe, donc numberOfEmailSends.On n'a pas besoin, en fait, on ne précise pas qu'on le veut en self, donc on peut juste se contenter de se le mettre au tout début.
00:25:05 :Ce qui est important, c'est que ce soit dans la classe email. Et dans tous les cas, il appartiendra à la classe.Donc, je vais le copier-coller, ce sera plus simple. Et après, on ne nous dit pas spécialement ce que ça doit contenir.
00:25:19 :Enfin, si je lis après, cet attribut devrait être incrémenté de 1 à chaque fois qu'un email est envoyé.Donc, par déduction, c'est un int, donc c'est une variable qu'on va mettre à 0 de base.
00:25:30 :Voilà. Et donc là, cet attribut devrait être incrémenté de 1 à chaque fois qu'un email est envoyé.Donc, à chaque fois que la méthode sendTo est appelée, donc déjà, on peut commencer par faire un numberOfEmailSends.
00:25:46 :Plus ou égale à 1.Plus ou égale à 1. Hop, on l'incrémente de 1 à chaque fois que la méthode est appelée.Ensuite, l'email ne doit être envoyé que si l'attribut isSent est false.
00:25:58 :Pour ça, c'est comme ça. On va rajouter une condition.If not self, on doit mettre le self sur le sendTo, je crois.Est-ce que c'est possible de ne pas parler autant que lui ?
00:26:13 :Sinon, je comprends mal un peu. J'entends les deux voix, les plusieurs voix, s'il vous plaît.Ok, ok, ça marche.Donc, si la variable n'est pas égale à false, on va pouvoir envoyer notre mail.
00:26:34 :Non, pardon, si la variable n'est pas égale à true, on va pouvoir envoyer notre mail.Donc, on l'incrémente de 1.Et après, si on va un petit peu plus loin, si l'email est envoyé, vous devez retourner dans la méthode sendTo la chaîne de caractère EmailEnvoyé.
00:26:54 :Rien de plus simple. Return. Je copie-colle. EmailEnvoyé.Et si cet attribut est false, vous devez le modifier pour le faire passer à true pour signaler que l'email a bien été envoyéet empêcher ainsi l'utilisateur de l'envoyer une seconde fois.
00:27:14 :Donc, pour ça, comment on fait ?Bah, c'est pareil. Donc, on va se le mettre self.e-send.On va se le passer à true. Comme ça, on n'enverra pas deux fois le mail.
00:27:29 :On a incrémenté notre compteur. On a renvoyé le return.Et sinon, dans le cas où il était déjà en true de base, on nous dit, si l'email a déjà été envoyé, vous devez retourner la chaîne de caractère EmailEnvoyé.
00:27:45 :Et donc là, dans le cas contraire, on récupère ça et on return la chaîne de caractère qu'on nous a demandé.OK ?Donc, si je reprends étape par étape, je vais resaumer encore jusqu'au maximum que je peux.
00:28:01 :On reprend étape par étape.Premièrement, on doit créer une méthode sendTo. On a commencé par ça.D'ailleurs, j'ai oublié les deux petits points.On s'est fait tout de suite notre méthode sendTo comme paramètre, le paramètre email.
00:28:13 :Donc là, ça va.Ensuite, deuxième chose qu'on nous demande, c'est de créer un attribut de classe.Un attribut de classe, c'est donc une variable qui est dans la classe, qui est inhérente à la classe.
00:28:22 :On ne nous a pas demandé de la mettre dans init.On ne peut pas non plus le définir explicitement avec self.Donc, on peut se contenter de la mettre là.
00:28:32 :Si on lit juste après, on comprend que cet attribut là, il doit être incrémenté.Il est incrémenté d'un int.Donc, ça doit être un int de base.
00:28:40 :Donc, on va l'initialiser à zéro.Cet attribut là, il doit être incrémenté à chaque fois qu'un email est envoyé.Donc, à chaque fois que la méthode sendTo est appelée.
00:28:49 :Donc, j'ai commencé par écrire ça tout à l'heure, direct dans ma fonction.Même si je le déplace après, ce n'est pas grave.Je vois que le soleil commence à me cacher un peu.
00:28:58 :Ça devrait être mieux comme ça.Donc, j'avais commencé par le mettre juste ici.Ensuite, on nous dit que l'email ne doit être envoyé que si l'attribut isSent est calls.
00:29:11 :Donc, pour ça, j'ai fait un if not self isSent.Donc, je vérifie que ce n'est pas égal à true.J'aurais pu aussi mettre un if self égale égale false.
00:29:23 :Ce serait revenu au même.À ce moment-là, je peux faire mes trucs.Donc déjà, je comprends que ça, je dois le déplacer juste ici.Ensuite, on nous dit que si l'attribut est false, vous devez le modifier pour le passer à true.
00:29:45 :Pour signifier que l'email a bien été envoyé et empêcher que l'utilisateur l'emmène une seconde fois.Donc là, c'est pareil.Il manque les guillemets.C'est juste après cela.
00:29:54 :Non, c'est le retour.Oui, tout à fait bien vu.Donc, on comprend également ici, en lisant ça, que du coup, il faut passer notre variable à true.
00:30:07 :Pour dire que l'email a bien été envoyé et pour éviter que ça le refasse en boucle.Sinon, on serait dans un cas où la variable est tout le temps égale à false et c'est après ça en boucle.
00:30:17 :Donc, on le passe à true.On augmente notre incrémenteur de 1 comme on nous l'a demandé.Jusque là, pour l'instant, on est censé être arrivé à ça.
00:30:28 :Ensuite, on passe à la partie sur retourner des chaînes de caractère.Si l'email est envoyé, on retourne l'email envoyé.C'est dans cette partie-là.On retourne ça.
00:30:41 :Sinon, si l'email a déjà été envoyé, toujours dans la méthode, on renvoie la chaîne de caractère qui a déjà été envoyée.Et ensuite, la variable devra contenir...
00:30:54 :Après, ce sont des tests qu'on nous fait de base.Donc, on envoie deux fois le même email.La première doit contenir l'email envoyé et la deuxième, déjà envoyé.
00:31:04 :Donc là, normalement, si je fais ça...Ah oui, j'ai peut-être oublié de mettre mon self quand même.J'ai fait une erreur.Je me demandais pour le self, mais bon.
00:31:32 :Dans les variables de classe, il faut quand même le mettre là.Puisqu'on ne l'a pas à définir en tant que self ici, c'est quand même inhérent à la classe.
00:31:53 :Donc, il faut quand même mettre le nom de la classe devant.Autant pour moi.Est-ce que c'est plus clair comme ça ?Donc là, j'avais oublié de mettre le paramètre self,parce qu'il faut le mettre si on veut pouvoir accéder aux variables qui sont définies dans le init.
00:32:10 :Donc ici, pour pouvoir accéder à isSent.Et après, pour accéder à notre attribute class, il faut quand même dire que l'attribut vient de la classe email.
00:32:19 :Est-ce que ça va pour tout le monde ? Même pour toi, Nadir, qui n'avais pas fait trop de programmation dans tes objets.En vrai, celui-là, il est en avancé, mais je ne l'aurais pas mis en avancé.
00:32:30 :Je l'aurais mis en intermédiaire, voire même débutant.Je ne le trouve pas non plus très très compliqué.Oui, moi, j'ai peut-être deux questions.Oui.Au fait, c'est en dessous le self.
00:32:44 :Parce que des fois, je veux savoir, dans une classe,quand tu as une fonction de la classe, une méthode de la classe,il faut toujours ajouter le self ?
00:32:54 :Ou bien, le self n'est pas ajouté uniquement quand tu veux faire des fonctions statiques,des méthodes statiques, ou des...C'est-à-dire, quand tu as ajouté le self et non.
00:33:10 :Parce que des fois, je me mélange là-bas, au fait.Moi, par défaut, je pense que je le mets tout le temps.C'est vrai que je n'ai pas eu beaucoup, voire même pas.
00:33:21 :Je n'ai pas de cas en test où tu ne le mets pas.Si tu as une statique méthode dans une classe, je pense que tu ne mets pas le self.
00:33:26 :Oui, une statique méthode, j'avoue que moi, je ne l'utilise pas, mais...Non, par défaut, je pense que tu dois tout le temps le mettre, en fait,pour accéder à tes attributs de classe.
00:33:36 :Donc, si tu n'as pas, par exemple, une statique méthode,ou une classe méthode, tu mets tout le self.Oui, oui.À part les statiques, classe méthode,et peut-être l'abstract, je ne suis même pas sûr.
00:33:49 :Oui, je crois, oui.Sinon, tu le mets tout le temps, oui.Thibault, il a dit, je crois, self, on le met.C'est une convention de Python.
00:33:57 :Il a dit qu'on doit le mettre tout le temps.Enfin, le mieux, c'est de le mettre tout le temps,et que tout le monde le met, le self.
00:34:02 :Oui.Après, je n'utilise pas beaucoup de statiques de méthode, mais...Peut-être que dans les statiques, il ne faut pas le mettre, c'est à vérifier.Non, statique de méthode, je ne pense pas.
00:34:14 :Tu ne le mets pas parce que là, c'est directement lié à la classe,et non à l'instance.Parce que le self, c'est l'instance, je crois.
00:34:21 :J'avoue que je n'ai pas l'info comme ça.Ok.Mais là, en fait, au niveau du if,parce que je remarque qu'avec Python,la négation, c'est toujours if not, par exemple.
00:34:41 :Oui.Mais, moi, si je fais du C sharp,je mets U égal à force, par exemple.Deux manières de le faire.Oui.Soit en n'utilisant rien du tout ou not.
00:34:58 :En fait, en n'utilisant rien du tout en Python,par défaut, si tu fais if égal à une valeur,donc à une variable, un attribut de classe, n'importe quoi,quand tu fais ça, ça peut être if self is n,ça aurait pu être if ça, si c'est un booléen,ça vérifie, est-ce que la variable est égale à true ?
00:35:15 :Ok ?Oui.Donc, quand tu écris quelque chose,donc if variable booléen,écrire cette instruction-là,c'est équivalent à écrire ça.Ok ?Ok.Et donc, l'inverse,quand tu mets not, c'est donc que tu mets l'inverse.
00:35:41 :Quand tu fais if not variable booléen,ça revient à la même chose que mettreif variable booléen est égal à false.D'accord.C'est deux manières de faire.
00:35:51 :C'est juste que tu gagnes un peu de place à faire comme ça et comme ça.Mais, moi, je ne vois pas ça.Souvent, même Thibault, il ne met pas égal à true,il met pas un if ou un if not.
00:36:02 :Il ne met pas égal à true ou égal à false.Non, c'est parce qu'une fois que tu commences avec un peu plus d'expérience,on a tendance à plus utiliser çaparce que c'est légèrement plus optimiséet puis c'est plus rapide aussi,que ce soit à écrire ou à comprendre quand tu t'y connais un peu.
00:36:21 :Mais si toi, tu es plus à l'aise à écrire ça et ça,ça ne change rien.Ok.Voilà, c'est le même comportement.Soit tu écris ça, soit tu écris ça.
00:36:33 :Ok.Est-ce qu'il y a d'autres questions sur cet exercice-là ?Pour moi, c'est très simple.Mais pour les débutants, ce n'est pas assez simple comme ça.
00:36:56 :Je comprends parfaitement les soucis de Naïr.Surtout pour les débutants,ça peut paraître un peu avancé, ce genre d'exercice.Surtout avec l'orienter-objet,si tu n'as pas l'habitude de le traiter, c'est un peu compliqué.
00:37:14 :C'est juste ça.Parce que ce sont des notions un petit peu différentes.Oui, oui.Moi, je l'aurais mis en intermédiaire quand même, je pense.C'est quoi la différence entre NOT IN et NOT ?
00:37:29 :Alors, IN, c'est un paramètre pour vérifierque quelque chose est présent dans ta liste,dans ta chaîne de caractère, etc.Pour vérifier qu'un élément est présent dans une structure de données.
00:37:40 :Donc, IF NOT IN, c'est ton élément n'est pas dans la structure de données.Et IF IN, c'est ton élément est présent dans la structure de données.
00:37:49 :Donc, en fait, c'est IF quelque chose, NOT IN, ta ta ta,une structure de données,ou IF ta ta ta, IN, structure de données.Parce que NOT, de ce que j'ai compris dans l'information,NOT, ça retourne en gros,si c'est TRUE, ça retourne FALSE,et si c'est FALSE, ça retourne TRUE, c'est ça ?
00:38:09 :C'est ça.C'est l'inverse de l'instruction.Donc, si tu utilises IN, par exemple,si tu utilises IN, par exemple,IF NOT IN, c'est ce n'est pas dans.
00:38:20 :En fait, c'est un n'est pas, en fait.C'est une négation, si tu veux, le NOT.C'est juste l'inverse de ton instruction.Tu prends ton instruction de base et c'est le comportement inverse.
00:38:29 :D'accord, merci, super.Donc, par exemple, le NOT IN,je vais essayer de t'exprimer par un exemple.Donc,on va mettre un mot, plutôt,parce que je n'ai pas envie de m'embêter à faire des phrases.
00:38:49 :Hop !Tac, tiens.Donc là,IF LETTER IN, ça vérifieque le contenu de ta première variable,ce que tu mets ici,est présent dans ta deuxième structure de données.
00:39:43 :Et là, ma structure de données, c'est une variable qui contientla chaîne de caractère Papa.Ici, il y a un A dans Papa, donc ça me met TROUVÉ.
00:39:50 :Je vais rajouter un ELSE pour le deuxième comportement.Hop !Et du coup, par exemple, si je mets plutôt mot 2,donc dans FLEUR, il n'y a pas de A dans FLEUR,ça ne me met pas TROUVÉ.
00:40:09 :Maintenant, si je fais l'inverse,si je mets NOT IN,là, ça va me mettre TROUVÉ,puisque c'est le comportement inverse.Est-ce que la lettre n'est pas dans FLEUR ?
00:40:19 :Oui, elle n'est pas dans FLEUR, donc ça met TROUVÉ.Et non, elle n'est pas dans FLEUR,donc ça ne met pas TROUVÉ.Il n'y a pas trop de logique, mais c'est le comportement inverse.
00:40:30 :Et donc là, si je mets Papa,même s'il y a la lettre dans Papa,il ne va me mettre pas TROUVÉ.Tu vois ?En fait, ça va juste inverserce qu'on appelle ton instruction, le NOT.
00:40:43 :Donc avec le IN,c'est une instruction qui permet de vérifier siune chose est présente ou non dans une structure de données,peu importe sa forme.
00:40:52 :Ça aurait pu être une liste, ça aurait pu être un dictionnaire.Là, je vais, pour l'exemple, simplement utiliser des chaînes de caractères.Et donc le NOT, ça inverse.
00:41:02 :Voilà.Alors, Kevin ?OK, je comprends, par exemple, la logique,mais je voulais juste savoir quelque chose, par exemple,si on met IF l'lettre NOT IN...
00:41:16 :Non, non, c'est juste...Voilà. NOT IN mot 1.On veut savoir si A n'est pas dans mot 1, Papa, c'est ça ?Oui.Je voulais juste savoir,parce que mot 1, c'est un string.
00:41:33 :Oui.Je ne sais pas, maintenant, si Python,il traduit Papa en liste avant de vérifier,comment il fait ?Ou bien il va juste vérifier dans le string ?
00:41:44 :Non, je crois qu'il vérifie juste la string.Il vérifie juste la string.Donc il ne convertit pas en liste, par exemple, avant de vérifier ?
00:41:56 :En vrai, je n'ai pas le comportement exact en tête.Je n'ai pas le comportement exact en tête.Après, je pourrais faire...On va faire, par exemple, une liste avec des caractères.
00:42:14 :Bon, c'est entre strings, mais...Et on va faire ça.En l'occurrence, ce n'est pas une lettre, mais on s'en fiche.Et ça, ce n'est pas une bonne convention.
00:42:28 :On va faire ça.Donc là, on n'est pas...On va faire ça, sinon ce ne sera pas clair.On va mettre chiffre.Est-ce que 3 est dans ma liste ?
00:42:44 :Non, elle n'y est pas.Par contre, est-ce qu'elle n'est pas dans ma liste ?Effectivement, elle n'y est pas.Elle y est, dans le sens où elle n'y est pas.
00:42:53 :Quand tu mets un note, il faut changer.Le comportement, c'est inversé.Du coup, à ce moment-là, je devrais inverser ces instructions-là.Mais le comportement est le même.
00:43:04 :Ça marche avec toutes les structures de données.Donc, qu'est-ce que ça string ?Liste, ça marche ?Oui, oui.De ce que j'ai compris, ça retourne juste un booléen.
00:43:14 :Ça retourne juste l'inverse du booléen qu'on a dit.Par exemple, si notre IN est TRUE,ça retournera FALSE.C'est ça ?Oui, c'est ça.Je voulais savoir le comportement.
00:43:28 :Par exemple, si tu mets PAPA, le mot 1, c'est un string.Donc, comment on peut chercher A dans PAPA ?Il faut parcourir, par exemple, PAPA.
00:43:38 :Oui.C'est ce que fait, en fait, IN.Je vois.Il parcourt, en fait.J'ai plus le comportement de comment est fait côté piton IN.Mais je pense que c'est juste un algorithme de parcours.
00:43:55 :Après, est-ce que ça, il transforme par défaut en LISTE pour le parcourir ?Ou est-ce qu'il parcourt avec une boucle ?Je ne sais pas, en fait.
00:44:03 :Je n'ai plus le comportement de comment est fait.Moi, par exemple, à chaque fois, même si c'est un string,je le traduis d'abord en LISTE, par exemple, avant de faire des trucs.
00:44:14 :Par exemple, ici, je vais traduire PAPA en LISTE avant de chercher le A dans PAPA.Avec le IN, tu n'as pas besoin, du coup.Ok.
00:44:22 :Mais Thibault, il avait fait un mentorat sur ça.En gros, comment le piton se comportait.Si jamais tu arrives à le retrouver, ça pourrait être intéressant.
00:44:40 :Je vais essayer de chercher.Je ne sais pas comment c'est cet opérateur-là.Ça pourrait être intéressant de savoir.Je sais comment il fonctionne, mais je ne sais pas comment il est, entre guillemets,codé derrière le côté piton, le IN.
00:44:57 :Qu'est-ce que je peux faire pour vérifier ?Tu peux chercher dans VS Code ou Picharm et cliquer sur IN.C'est ce que je vais faire.
00:45:16 :Malheureusement, je n'arrive pas à y avoir accès.C'est comme le IF ou le DEF, en fait, on ne peut pas cliquer dessus.Je ne pourrais pas te dire comme ça, malheureusement.
00:45:46 :Ok, peut-être qu'on peut... Je ne sais pas, là, on va chercher.Moi, si je n'ai pas un IN ici, je n'ai pas échappé, mais je ne sais pas.
00:45:56 :Oui, oui, oui.Moi, en cliquant sur IN, il m'a fait ça.Le DEF itérateur, c'est juste un itérateur.Oui, oui, j'ai la même, mais ce n'est rien de bien convaincant, en fait.
00:46:20 :Mais c'est les itérateurs pour les autres qui connaissent ça, c'est bien.Oui, c'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.
00:46:31 :C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.C'est bien.
00:46:44 :C'est bien.Je pense avec les 3 points derrière, non ?Il y a un truc, parce qu'il n'est pas complet, l'itérateur.Ça pourrait être intéressant à creuser.
00:46:59 :Je ne me rappelle plus.J'ai essayé de chercher dans le mentorat, mais je n'arrive plus.Je ne me rappelle plus.Thibault expliquait qu'on pouvait s'arrêter à chaque ligne de trucs pour pouvoir voircomment le python se comportait.
00:47:14 :Mais j'ai oublié.C'était quoi le nom du mentorat ?Sinon, tu peux débugger.Je pense que tu auras…Peut-être.Pas sûr.Je ne pense pas à un débugger.
00:47:29 :Il ne va pas monter.Il va juste…Ce que je vois, c'est un itérateur qui parcourt chaque élément de l'objet donné,peu importe c'est quoi l'objet.
00:47:35 :Donc, peu importe.Voilà.Parcourt chaque élément avec la méthode next.Oui, je pense.Et donc, peu importe que ce soit quoi, il le fait étape par étape.
00:47:47 :Donc, que ce soit une liste, il va faire tac, tac, tac.Si c'est une chaîne de caractère, il va faire tac, tac, tac, etc.En fait, il ne transforme pas le truc en une liste ou quoi que ce soit.
00:47:58 :Peu importe la structure de données, il va juste prendre les éléments,les séparer tous et les faire un par un.Oui, je vois.Ça a l'air de fonctionner comme ça.
00:48:06 :Et du coup, ça utilise cette méthode-là, l'iter,qui génère en gros un itérateur.Et donc, ça peut parcourir les tuples, les dictionnaires, les listes, les strings et les sets.
00:48:25 :Oui.Voilà.Parfait.Ça, c'est des structures de données qui sont itérables, en fait.Oui, j'ai fait des...Sur les itérables, je crois que j'ai fait un...
00:48:38 :J'ai fait un glossaire il n'y a pas longtemps là-dessus, non ?Sur les itérables, justement.Un itérable.Voilà.Chaîne de caractère.Bon, et bien, il en manque.
00:48:57 :Enfin, liste, dictionnaire, tuple, chaîne de caractère, il y a les sets.Mais en gros, voilà.En fait, tous les objets itérables, du coup, peuvent être...
00:49:04 :On peut utiliser IN dessus.En gros.OK, merci.C'est clair pour moi.C'est bon.Merci.OK.Est-ce qu'il y a des petites questions pour terminer tranquillement la session ?
00:49:18 :Non, pour moi, personnellement, non.Ce que je vais faire, c'est continuer à refaire la formation pour pouvoir mieux m'améliorer,parce que là, j'ai bientôt fini.
00:49:41 :OK.Ça marche.Et puis, du coup, n'oublie pas, comme je t'avais dit, de faire les...Oui, j'ai refait le test débutant.Là, il ne manque plus que l'intermédiaire.
00:49:53 :Je vais refaire ça.OK.Ça marche.OK.Ça marche.Ça doit être ça.Je ne sais pas le nombre en tête, mais ça doit être quelque chose comme ça.
00:50:13 :Mais oui, OK.Écoute, merci à toi de ta présence, Axel.N'oubliez pas la feuille de présence.Je la renvoie si jamais vous l'avez éloupée.Hop.
00:50:23 :Je suis content que mon micro ait marché cette fois-ci.Et encore, j'ai l'impression qu'il a quand même baissé un petit peu par rapport au début de la session.
00:50:32 :Oui, il a baissé.Oui, il baisse au fur et à mesure.Je n'ai pas résolu à 100%.Mais oui, j'essaie justement d'expliquer un petit peu mon climat de pensée sur les exercices.
00:50:44 :Ce n'est pas encore parfait là-dessus, parce que je n'ai pas l'habitude,mais on va y arriver à faire de mieux en mieux au fur et à mesure des sessions.
00:50:51 :OK, OK.OK, mais est-ce que si le temps nous permet,on ne peut pas faire juste une vérification sur les phases API ?Sur les phases API ?
00:51:03 :Là, je t'avoue que je n'ai pas trop le temps de parler de ça,mais par contre, je t'invite à voir le mentorat que j'ai fait.
00:51:07 :J'ai fait une session complète dessus.D'accord.Je vais t'envoyer le lien de la rediffusion si tu veux.J'ai fait une session complète sur les phases API.
00:51:14 :Introduction aux phases API.Tiens.J'ai présenté vraiment le truc de AZ.J'ai donné un exemple, etc.Donc là, tu as une bonne heure de contenu.
00:51:24 :Tu as 50 minutes de contenu dessus.OK, merci.Qu'est-ce que c'est ? Comment l'installer ?Un exemple de première application.Comment gérer les routes ?
Aucune occurrence trouvée pour « ».
00:00:00
Question de Nahir sur le trading automatisé via des scripts
00:02:08
Questions et difficultés depuis lundi
00:03:05
Début des exercices
00:03:27
Vérificateur de palindrome - Début
00:04:24
Explication de la méthode reverse pour les palindromes
00:10:23
Compteur d'emojis - Début
00:25:04
Programmation orientée objets - Compléter la classe email
00:37:25
Utilisation de l'opérateur IN et NOT IN