- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte person00:00:00 :Voilà donc ma solution à ce projet dans lequel vous deviez réaliser un script qui permette de réaliser une opération mathématique.Il y avait plein de façons de faire cet exercice.
00:00:10 :Vous allez voir que moi je suis parti sur une version assez restreinte, assez raccourcie,grâce notamment à cette fonction que vous ne connaissez peut-être pas qui s'appelle eval, que l'on verra par la suite.
00:00:21 :Donc moi ce que j'ai commencé par faire ici dans ce script, c'est de vérifier que l'opération rentrée par l'utilisateur était valide.Pour ça je vous rappelle il fallait qu'on ait un nombre, un symbole d'opération et un autre nombre.
00:00:33 :Donc par exemple ça ici.Donc en fait moi ma condition c'est de récupérer ces trois éléments.Pour ça je vais utiliser la méthode split sur ce que l'utilisateur va rentrer et je vais splitter sur un espace.
00:00:47 :Donc là j'ai mis un espace ici.Par défaut la méthode split, si on ne lui donne rien, va splitter sur un espace.Donc on pourrait très bien mettre ça comme ça ici, donc juste split.
00:00:55 :Moi je préfère être explicite plutôt qu'implicite dans ce cas-ci.Donc je vais mettre un espace entre guillemets ici, donc une chaîne de caractère qui contient un espace,pour que ce soit bien clair que je split ma chaîne de caractère opération sur l'espace.
00:01:08 :Donc ça, ça va me récupérer dans chunks ici, une liste qui va contenir les trois éléments.Donc on va voir le premier élément ici, donc le nombre 5, le deuxième élément le plus et le troisième élément le 4.
00:01:20 :Et tant que je n'ai pas ça, tant que je n'ai pas ici une liste qui contient trois éléments,et bien je vais redemander à l'utilisateur de saisir une opération.
00:01:28 :Donc c'est exactement ce que je fais ici, je commence par définir cette variable chunks qui est une liste vide,et je dis que tant que la longueur de cette liste est différente de 3,et bien je demande à l'utilisateur de rentrer une opération.
00:01:40 :Donc ici on a la fonction len qui permet de récupérer la longueur de la liste,et ici on a l'opérateur différence, donc un point d'exclamation et le symbole égal, ça veut dire différent de.
00:01:51 :Donc tant que la longueur de ma liste chunks est différente de 3, on boucle.Qu'est-ce qu'on fait à l'intérieur de cette boucle while ?On récupère grâce à la fonction input la saisie de l'utilisateur,et on récupère ça dans la variable opération.
00:02:04 :Et ensuite on va faire donc opération.split sur la chaîne de caractère avec un espace.Donc si par exemple ici je mets 5 plus 4 fois 8, donc une opération qu'un utilisateur pourrait rentrer,je vais faire un split sur l'espace, donc là dans ce cas-ci je récupérerai plus que 3 éléments.
00:02:21 :J'aurai ici dans ce cas-ci 5 éléments, les 3 nombres et les 2 opérateurs.De la même façon si je mets quelque chose d'autre, par exemple si je mets ça comme ceci ici sans les espaces,là on aurait donc un seul espace et on se retrouverait uniquement avec 2 éléments dans notre liste chunks.
00:02:36 :On aurait un premier élément, donc le nombre 5, et un deuxième élément, plus 4 ici,et donc ce ne serait pas égal à 3 et on redemanderait à l'utilisateur de saisir une opération.
00:02:45 :Donc il y a vraiment uniquement quand on va avoir ça ici que ça va fonctionner.On pourrait également avoir ça, ça fonctionnerait également,et c'est uniquement par la suite qu'on va vérifier ici si on a bien un nombre et un opérateur,donc ça on va faire les validations par la suite.
00:02:58 :Mais pour l'instant on veut juste s'assurer qu'on a 3 éléments,on veut même pas s'assurer que c'est des chiffres, que c'est des nombres, etc.Je pourrais mettre AAA de la même façon et ça marcherait,je pourrais mettre R plus T, ça marcherait également.
00:03:09 :Là c'est vraiment juste, on veut voir si on a 3 éléments qui sont envoyés par l'utilisateur.Donc une fois qu'on a fait cette vérification, une fois qu'on a bien 3 éléments dans chunks,on va sortir de notre boucle while puisque cette condition ne sera plus vérifiée,puisque l'n de chunks sera égal à 3, et on va continuer avec la suite du script ici.
00:03:28 :Qu'est-ce que je fais ici ? Je récupère les différents éléments qui ont été récupérés dans le chunks.Donc là j'utilise les crochets avec l'indice de l'élément.
00:03:36 :Vu qu'on a fait une vérification ici pour s'assurer que la liste chunks contient bien 3 éléments,on est assuré de ne pas avoir d'erreur ici avec ces indices,puisque si on a 2 éléments, cette condition ne sera pas validée, si on en a 4 non plus.
00:03:49 :Si on en avait 4, ce ne serait pas très grave puisqu'ici on s'arrête à 2.Mais imaginez que j'ai une liste qui ne contienne que 2 éléments,et bien là si on faisait chunks de 2, donc si on récupérait le 3ème élément,et bien avec une liste qui ne contient que 2 éléments, ça ne fonctionnerait pas.
00:04:02 :Là vu qu'on est assuré avec cette condition que si on arrive ici, on a bien 3 éléments dans notre liste,on peut sans souci récupérer ces 3 indices, donc l'indice 0, l'indice 1 et l'indice 2.
00:04:12 :L'indice 0 ça va être le premier nombre, l'indice 2 qui est représenté par l'indice 1 ici,puisqu'on commence à compter à 0, ça va être l'opérateur,donc par exemple plus, multiplié, le symbole moins, etc.
00:04:24 :Et ici on va avoir notre 2ème nombre qui va être en 3ème position.On pourrait également passer par cette méthode alternative que je vous ai mise ici,que personnellement je préfère, qui nous évite de spécifier les différents indices.
00:04:35 :En fait on va tout simplement faire une assignation multiple,puisque là en fait on a une liste avec 3 éléments,et on peut donc faire une assignation directement avec ces 3 variables en les séparant d'une virgule.
00:04:46 :Donc firstNumber, virgule operator, virgule secondNumber,ça va fonctionner là encore uniquement si on a 3 éléments,si on avait une liste qui ne contient que 2 éléments, on aurait une erreur,puisqu'on a 3 variables ici, et on n'aurait que 2 éléments à mettre dans ces 3 variables.
00:04:59 :Donc là il faut bien s'assurer qu'on a le même nombre d'éléments des 2 côtés du symbole égal,là encore une fois on est assuré que c'est le cas,puisqu'on a fait cette vérification et on est donc sûr en arrivant iciqu'on a bien une liste chunks qui contient 3 éléments.
00:05:11 :Donc on peut mettre 3 nombres de variables ici sans avoir peur d'un risque potentiel d'erreur.Donc moi je vais garder cette façon ici de faire que je préfère,je vais enlever cette façon de faire ici pour la suite de la correction,et on arrive ici à la vérification.
00:05:26 :Donc on va faire 2 vérifications, on va vérifier si les 2 nombresque l'on a récupérés donc dans firstNumber et secondNumber ici sont bien des nombres,puisqu'on ne veut pas que l'utilisateur puisse par exemple faire A plus B,qui n'est pas une opération valide.
00:05:37 :On veut absolument que les 2 éléments qu'on a récupérés ici au début et à la fin soient des nombres.Donc pour ça on va faire une vérification avec isDigit,qui est possible donc sur une chaîne de caractère.
00:05:47 :Donc isDigit va me retourner vrai si une chaîne de caractère ne contient que des nombres,et on va faire ça sur firstNumber et secondNumber.Et grâce à l'opérateur end, on va s'assurer que cette condition ici,validNumbers, va contenir le booléen true uniquement si les 2 conditions ici sont vraies.
00:06:04 :Donc si firstNumber isDigit est vrai et que secondNumber isDigit est vrai,et bien tout ça, ça va être vrai.Si on a un des 2 qui est faux, et bien tout sera faux.
00:06:13 :C'est l'utilité de cet opérateur end.Si on avait or ici, ça ne fonctionnerait pas,puisque or ça permet de vérifier qu'au moins un des 2 est true.
00:06:21 :Donc même si on en avait un qui était false, on aurait le résultat de tout ça qui est true.Nous on veut s'assurer que les 2 sont vrais,donc pour ça il ne faut pas utiliser or mais bien end,qui en français se traduit par et.
00:06:31 :Donc on veut que firstNumber soit un nombre,et que secondNumber soit également un nombre.Donc si tout ça est vrai, on va avoir true ici dans validNumbers.
00:06:40 :La deuxième opération qu'on veut vérifier,c'est si l'opérateur que l'on a récupéré ici dans l'assignation,donc l'opérateur qui par exemple si je fais 5 plus 8 va être égal au plus,et bien on veut vérifier que cet opérateur est valide.
00:06:52 :Donc là je vais utiliser in ici pour vérifier que la valeur contenue dans ma variable opératorest bien contenue dans cette liste.Donc là je gère ces 5 symboles ici,le plus, le moins, la division, la multiplication et le modulo.
00:07:06 :Donc si cet opérateur est contenu avec in dans cette liste,et bien validOperator sera true.Si par contre on rend quelque chose qui n'est pas contenu dans cette liste,validOperator sera false.
00:07:17 :On va donc avoir ici 2 boulet 1 dans validNumbers et validOperators,et je vais pouvoir faire une condition ici,donc une structure conditionnelle avec un if et un else,et je vais vérifier que à la fois validOperator et validNumbers sont vrais,et si c'est le cas on va faire l'opération.
00:07:32 :Donc ces 2 vérifications ici j'aurais pu les faire sur une seule ligne,j'aurais pu tout mettre ici dans le ifet mettre toutes ces lignes de code ici à la place de validOperatoret toutes ces lignes de code ici à la place de validNumbers.
00:07:44 :Le problème c'est que ça devient un peu difficile à lirepuisqu'on aurait une ligne qui dépasserait la taille de mon écran.Moi j'ai préféré du coup faire 2 variables intermédiaires iciavec des noms bien précis,et comme ça quelqu'un qui arrive sur mon script,qui ne sait pas exactement ce que je vais faire,
00:07:58 :il va pouvoir le lire beaucoup plus rapidement que si j'avais tout sur la même ligneoù on aurait en fait un truc qui est un peu plus difficile à lire.
00:08:04 :Donc là si les 2 sont valides,si on a un opérateur valide et des nombres valides,on va pouvoir continuer avec l'opération.Alors pour ça j'utilise un fStringet dans ce fString je vais insérer déjà l'opération en tant que telle,donc par exemple 5 plus 5,on met un symbole égal,
00:08:20 :et ici je vais utiliser la fonction evalqui me permet d'évaluer une chaîne de caractère comme du code Python.Donc en fait si on a 5 plus 5 dans une chaîne de caractère,si j'avais la chaîne de caractère ici 5 plus 5,si je fais eval de tout ça,
00:08:35 :et bien ça va me retourner,ça va évaluer en fait cette chaîne de caractère comme du code Python,et avec Python quand on fait 5 plus 5,et bien ça nous retourne 10.
00:08:43 :Si je faisais eval par exemple de printet que dans ce print je mettais bonjour comme ceci,et bien là j'ai une chaîne de caractère qui contient du code Python,qui contient print bonjour,donc si je fais eval de cette chaîne de caractère,et bien ça va tout simplement m'afficher bonjour.
00:08:57 :Donc on va vraiment évaluer le code qui est contenu dans la chaîne de caractère.Cette fonction elle peut être un peu dangereuse,puisque en fait on peut avoir du code qui n'est pas valide.
00:09:05 :Imaginez ici que je fais une chaîne de caractère qui elle est tout à fait valide,mais que j'essaye de l'évaluer ici,vu que j'ai enlevé un guillemet,et bien ça ce n'est pas du code Python valide.
00:09:14 :Donc on a bien une chaîne de caractère valide,mais quand j'essaie de l'évaluer je vais avoir une erreur,puisqu'on essaye d'exécuter en fait du code Python qui n'est pas valide.
00:09:21 :Donc c'est pour ça que je dis qu'elle est un peu dangereuse.Là dans ce cas-ci avec toutes les vérifications qu'on a faites au préalable,on est assuré d'avoir dans les deux cas des nombres,et d'avoir un symbole d'opération qui est géré par Python.
00:09:32 :Si par exemple ici je mettais quelque chose d'autre,comme par exemple je ne sais pas, la lettre P,là on pourrait avoir des problèmes,parce que ça veut dire que je pourrais avoir une opération,par exemple 5P8,donc ça ça passerait,puisque le P est contenu dans ma liste ici,
00:09:45 :mais par contre après si j'évaluais cette opération 5P8,ça ce n'est pas quelque chose que Python peut comprendre.Donc là encore c'est pour ça que je dis que c'est assez dangereux,entre guillemets, cette façon de faire,mais là dans ce cas-ci avec toutes les vérifications qu'on a faites,il n'y a pas de risque d'avoir d'erreur.
00:09:59 :Donc ça me permet de faire très facilement ici l'évaluation de cette opération.C'est là où peut-être vous avez fait quelque chose d'un peu plus compliqué,avec plein de if-elif.
00:10:07 :Je sais que j'ai des étudiants souvent qui font un if,donc ils vérifient si l'opérateur est plus,et si c'est plus après ils vont faire first number plus second number,si c'est moins ils vont faire first number moins second number, etc.
00:10:18 :Et donc on va avoir 5 structures conditionnelles avec des if-elif,pour gérer tous les cas de figure.Donc c'est un peu embêtant, un peu long à faire,et si on ajoute ou on enlève des opérateurs,il faut rajouter des conditions.
00:10:29 :Là je peux rajouter par exemple la division entière,si je mettais ici comme opération possible la division entière,qui est un symbole qui est accepté par Python,et bien je vais avoir directement l'évaluation qui va marcher.
00:10:39 :Je n'ai pas besoin de rajouter quelque chose,donc une structure conditionnelle ou quoi que ce soit.Donc moi je vais l'enlever ici, je veux juste gérer ces 5 cas de figure ici.
00:10:46 :Et donc on a l'opération, par exemple 5 plus 5,qui va être égale à l'évaluation de l'opération,que je mets donc à l'intérieur de ces accolades ici.
00:10:54 :Tout ça c'est un if-string, on l'oublie pas sinon ça ne fonctionne pas.Donc ça c'est si j'ai des opérateurs valides,et si les opérateurs ne sont pas valides,ou que les nombres ne sont pas des nombres,donc si on fait a plus b,ou si on fait 5 plus 8 par exemple,
00:11:07 :donc un opérateur invalide ou des nombres invalides,et bien si ce n'est pas vérifié, on va dans le else,et on va tout simplement afficher que l'opération,opération ici, n'est pas valide.
00:11:16 :Là encore c'est un if-string,donc ça nous permet d'insérer grâce aux accolades ici,l'opération que l'utilisateur a rentrée,et ensuite on termine le script comme ceci.
00:11:24 :Donc je vais exécuter tout ça,vous voyez qu'au final ça fait pas énormément de lignes de code,donc je sauvegarde et je lance le script,et on va voir ce que ça donne.
00:11:32 :Donc si je fais 5 plus 5, on a bien 5 plus 5 égale à 10.Si je relance et que là je fais par exemple a plus b,et bien on a bien l'opération a plus b n'est pas valide.
00:11:41 :Si je fais 5, p, 8,donc comme je vous ai montré tout à l'heure,là encore l'opération n'est pas valide,puisque p n'est pas un opérateur qui est valide,puisqu'il n'est pas contenu dans cette liste ici.
00:11:51 :Là quand on avait a plus b,on n'avait pas des isDigit, donc on n'avait pas des nombres,puisque isDigit retourne falsequand on n'est pas en présence d'un nombre,donc là a ce n'est pas un nombre, b ce n'est pas un nombre non plus,donc on affiche l'opération a plus b n'est pas valide.
00:12:04 :Donc voilà pour la résolution de cet exercice,il y avait pas mal de choses à gérer,c'est pas ultra compliqué en soi,mais vous voyez qu'il y a quand même beaucoup de choses à prendre en comptequand on veut s'assurer qu'un script ne produise pas d'erreurs,et vous voyez qu'avec des fonctions comme eval,
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.