Session du 25 avril 2024 à 21h00
Pratique & Live Coding
Bases du Langage
TOSA & Certifications
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
Mentorat TOSA
Réalisation de quelques exercices TOSA, passage en revue des chaînes de caractères (f-string et format) et les erreurs courantes à éviter.
00:00:00 :Ok c'est partiSalut SimonIl y a Gab aussi qui nous a rejointSalut Gab, salut MathieuSalut tout le mondeOn va revoir un peu GabLe problème que t'as eu aujourd'hui avec les listes c'est un truc importantLe pire c'est que c'est sûr de ne pas me faire avoir parce que je connaissais le concept mais je me suis quand même fait avoir
00:01:08 :C'est normal il faut se faire avoir avec ce truc là parce que même quand on te l'explique en fait c'est la seule façon de vraiment le comprendre et il faut le manipulerAucune excuse, c'était dans les 10 erreursTon assert en fait il a fait plusieurs tests, il a fait plusieurs formats de fonction donc à chaque fois j'avais la même liste qui était utilisée
00:01:33 :Oui c'est pour ça aussi que ça dépend vachement, ça fait partie des problèmes où ça peut aller une fois et puis l'autre fois nonC'est pour ça que c'est un peu à se taper la tête contre les murs parce que tu comprends pas pourquoi dans un cas ça marche et pas dans l'autre
00:01:49 :C'est pour ça qu'il faut le manipuler pour voir tout çaOk alors je vais remettre un petit message dans le discordOk donc on va attendre encore un tout petit peu, salut WilliamHop salut Jonathan aussi qui nous a rejoint, je vais attendre encore un petit peu, il y avait pas mal de gens qui avaient répondu au sondage
00:02:29 :Donc on devrait avoir encore un petit peu plus de mondeEst-ce que vous aviez donc tous vu ce que je vous ai mis donc les ressources, j'ai vu qu'il y en a quelques-uns qui ont tout vuIl y en a pas mal qui ont vu pas forcément tout mais au moins une partie sur les chaînes de caractère notamment
00:02:48 :Salut à tous, moi ça m'a fait du bien, j'avais oublié pas mal de choses sur les chaînes de caractèreDonc j'avance à mon rythme, je l'ai pas validé encore mais je suis dessus, en tout cas j'espère finir samedi soirOuais c'est ça, je vous ai mis d'ailleurs, là j'ai mis une semaine, je vais évaluer aussi justement, voir un petit peu comment vous avancez
00:03:16 :C'est un peu difficile là de voir pour moi quelle est la charge de travail, ça me semblait relativement acceptableAprès faut pas hésiter à me dire si c'est beaucoup ou pasAprès c'est aussi pour ça que justement on va revoir un petit peu tous ces trucs là en session de mentorat, comme ça ça permet aussi de les revoir tous ensemble
00:03:36 :Et oui sur les chaînes de caractère ce que je voulais vous dire c'est surtout, je vais vous partager mon écranDonc ce que je voulais vous dire surtout c'est le, alors dans Toza, c'était tous les trucs iciOn a voilà sur cette page, donc là vous avez vu il y a plein de façons de faire, je vous avais dit donc les anciennes façons, le hold
00:04:05 :C'est bien de savoir que ça existe, après passez pas trop de temps là dessus, j'ai pas vu de question Toza là dessusIl y en aura peut-être, alors ça peut être bien de voir quand même la théorie de ça, de pas être complètement perduAprès passez pas non plus des heures pour essayer de le maîtriser à la perfection parce que c'est plus du tout utilisé
00:04:23 :Et après en fait ce qui est intéressant c'est que c'est quand même la même syntaxe qui est utilisée si je ne me trompe pasQuoique non en fait c'est la même syntaxe entre format et les f-strings mais ça c'est encore vraiment des trucs différentsLà oui vous voyez on a le 10s, je vais grossir un petit peu, on a le pourcentage 10s alors que là c'est une syntaxe différente
00:04:48 :Donc la plus importante c'est vraiment la syntaxe de format qui comme je vous dis est pareille avec les f-stringsDonc comme ça vous apprenez la syntaxe et vous la savez pour les deux façons de faireEt comme je vous l'avais mis aussi sur le, est-ce que c'est celui-là cet article ?
00:05:04 :Oui c'est ça, c'est une question qui était revenue aussi sur le Discord, l'avantage de format sur les f-stringsIl y a quand même, il y a beaucoup de gens qui pensent que format sert plus du tout à rien et c'est pas vraiIl y a quand même un cas de figure dans lequel c'est intéressant c'est quand vous avez des templates que vous voulez utiliser, réutiliser et modifier
00:05:22 :Dans ce cas là comme le f-string va être évalué directement, vous pouvez pas faire ça avec un f-stringVous êtes obligés d'avoir déjà des valeurs alors qu'avec le format vous pouvez mettre des placeholdersComme on dit en bon français, je trouve jamais le mot pour ça, des trucs en attente d'être remplacés on va dire
00:05:39 :Que vous pouvez ensuite insérer comme ça avec la méthode format ce qui n'est pas possible de faire avec les f-stringsDonc ça c'est vraiment le truc le plus importantEt après si je reviens sur tous ces trucs là, je sais par contre que dans le Toza j'ai déjà vu des questions un petit peu là-dessus
00:05:58 :Alors là ça fait partie des trucs un petit peu chiants pour le Toza vu que vous avez pas le droit d'aller chercher sur Google etcDonc c'est bien si vous pouvez les retenir un petit peu par coeur, il y en a quand même pas malCelle là je sais que je l'ai vue, le .5, après c'était dans une question à choix de réponse
00:06:16 :Donc vous voyez ça aide quand même, vous avez pas forcément besoin d'être à fond par coeurJuste de savoir que vous pouvez formater comme ça et couper un mot avec le .5
00:06:26 :C'est quand même bien de le savoirAprès voilà il y a des choses, conversion, les floats ça peut être pratique aussiDonc voilà ça c'est le genre de petit truc qu'il faut apprendre un petit peuAprès au pire si vous avez une question là-dessus, je sais pas s'il y a une question de Toza où il demande ça
00:06:43 :Bon c'est un peu couillon et puis c'est pas trop grave si vous loupez cette question là-dessusAu pire vous perdrez un point là-dessusMais voilà ça peut valoir le coup de quand même apprendre les principalesEt après pour le reste est-ce que vous avez des questions sur tout ce qui était chaîne de caractère de ce que vous aviez vu
00:07:00 :Ou est-ce que c'était assez clair quand même dans ce que je vous avais mis iciAh oui il y avait les exercices aussiMoi je trouve ça clair pour ma part, après il faut manipuler, il faut vraiment s'entraîner je pense pour ma partPour retenir en tout casCe qui est important aussi c'est effectivement au-delà de tous ces petits trucs là
00:07:28 :Qui comme je vous dis si il vous demande l'accent circonflexisteBon ça c'est des trucs un petit peu même pour la question si vous l'avez c'est bien de le savoirMais dans votre vie professionnelle ça sera pas forcément super utileVous ouvrez le site et puis vous trouvez comment faire
00:07:42 :Par contre tout ce qui est manipulation, si je reviens sur les exercicesLà il y a beaucoup tous ces exercices làAu-delà du côté un petit peu algorithme où il faut trouver comment faireC'est vraiment important là par contre de bien maîtriser toutes les méthodes de baseParce que ça c'est des trucs où si à chaque fois que vous voulez remplacer quelque chose dans une chaîne de caractère
00:08:01 :Vous ne vous souvenez plus que c'est replaceEt que vous devez aller faire une recherche sur GoogleLà c'est pas le genre de truc que vous êtes censé faireIl faut quand même bien maîtriser tous ces trucs làParce que manipulation de données on fait ça très souventDonc tout ce qui est la méthode join par exemple aussi
00:08:16 :Donc pour joindre des éléments, le split pour faire l'inverse, pour séparerLes slice bien important aussi, donc récupérer un élémentBien voir aussi dans les slice, le début, la finC'est aussi des trucs qui je crois sont dans le tosaEt ça ne m'étonnerait pas que ça le soit aussi
00:08:33 :Avec des choix de réponse, de vous dire voilà si on a un crochet 2.4Est-ce que ça va prendre sur Python, est-ce que ça va prendre PYT ou PYTHDonc est-ce que ça va être inclusif ou exclusif, ce genre de choses làC'est aussi important de bien les maîtriser
00:08:46 :Ok, donc je vais voir le chat justeOuais après c'est ça, donc le secret c'estJe pense que c'est bien aussi pour ça de faire les exercicesEt de les refaire, les refaire, les refaireMême si justement au bout de la troisième foisVous n'aurez plus besoin de vous embêter avec l'algorithme
00:09:05 :Vous l'aurez déjà vu donc vous allez savoir où allerEt c'est juste, ah oui je ne me souviens plus exactement le nom de la fonctionDonc à force de le faire vous allez trouverEt oui effectivement Alain ici, Albert, pas Alain, excuse moi je me suis trompéJ'ai juste le pseudo là
00:09:21 :Ouais puisque toi t'as beaucoup d'expérience sur notre langage si je ne me trompe pasDonc ouais effectivementNotre langage ouais, et là c'est bien plus galèreC'est galère, c'est pas plus ou moins que pour ceux qui ne savent pasMais c'est galère quand tu pratiquesParce que ils n'inventent pas la roue
00:09:37 :Donc tout le monde essaie à peu près pareil au finalEt donc ouais c'est un peu hardOuais il faut désapprendre un peuJe sais par exemple si tu fais du javascript sur les splits, les joinsC'est effectivement un peu pareil mais pas exactementPareil sur tout ce qui est typage
00:09:56 :Donc qu'est-ce que tu peux faireIl y a plein de trucs qui sont effectivement un tout petit peu différentsEt ça effectivement à la limite c'est plus un frein qu'autre choseDonc ouaisEt surtout dans un cadre d'examen j'ai envie de direParce qu'effectivement quand tu ne peux pas regarder
00:10:12 :Quand tu ne peux pas aller chercherAu pire au début tu vois quand tu apprendsTu vas chercher, tu ne te souviens plus de la syntaxeTu perds un peu de temps au débutAprès c'est ça aussi le but justementC'est que vous soyez de plus en plus efficace
00:10:22 :Et que vous ayez de moins en moins besoin d'aller chercherPour des petits trucs comme çaOuais et puis la télé-senseTu vois la télé-sense mine de rien elle t'aide au finalQuand t'es dans des bons IDEOuais ça c'est sûrNon c'est sûr et ça tu l'as aussi
00:10:40 :Attends je regardeSur dans l'éditeur de code sur TozaIl y a une autocomplétion qui n'est vraiment pas incroyableMais qui est quand même là si je ne me trompe pasJe dis qu'elle n'est pas incroyableParce que je crois que c'est le genre de trucOù si elle apparaît une fois
00:11:00 :Si vous mettez le point aprèsIl vous met une liste de trucsOù je ne suis même pas sûr justement qu'il vous la mette de baseÇa fait partie des choses que je vérifieraisPour qu'on fasse un petit pointAvant que vous passiez la certification finaleParce que je crois qu'il faut faire contrôle
00:11:15 :Ou commande là ça dépend Mac, LinuxPour la déclencherDonc je suis quasiment sûr qu'elle est làMais c'est ça il faut savoir comment la déclencherPour l'avoirEt puis après souvent il faut utiliser DIREt puis un petit print pour afficher tout çaLà aussi pour l'aideDIR help
00:11:32 :En n'ayant pas cette aide de documentationOu d'internet en généralAlorsOn va commencer avecJe vais grossir un petit peu mon IDEJ'espère que ça ne va pas planterLe zoom me fait planter une fois sur deuxOk on va essayer175 ça devrait être assez grosDites moi si ça vous va
00:11:56 :DoncOn va voir ces trois trucs làÇa c'est un problème que Gab a eu aujourd'huiEt un problème assez spécifiqueQu'on en parlait là avant que tout le monde arrive un petit peuIl faut vraiment vraimentLe rencontrer ce problèmePour voir clairement ce que ça faitEt je pense que Gab l'a bien vu
00:12:17 :Il connaissait le problèmeIl l'a vu une première foisJ'ai expliqué pourquoi ça ne marchait pasIl a vraiment fallu en faitTester dans différentes conditionsEt puis vraiment faire les choses pas à pasPour voir clairement quel était le problèmeEt dans quelles conditions il arrivaitOn va voir le ease et égal aussi
00:12:33 :Ça fait partie des choses qui sont assez simplesMais qui sont des trucs assez classiquesDans les questions d'examenEt aussi quelque choseCopier une liste, les erreursÇa c'est quelque chose qui est un peu plus globalOn y reviendra aussi pas malC'est toutes les erreursQu'il peut y avoir sur
00:12:50 :Sur la façon dont est gérée la mémoireOn en a parlé un petit peuOn a eu une grosse discussion làAu début de la semaine dans discussion libreSur le DiscordAvec justement les...
00:13:01 :Parce que tout au début de la formationPour ceux qui l'ont suiviJ'explique justement la fonction IDLe Small Integer CachingLe fait qu'il garde un espace en mémoirePar défaut pour certains élémentsEt après il y a toutes les questionsDes objets muables, immuablesDonc on va commencer à avoir un petit peu ça
00:13:17 :Pour vous mettre dans le bainEt puis on y reviendra régulièrementParce qu'il y a plein de cas de figureDans lesquels ça peut poser des problèmesEt on va voir pas mal d'exemplesJuste une petite introduction à çaEt si on a le tempsOn va aussi faire quelques exercices
00:13:32 :J'en ai prévu quelques-uns justementJ'en avais troisOk, j'en ai perdu unCelui-là, avec les défauts le dicteIl est assez intéressantParce que ça c'est une question TosaAlors oui, ça je vous l'avais mis aussiJe sais plus si vous l'avez tous vuJ'ai commencé à ajouter des exercices
00:13:48 :Que j'ai vus du coup sur les TosaSur vos exemples là pour l'instantSur vos évaluationsParce que j'ai pas accès à toutes les questions TosaDonc là pour l'instant j'en ai mis huitIl y en a encore un petit peu qui manquentIl y a Lofti qui s'est déconnecté
00:14:13 :Ok c'est bon, il est revenuDonc c'est des questionsVous les avez iciJe vais continuer à en rajouterIl y en a encore peut-être 5 ou 6 que j'ai vusDonc il y a un filtre Tosa pour les afficherIl y a la fameuse question sur les graphes
00:14:28 :Qui a fait mal à la tête à tout le mondeEt il y en a d'autres qui sont un peu plus facilesDonc on va en voir quelques-unes aussiDonc notammentDonc celle-là avec les défauts le dicteElle est assez simpleMais je sais que moi personnellementJe me plantais toujours aussi
00:14:42 :Parce qu'il y a un petit twistSur la façon dont il faut donner la valeur par défautEt celle-là elle est intéressante aussiParce que justement il y a plein de façons de la faireEt il y a une façon un peu plus efficaceQue je vais vous présenter
00:14:55 :Donc ça va pour tout le monde ?Oui ça vaOk superN'hésitez pas à m'interrompreSi vous avez des questions sur quoi que ce soitQue je vais vous montrer iciAlors le truc sur copier une liste les erreursDonc on va faire des exemples très simplesDonc je vais faire une liste là
00:15:18 :Avec rien dedans justementEt donc l'erreur que fait tout le mondeC'est de ne pas justement comprendreCe qui se passe en arrière-planNotamment avec les objets muablesEt en fait pour même aller au-delàQu'est-ce qu'une variable ?
00:15:32 :Parce qu'on a l'impressionQu'une variable en fait c'estJustement on ne sait pas trop ce que c'est forcémentEt en fait j'explique dans les formationsJustement j'ai pris beaucoup de tempsPour essayer de bien expliquerCe que c'est précisémentDonc pour ceux qui ont vu les formationsÇa va peut-être vous rappeler des choses
00:15:46 :Mais ce qu'il faut bien comprendreC'est que c'est un nom qui est rattachéA un objet qui est dans la mémoireEt ces noms on peut en avoir plusieursDonc là je n'ai pas mes schémasMais je vous renvoie justementQuand j'explique les variables dans la formationSi vous voulez le voir
00:16:02 :Je ne sais pas si quelqu'unQui est familier avec çaPeut prendre deux secondesPour mettre le lienS'il le retrouve sur le siteDans le chatParce que je montre ça justementAvec des schémasAvec des petites flèchesOù vous voyez bien justementQue vous pouvez avoir plusieurs noms
00:16:14 :Qui sont reliés à un objetDonc là on va le faire dans l'idéeEt ça aide des foisDe l'avoir de façon visuelleDonc là le problèmeC'est que du coupSi je fais ce qu'on fait généralementLe truc classiqueDe dire je veux créer une autre listeJe veux dupliquer ma liste d'origine
00:16:29 :Et l'avoir dans une autre variablePour par exemple faire autre choseDonc c'est des cas de figures assez classiquesPar exemple vous avezVous prenez une liste d'étudiantsEt vous voulez les séparer en plusieurs groupesDonc vous avez par exempleTous les étudiants de votre siteEt puis après vous voulez avoir
00:16:44 :Les étudiants TosaLes étudiants qui ne sont pas TosaEt du coup vous allez partir d'une listeEt après vous allez créer deux autres listesQue vous pensez aller dupliquer comme çaDe cette façon, copierEn faisant juste une assignation B égale AEt le problème que ça va faire
00:17:00 :C'est que là dans ce cas-ciEn faisant ça on va avoirDeux noms qui vont pointer vers le même objetDonc cette liste iciElle va être dans la mémoireEt en faisant B égale AOn dit que B va pointerVers ce même objet en mémoire en fait
00:17:13 :Et le problème qu'on aC'est que du coup si on commence à modifierUn objet ça va aussi modifier l'autreDonc ça c'est l'effet de bord classiqueVous voyez même Copilot me le metJe vais peut-être le désactiver d'ailleursJe sais pas si ça va pas m'embêterMais en fait c'est ce qui se passe
00:17:27 :Donc là je vais l'exécuter pour vous montrerMais vous voyez que là en affichant BOn a 1 qui s'afficheDonc ce qui nous semble pas normalEt après si on fait la même chose avec BOn va ajouter 2 à BAprès on va plus loin dans le script
00:17:41 :Ajouter, je sais pas, bonjourEt après finalement on va afficher BEt afficher AEt là on lance et là on a exactement la même choseEt donc ça c'est le genre de trucBon là ça peut se voir quand on a quelques lignesComme ça mais souvent on est dans des scripts un peu plus complexes
00:17:55 :Et on a ces listes qui sont crééesA différents endroits et puis après on lanceNos scripts et là on a l'impression qu'on va filtrerNos différentes listes et finalement on se retrouve avec la même choseDans les deux listes et c'est là qu'on comprend pasDonc il y a
00:18:07 :Plusieurs façons de régler ce problèmeLa façon la plus simple c'est justeDe mettre un 2 pointsIciOk j'ai un doute là maintenantNormalement juste un 2 pointsPour faire un range completAlors attendezBon alors attendezLà j'ai un gros blancNormalementOuiNon je veux pas le moins 1
00:18:33 :Normalement si je mets juste 1Alors làJ'ai 1 blancLà quelqu'un va meDébugger, quelqu'un comme GabOu Simon qui ont vu çaAlors parce qu'après on peutUtiliser copy et deep copy c'est le truc que je voulaisVous montrer après mais qui est un peu plus complexe pour faire
00:18:51 :Des copiesGabTu quoi ?Non j'allais regarder maisIl y a ma fille quiOui non t'inquièteParce qu'après on peut faire des slidesAh oui nonLe problème c'est que là en faitJe le fais sur la liste d'origineJe me disais bien, j'étais absolument sûrQue j'avais la bonne syntaxe
00:19:15 :Le problème là c'est que je le fais sur la liste d'origineJe l'ai créé donc en fait c'est pas là qu'il faut faire çaIci on va faire A et on va mettreLes crochets et on va mettre 2 pointsJe suis pas fouDonc là en fait si on fait
00:19:27 :Print B et si on ajoute quelque chose dans A iciEt que je lance cette fois ci B vous voyezIl est videDonc on a ajouté un élémentDonc on a ajouté unUn élément dans A mais BN'a pas été modifié parce que là en faitQuand on utilise cette syntaxe
00:19:43 :On fait ce qu'on appelle un sliceEt donc le sliceEn fait ça nous permet par exemple si j'avais1, 2, 3 ici je pourrais direTu récupères du débutJusqu'à 1 et donc là si je fais justeUn print de B vous voyez que j'ai justeLe premier élément et donc
00:19:59 :Là le slice il faut vraiment le voirC'est ce que je vous disais il y a quelques instantsÇa c'est important de savoir à quel pointC'est exclusif, inclusif, exclusifEt ça pour toutes les choses que vous faitesC'est pareil avec le rangeSi vous faites range de 10 il faut savoir que ça va aller
00:20:13 :Jusqu'à 9 si je ne me trompe pasParce qu'on commence à 0 donc on va créer 10 élémentsDonc on va faire 0, 1, 2, 3, 4, 5, 6, 7, 8, 9Ça fait 10 éléments donc le 10 ne sera pasCompris dedansPareil avec random si vous faites
00:20:25 :Random.randint si je fais 1, 3Est-ce que le 3 est inclus dedansJe ne sais même plus de têteIl y a des trucs importants à retenirOui il est inclusOk merciParce que ça je l'ai vu aussi passer dans les questionsDonc là encore pas des trucs très compliqués
00:20:41 :Mais c'est bien de les savoir par coeurDe les revoir un petit peu, vous faites une petite noteEt puis la journée avant l'examenVous vous remettez ça dans la tête pour être sûrDonc là avec les sliceOn s'arrête en faitA cet indice donc on commence à 0
00:20:55 :Je pourrais mettre le 0 ici aussiEt ça fait la même chose mais quand on commence à 0On peut le mettreDonc on commence à 0 et on s'arrête en faitOn s'arrête à l'indice 1Donc là je le metsEn tant que piloteDonc là on a l'indice 1 et on ne va pas plus loin
00:21:11 :Donc si je mets 2On va prendre lui, si je mets 3On prend tous et si je mets 4Si on va en dehors de la plageÇa ne cause pas d'erreurC'est pratique avec les sliceJe pourrais mettre 1000 ici et il va juste allerAu delà et il ne va pas me créer d'erreur
00:21:27 :Je peux faire dans l'autre sens aussiJe crois que dans l'autre sens par contre si je metsMoins 5 dans l'autre sens ça marcheDonc on peut mettre moins 1 par exempleEt là dans ce cas-ci vous voyez qu'on va reculerDonc on va prendre moins 1 et on va prendre juste les 2 premiers
00:21:39 :Et donc c'est pour ça que si on ne fait rienSi on met juste les 2 pointsEt qu'on lance, on va récupérerTous les éléments du début à la finParce que là encore je pourrais mettre3 du coupSi je ne me trompe pas 1, 2, 3 ça devrait prendre les 3
00:21:53 :Oui c'est ça, je pourrais prendre le 3Ou mettre l'n de AC'est ce qu'on fait aussi au début quand on ne sait pas tropOn met la longueur de la listeEt là justement ça nous permet d'avoir quelque chose de dynamiqueMais la façon la plus simple finalement c'est de rien mettre
00:22:05 :Et par défaut comme ça il va commencerDu début et il va aller jusqu'à la finVous pouvez aussi mettreSi je ne me trompe pas comme ça les 2 pointsPlusieurs fois, là pareil ça va faire la même choseEt ça va faire une copie aussiDonc si je fais A.append de 1 ici
00:22:19 :Et que j'affiche B, là vous voyez que B n'a pas bougéDonc vous avez ces 2 façons de faireSoit juste les 2 pointsSoit les 2 points et là encore vous ne mettez rienPourquoi on peut mettre 2 foisLes 2 points comme ça ? Parce qu'on peut mettre un début
00:22:31 :Une fin et un stepDonc là si je mets par exemple, on va continuer6, 7, 8Tu commences au début, tu vas jusqu'à la finMais je fais un step de 2Si je lance, là vous voyez qu'on saute un élément à chaque foisJe peux faire aussi quelque chose
00:22:45 :Qu'on fait très régulièrementPour copier une liste et l'inverserC'est de mettre 2 points, 2 points, moins 1On va copier la liste mais on va passerOn va mettre un step négatifDonc là il faut juste le voir comme si on partait de la finDonc plutôt que de sauter un élément sur 2
00:22:59 :Ou sur 3 ou sur 4On va sauter un élément en revenant de la finEt là comme on met juste 1Si je mets 1 dans ce sens làOn va tout récupérer, si je mets moins 1On va tout récupérer dans l'autre sensSi je mets moins 2, on va tout récupérer dans l'autre sens
00:23:13 :Mais en sautant un pas de 2, etcDonc c'est très pratique les slides pour çaVous voyez on peut vraiment s'amuserTu commences là, tu vas jusqu'au 4Et t'en skippes 2, et là on aura 1 et 3, etcDonc ça c'est la façonLa plus classiqueLa plus facile à retenir, vous mettez juste les crochets de points
00:23:29 :Sur votre variableEt ça va tout simplement faire une copieVraiment une vraie copie, donc vous aurez 2 objets en mémoireEt pour voir cette place en mémoireOn peut utiliser idEt ça c'est vraiment la façonLa façon sûre de vérifierOù sont vos objets en mémoireDonc là si je relance, on voit qu'on a 2 id différents
00:23:47 :Et si je fais juste le a comme çaOn va voir qu'on a le même idDonc ça c'est vraiment parce qu'on ne peut pasOuvrir notre ordi pour allerVoir où sont les variables dans la mémoireDonc c'est vraiment grâce à cette fonction idSi vous n'êtes pas sûr ou si vous voulez
00:24:01 :VérifierQue l'on manipule un objet différent ou pasParce que des fois aussiLà on fait des exemples assez simplesMais des fois vous pourriez avoir justementPlein de manipulations, des copiesDes recopies, mélanger des choses ensembleEt des fois ça devient un petit peuQuand on a des lignes de code un peu dans tous les sens
00:24:19 :C'est pas forcément évidentSans aller repasser dans tout votre scriptPour vérifier où est-ce que vous faites les copiesDe voir si c'est le même objet ou pasDonc ça peut être pratique des fois de ne pas s'embêterEt dire ok là je suis plus sûr, je fais un id
00:24:31 :Je vais regarder si les id sont différentsEt si c'est pas le cas vous pouvez refaireUne copie comme ça pour vous assurer de bien dissocierLes deux et d'avoir des objets différentsEn mémoireÇa va jusque là ?
00:24:43 :C'est beau mais peut-être qu'il faut mentionnerQuand même que même si c'est des id différentsC'est des copies superficiellesÇa veut dire que si dans le AUn des trucs qui est contenuC'est une liste, du coupIl peut y avoir des effets de bord, non ?
00:24:57 :Quand on fait une copie comme çaOui alors effectivementTu me tends la perche pour faireLe lien avecCopy, deep copyC'est que effectivementEt ça c'est un effet de bord très vicieux aussiEt oui WilliamId c'est la mémoire, ça te montre unInteger qui te montre
00:25:17 :En fait l'identifiantDe ton objet dans la mémoireEt donc làCe que dit Simon en faitC'est que si on met une liste à l'intérieurDe çaDonc là comment vous montrerÇa de façon claireJe vais mettre une listeIci etOn va faire çaDonc là vous voyez j'ai une liste
00:25:41 :À l'intérieur de ma listeJe copie avec cette façon de faireMon élément, par contre aprèsJe vais faire A et je vais prendre le premier élémentEt là je vais lui faire un appendOn va mettre 5Et là je vais printer BEt je lance et là on voit que B vous voyez
00:25:57 :A aussi ce 5À l'intérieurAlors là c'est ce que disait SimonC'est l'effet de bord inattenduParce qu'on se dit bah merde j'ai bien utiliséCette façon de faire avec les deux pointsDonc normalement j'ai un objet différent en mémoireSauf que là ça a effectivementCréé une copie uniquement au premier niveau
00:26:15 :DoncLa liste que vous avez iciEt ça marche aussi si je fais un C à la placeLà je mets une liste directementMais si je mets le C iciEt que du coup je fais C.append
00:26:27 :De 5, on a la même choseDonc si on veut faireDes copies vraiment récursivesC'est ce que vient de dire GabDans le chatÇa c'est une question qui est surJe l'ai pas vu, ah si j'ai vuDes questions surJe crois que j'ai vu des QCM sur copie
00:26:45 :C'était des questions assez simplesAvec pas trop, il fallait juste choisir la bonne réponseSur le TozaMais je l'ai mise moiSur Doctrine dans tous les tests que vous avez de disponiblesParce que je la trouveImportante, je crois que je l'ai misePlusieurs fois avec des fois un QCM
00:27:01 :Des fois des exercices de code à faireParce que là effectivementOn a deux autres façonsDe faire une copie, c'est d'utiliserJe ne me souviens jamais justementC'est from copyOn a deep copy et on a tout simplementCopy, si je ne me trompe pas c'est çaÇa fait partie de ces modules qui ont le même nom
00:27:19 :Pour le nom de la fonction et du moduleC'est comme date timeDate time qui se répète 15 foisDonc là copyDeep copy et copyDonc ça nous permet de faire une copieEt la différence entre le copy et le deep copyDonc le copy c'est exactement comme ce qu'on fait ici
00:27:35 :Si je fais une copieComme ça de AEt que je relance le script, là vous voyezOn a rien qui changeDonc on a fait une copie à ce niveau làC'est à dire que si je faisA.append
00:27:49 :15 par contreLà vous voyez queJe vais faire un print de ALà vous voyez on a bienUne différence qui commence à se faireDu coup le A auquel on a ajouté 15Donc là on a bien le 15A la fin du AEt ensuite dans le C on ajoute le 5
00:28:07 :Et là du coup il se retrouve que le C n'a pas étéCopié lui de façon récursiveLe C il n'a pas bougéEt du coup à la fois dans le AEt dans le B on se retrouve avec la liste CQui est modifiéeDonc ça c'est quand on utilise copy
00:28:21 :Ou quand on utilise leCrochet comme ça. Quel est l'intérêt de copyVous allez me dire du copyC'est que ça marche surDifférents types d'objets. Là je vous ai montré
00:28:31 :Sur des listes mais on pourrait avoir la même chose sur des dictionnairesSur des setsSur plein d'autres types de donnéesComme ça. Donc là je vous ai montré
00:28:39 :Pour la liste cette façon de faire rapideSi vous avez une liste sansUn briquet dedansDe la copier. C'est plus rapide que d'importerLe module et de faire un copy comme çaPar contre là où ça fait une vraie différenceC'est avec le deep copyDonc là si je fais un deep copy de A et je relance
00:28:55 :Vous voyez que cette fois-ci on a bien une différenceParce qu'on va faire une copie non pas juste du premierNiveau mais de tous les éléments qui sont dedansMême si on en rajoute après on peut en faire autant qu'on veutIci. Si je remets une liste à l'intérieur
00:29:05 :De ça et que voilà on va faire unExemple un petit peu plus pousséEt que là du coup je prendsLe C crochet 0 et que je lui fais un appendDe 4 comme çaLà je relance et vous voyez queDans le premier cas on a bien le 4
00:29:19 :Qui a été rajouté dans leA. Donc dans la liste à l'intérieurDe la liste qui est dans le C. Donc là vous voyezOn plonge inception stylePar contre dans le BLà vous voyez qu'on a bien fait des copiesDes copies des copiesDes copies des listes qui sont dans les listes dans les listes
00:29:35 :Et donc la liste à l'intérieur de la liste qui est dans la listeElle est uniqueEt on peut la modifierIndépendamment et ça va pasModifier les autres objetsAlors Arnaud là c'estA toi de voirJe ne saurais pas te dire en termes deProbablement qu'il y a des
00:29:55 :J'allais dire en termes de performanceProbablement qu'en termes de performance il y a des différencesDonc c'estSouvent ça qui faitLa différence justementEntre est-ce que tu veux utiliser une façon de faire une autreParce que là forcément si tu faisUn deep copy j'imagine quePeut-être que si t'as qu'un niveau
00:30:13 :Que tu utilises copy ou deep copyÇa va pas changer grand chose niveau performancePar contre après effectivement si t'asPlusieurs niveaux après c'est à toi de voir aussiQu'est-ce que ton script a besoin de faireJe dirais pasTu vois qu'il faut utiliser tout le temps l'un ou l'autre
00:30:27 :En fait il faut être conscient comme d'habitudeDe quelles sont les implications de l'un et l'autreEt après en fonction de ton scriptÇa sert à rien d'utiliserUn truc qui est tropQui va faire des choses finalement dont t'as pas besoinParce que comme je te dis finalement
00:30:41 :Sur une liste de un milliard d'élémentsSi deep copy finalementIl fait un truc plus poussé en parcourantLa liste deux fois pour copierMême si elle est qu'à un seul niveauFinalement tu vas impacter tes performancesPour quelque chose dont t'as pas besoin au débutDonc voilà il faut plus être conscient de ça
00:30:57 :Et après utiliserLa bonne façon de faire en fonctionDe ton cas de figureC'est bon pour çaJ'espère que je vous ai pas trop perduAvec les listes dans les listesLà il y a beaucoup de petits trucsJe vais vous garder le code là sous le coude
00:31:13 :Comme ça vous pourrez le retrouverIciJe vous remettrai tout ça sur un githubComme l'autre fois dans les sourcesEt ça je vais le mettre avecComme çaDes questions ?
00:31:27 :Sur tout ça c'est bon ?OkDoncCelui là c'est bon, on continueCelui là est plus simpleL'égalité avec is égale c'est une question que j'ai vueC'est quelque chose qui est aussiTrès important là pour vousC'est quelque chose quiLà encore il y a des vidéos sur docstring
00:31:51 :Merci ArnaudArnaud a mis l'URLSur le sitePour la sessionDont je parlais avec les graphiquesPour voir les objets en mémoireDonc là c'est pareil sur le site il y a des sessionsQui reviennent sur la différenteDonc si vous voulez revoir les sessions théoriques c'est possible
00:32:09 :Mais voilà je me disais que c'était bien de le voirParce que là encore c'est un peu lié à çaEt c'est une questionPlutôt que je vois très souventDonc is, quelle est l'utilité de is ?
00:32:19 :C'est de faire une vérificationNon pas entre les valeursMais justement entre les objetsDonc finalement le is qu'est-ce qu'il va vérifier ?Il va vérifier si la valeurQui est retournée par le nombreQue nous retourneId est-ce qu'il est le mêmeFinalement c'est ça qu'il va faire, moi j'aime bien le voir comme ça
00:32:37 :Parce que généralementOn voit id, on voit que ça nous retourne un nombreEt quand je dis isÇa permet de voir si c'est le même objet en mémoireDes fois c'est un petit peu abstraitFinalement c'est un peu ça que ça va faireLe symbole d'égalité sur l'identifiant des objets
00:32:51 :Alors pour l'instant c'est peut-être un peu abstraitJe vais vous montrer, par exemple si je dis quea égale 10 et b égale 10Et là si je fais print a is bJe lance, là on a trueAlors dans ce cas là effectivementÇa fait écho à ce que
00:33:05 :OuiC'est donc les small integral cachingParce que justementParce que comme c'est des petits nombresPour des raisons d'optimisationPython vaN'assigner qu'un espace en mémoireEt comme c'est des valeurs qui sontImmuables, qu'on peut pas modifierIl peut le faire et ça va pas poser problèmeÇa va pas poser potentiellement les problèmes justement
00:33:27 :Qu'on a vu avec les listes, parce qu'avec un objetMuable, un objet qui peut changerIl peut pas se permettre de faire ça, parce que si il se ditBon ok c'est des listes vides, ça prend pas beaucoup de placeDonc je vais mettrePour a et b le même objet en mémoire
00:33:39 :Bah là on va se retrouver avec les effets de bord qu'on aAvec une liste qui est modifiée et l'autre qui se retrouveImpactée. Donc là ça marche
00:33:45 :Parce que c'est des objets immuables qu'on peut pasModifier, donc pour lui çaÇa lui permet d'économiser de la mémoireDe directement dire queL'identifiant, enfin queL'objet est le même et comme çaOn a qu'un seul objet en mémoire plutôt que deuxEt quand on veut accéder à a ou b il nous retourne le même objet
00:34:01 :Et là effectivementDonc pourquoi ça nous retourne trueParce que si je fais, et c'est pour ça que je dis que c'estIntéressant de voir dans ce cas-ciDu coup l'identifiant de a et bSi je lance ça on voit qu'effectivement on a le mêmeIdentifiant. Donc qu'est-ce qu'il va faire
00:34:15 :En fait il va vérifier si lesValeurs sont égales et si je faisa égale égale b, quand je disLes valeurs c'est les valeurs des identifiants avec easeSi je fais a égale égale bÇa va être la même choseOn va avoir true, là parce queIl me montre les valeurs
00:34:31 :Par contre si je mets 11, là on va avoirFalse, dans ce cas-là aussiÇa va être false avec le ease parce queComme on a deux valeurs différentes là on va avoirDeux objets différents en mémoire maisLà voilà il va comparer les valeurs et non pasLes identifiants. Alors pourquoi c'est
00:34:45 :Important tout ça, alors il y a une questionOui effectivement Arnaud il le fait aussi pourLes chaînes de caractère, je vais en reparlerVite faitJe vais juste finir là-dessus parce que làJe vous mélange peut-être un petit peuDoncL'égalité des valeurs, donc si je metsDes listes par contre ça va être plus parlant avec des listes
00:35:05 :Donc je vais créer deux listes différentesLà je relance, là vous voyez queOn a true et pourtant siJe fais un print de a is bCette fois-ci, on va avoir falseDonc là on a une différence, là on a le aIs b qui est false et le a égale
00:35:19 :Égale b qui est true, parce queSur les identifiants vous voyez qu'on a deuxIdentifiants différents parce que comme je vous ai ditIl peut pas, même si c'est des listes videsIl va pas créer un seul objet en mémoireAvec des noms différents qui vont pointerVers le même objet, par contre
00:35:33 :Au niveau des valeursLà on a la même chose, c'estExactement le même objet en tant que valeurOn a une liste videEt si je mets un et un là-dedansEt que je relance, c'est la même chose, on a exactementLes mêmes valeurs qui sont contenues à l'intérieur
00:35:47 :De notre objet et donc on aLe a égale égale b qui est égaleA true, donc c'estLa différence entre les deux etSi par contre là justementPar rapport à ce qu'on a dit toutA l'heure, si je remets ma listeVide ou non, je pourrais mettre un aussi dedans
00:36:03 :Et que je fais b égale aLà je relance et là on vaAvoir true pour le a Is bParce que justement on a le mêmeObjet et on le voit là encore avec l'identifiantOn a le même objetEn mémoire, on a a et bQui pointent vers le même objet, ce que nous montre
00:36:19 :L'identifiant, donc a Is b ça veut dire queL'objet a et l'objet bSont les mêmesEtSont les mêmes, pointent vers le mêmeObjet en mémoire du coupEt ça c'est quelque chose qu'on voit aussiAvec ce qu'on appelle les singletonLes singleton c'est unConcept en programmation
00:36:39 :Ca permet de créer des objetsQui sont uniques en mémoire, donc on en a plusieursQui sont créés par défautQui avec Python sont des singletonOn a notamment none, c'est à dire queIl n'y en a qu'un seul dans la mémoire de PythonVous ne pouvez pas créer plusieurs objets none
00:36:53 :Vous n'en aurez toujours qu'un, là encoreParce que ça permet d'économiser de la mémoireVu que c'est un objet qui est assez génériqueEt qu'on n'a pas besoinDe le manipuler ou de faire quoi que ce soitComme des listes ou des dictionnaires, c'est plus pratiqueD'avoir un seul objet none en mémoire
00:37:07 :Et que après partout dans notre script quand on utiliseCe none, c'est le même objet qui est utiliséDonc là si je fais a égale noneQue je faisListe égale noneQue je fais des fonctionsQuoi que ce soit à l'intérieur d'un paramètreOu quoi que ce soit qui est égal à none
00:37:23 :A chaque fois si je fais a is listLà vous voyez qu'on a trueEncore une fois parce que ça va être le même objet noneA chaque foisEt si je fais a is noneLà aussi on va avoir true parce queA est effectivement la même chose que none
00:37:37 :Puisqu'il n'y a qu'un seul objet comme ça en mémoireÇa c'est quelque chose que vous pouvez faire aussiC'est ce qu'on appelleLes patrons de conceptionOui c'est çaLes singleton c'est à dire que vous pouvez vous mêmeSi vous avez cette question qu'est ce qu'un singletonDonc un singleton c'est un objet unique
00:37:53 :Qui est utilisé, un exemplePlus parlant que le none justementDont on s'occupe pasC'est par exemple les bases de donnéesDonc si vous faites un objet pour une base de donnéesVous voulez pas à chaque fois avoir plusieurs objetsEt ouvrir plusieurs connexionsVous allez créer une classe qui va être un singleton
00:38:09 :Qui va vous assurer queA chaque fois que vousRéaccédez à votre base de donnéesVous allez récupérer l'objet qui existe déjàDonc ça c'est assez facile à faireQuand vous créez votre classe vous allezGarder une référence vers l'objet s'il a déjà été crééDonc la première fois vous gardez une référence vers l'objet
00:38:25 :Et la prochaine foisOù on accède à cet objetSi on trouve la référence dans la mémoireEt bien on retourne tout simplement la référenceEt si on la trouve pas et bien on crée l'objetDonc la première fois ça va créer l'objetParce qu'on trouvera pas la référence et les fois d'après
00:38:39 :Ça va juste renvoyer ce qui a déjà été crééDonc ça évite comme çaC'est un mécanisme qu'on faitLà pour le coup volontairementPour éviter à chaque foisA l'inverse de si on faisait pas ce mécanismeA chaque fois qu'on appellerait à la classeVolontairement ou non on pourrait recréer
00:38:55 :Différentes instances donc là ça permet d'éviter çaMême si vous avez quelqu'unAttention ça va devenir tout noirComme dans un célèbre film françaisDoncC'est à cause de l'heureÇa se switch automatiquement désoléPeut-être que vous préférezDe base aussi le mode sombre je sais pasJe suis habitué maintenant au mode
00:39:15 :Clair en journéeDonc désolé j'ai fait une parenthèseOui voilà donc même siFinalement vous allez souvent garder une seule référenceÇa permet si jamais vous avez un développeurQui recrée une instance à partir de votre classeDe vous assurer que ça va quand mêmeRetourner l'instance qui existe
00:39:31 :Et pas en recréer unePour rienDonc ça va pour çaAh on a une questionOuiAlors je reviens effectivement à Arnaud surLa chaîne de caractèreAlors j'avais redécouvert çaC'était quoiSi je ne me trompe pas parce qu'effectivementIl fait la même optimisation pour certainesChaînes de caractère et à un moment
00:40:01 :Je pensais que c'était en fonctionDe la longueur et finalement j'avais découvertQue c'était pas le casEt que c'était si je ne me trompe pasLes types de caractère qui étaient dedansDonc si je ne me trompe pas si vous avez queDes trucs comme ça et peut-être des nombres
00:40:15 :Il va créer un singletonMais dès que vous mettez un espace ou un symboleOu quelque chose du genreLà il vaCréer desEndroits différents je ne sais plusSi il y a quelqu'un là qui s'en souvientJe crois que je l'avais rajouté dans les formationsJustement mais des fois on peut avoir
00:40:33 :Cette même chose aussi sur les chaînes de caractèreOùEffectivement il vaCréer le même objetEn mémoire en faitPour optimiser la mémoireOkEt pour lesSmall integral cachingCe concept là c'est que par défaut il vaAssigner des places en mémoire pour les nombres entre5 et 256 donc c'est pour ça
00:40:57 :Qu'on avait sur les nombresLe même identifiant alors qu'onAvait deux variables différentesEt ça ça va effectivement varier beaucoup en fonctionDe comment vous exécutez votre scriptEn fonction de laL'implémentationDe Python que vous utilisez, par défaut c'estPython mais vous avez d'autresImplémentations qui existent avec
00:41:17 :Je crois, je n'ai jamais revérifiéMais je crois qu'il y en a qui ont différentesFaçons de fonctionner là dessusSi vous exécutez votre scriptLigne par ligne effectivement comme l'a dit ArnaudEn fait il ne va pas avoir conscience de tout votreScript donc il y a des optimisations qu'il ne peut pas
00:41:31 :Faire contrairement à quand vous exécutezTout le script d'un coup où là il va se dire okJ'ai un objet qui est immuableEt j'ai la même valeur iciDonc je peux optimiser en créant un seul objet en mémoireParce que dans tout le scriptJ'ai analysé et ça ne va pas causer de problème
00:41:45 :Et ça voilà ça peutCauser des trucs comme ça qui font que des foisEn dehors de ce rangeDe moins 5 à 256 on va se retrouverAvec le même identifiant parce quePython va faire des optimisations en fonctionDe ça quand il a la vue sur tout le script
00:41:59 :Mais voilà il ne faut pas trop vous en faireC'est surtout ce qui est important de bien comprendreC'est sur des objetsMuables comme les listes, les dictionnaires etcEt dans les imbricationsQuand vous avez des objets dans des objetsIl faut bien comprendre que si vous modifiez un objet à un endroit
00:42:13 :Ca peut avoir des répercussionsA d'autres endroits dans votre code si vous faitesDes copies comme ça sans prendre ça en compteDonc effectivement la façon la plusSûreSouvent de gérer ça c'est d'utiliser deep copyParce que ça va faire des copiesEt des copies récursives donc vous êtes sûr d'avoir à chaque fois
00:42:29 :Tous les objets qui sont bien délimitésEt aprèsPour le is et le égalIl faut bien juste comprendre la différenceLe is on l'utilise un peu plus rarementC'est plus fréquent qu'on veuille vérifier les valeursOn utilise le égal égal du coup pour vérifierSi on a deux variables
00:42:45 :Qui par exemple je sais pas si on veut comparerDes prix, on a des prix différents dans deux variablesOn va vérifier si le prix est égalPar exemple avec çaC'est rare qu'on ait besoin de vérifierSi un objet est un autreEst égal à un autreOk
00:43:01 :Oui alors je vous ai effacé tout çaJe vais peut-être vous le remettreBon ça c'est je sais pas si j'ai besoin de vous mettreLe code pour çaComme je vous dis je vais le mettre comme ça au cas ouMais comme on va l'appelerOn va l'appeler
00:43:15 :EqualitiesMais ça comme je vous disRegardez les formations sur le siteÇa devrait faire le jobSi vous oubliez ce qu'il se passe là-dedansOkC'est bon pour ça ?
00:43:29 :Ouais c'est bon c'est parfaitJe sais pas si on m'entendOuais on t'entend super bienT'avais une question non ?Non ça c'est assez expliciteC'est assezIntuitif je croisOuaisNon c'est clairOk superÇa généralement ça va faut juste le voir une foisParce que souvent c'est plus ça
00:43:57 :C'est qu'on sait pas à quoi ça sertMais voilà une fois qu'on l'a vu c'est pas le plus compliquéMaintenant liste en paramètres par défautDonc je vais reprendreCe qu'on a vuLà avecC'était rigolo çaOuais c'était marrantOù est-ce qu'il est monHop ça doit être lui
00:44:17 :LuiNon c'est toujours pas luiOù est-ce qu'il est passé mon arcThibaudDu coup c'est vrai queJe disais par rapport au testParce qu'en fait quandAvec PyCharmQuand tu n'as pas la bonne pratique tu soulignesEt dans les testsSouvent je fais des assertsObjet is equal to
00:44:41 :Lui il te force à mettre un is who plutôtAlors tu faisVérification dans un testAvec attendsPour m'assurer que je suis bonTu fais par exemple assertTu vas avoir une valeurUser égale patrickEt tu vas dire userNonT'as un exempleJe regarde mon repo dans lequel j'utilise
00:45:05 :Oui ouiDans le dernier projetJ'ai pas eu à le faire comme çaJe vais en trouver unJe vais le ressortir en différéDans deux minutesOuais si tu peux me retrouver un exempleQu'on soit sûrQu'on ait un bon exempleParce qu'effectivement j'allais direSi t'as un is true
00:45:27 :Si t'as un is of ageIs authorizedÉgal à trueEffectivementSi tu fais is authorizedHopEt puis l'utilisateurEnfin leOui voilàOn peut mettre juste çaLà effectivementC'est parce que t'as aussiTrue, false, etcC'est la même choseC'est aussi des variablesDes singleton qui vont pas bouger
00:45:59 :C'est effectivementAssez rare qu'on ait besoinDe mettre égale égaleTu peux le faire mais alorsQu'est ce qu'il nous dit làEuhOui parce qu'en faitVu que c'est un singleton en faitTu vérifies juste avec ce singletonAprès ça va marcher normalementJ'essaie de vérifier je crois me rappeler
00:46:21 :Qu'il y a des cas de figureIl y a des cas de figure je revoisJ'en parle dans une formationNotammentQuand tu vas lire des valeursEuhAh putainJ'ai plus l'exempleAh je sais plusEuhJe sais pas si ceux qui ont vu les formationsIl y en a qui ont une idée de ce à quoi je parle
00:46:45 :Parce que je sais que j'ai un bon exemplePour montrer çaAvec la lecture d'un fichierOù justement on récupère une valeurEt quand on faitQuand on met pas explicitementLe is égale à la valeurÇa planteJe vais me le noterJe vais me le noter pour essayer de vous le retrouver
00:47:05 :Tout çaMême moi je me trouve tout le temps d'exemple dans mon repoJe sais plus dans quel projet c'était maisDès que je mettais égale toutIl me le surlignaitBah après c'est un peu comme leÇa c'est le genre de choses aussiSouvent en faitAttends vérification acquis
00:47:23 :Je marqueEuhSouvent en faitC'est queC'est comme quand tu metsC'est pas queComment direC'est pas queÇa ne marcherait pas mais c'est que c'est pas forcémentLa meilleure façon de faireOu utile, l'autre exemple que je peux te donnerC'est souvent quand on vaAvoir des gens qui vont dire
00:47:51 :Ma liste égale çaEt qui vont direIf ma listeJustement voilàNon pas is none justementEn fait c'est qu'on peut mettrePutain il m'emmerdeAttends je désactiveVoilà donc tu peux vérifier comme çaIf ma liste et s'il y a quelque choseDans ta listeDu coup
00:48:15 :Si tu as quelque chose comme çaNon du coup c'est pas noneDonc ma liste contient des élémentsComme ça et si tu as rienLà du coup le if ça sera pasInterprété comme vrai et du coupTu vas pas passer dans cette structure conditionnelleEt donc ça souvent
00:48:31 :Il y a des gens qui vont mettreSoit le len de ma listeÉgale à 0Comme ça, donc ça marcheMais c'est redondant ou de la même façonQui vont mettre bool de ma listeIs trueEt ça en fait c'est ce que fait Python en arrière plan
00:48:47 :Du coup en vérifiant que l'interprétation booleanDe ta liste est vraieOu non et siUne liste vide, l'interprétation boolean d'une liste videC'est false donc c'est ça qui permetDe faire cette vérificationOuais CapOuais et ben justementAlors il y aJe suis toujours comme toi, je suis toujours if ma liste
00:49:07 :Il n'y a pas de problèmeMais par contre dans la documentation de DjangoEst-ce que tu te souviensPour les authenticate de userIl fait unIf user is not noneOuiIl est expliciteJe le mettais pas, je le remets parce que dans la doc il le met
00:49:25 :Mais je vois pas pourquoi il le metSi ben ça c'est en faitC'est pour ça faut que je te retrouve l'exempleJe vais prévoir peut-être pour la prochaine sessionParce qu'effectivement faut que je retrouveDes exemplesDes cas de figure dans lesquels en fait si tu vérifie pas
00:49:39 :Explicitement parce qu'en fait ça peut être d'autres choses aussiOui je pense queJe pense que j'ai trouvé un petitExemple parce que justement si tu faisDes fois t'as besoin deVérifier explicitement que c'estNone et pas que c'est autre choseDans le sens où si tu fais
00:49:55 :UtilisateurÉgale ça, donc là c'est une chaîne videEt si je faisUtilisateur, là tu vois on va direL'utilisateur n'est pasDéfini, donc là je lance çaHop, et là tu voisAttends, oui non c'estL'inverse, non l'utilisateurEst défini, oui c'est çaDonc là je le lance
00:50:17 :Oui c'est ça et si je mets donc PatrickIci, voilà l'utilisateur est défini parce queIl y a quelque chose dedans, okDonc là si tu veux vérifierEst-ce qu'il y a quelque chose ou pas dans ma chaîneDe caractère, tu peux utiliserCette façon de faire et t'as pas besoin de faire plus
00:50:31 :Tu fais juste if utilisateurEt là donc si t'as quelque chose dans ta chaîne de caractèreÇa va afficher l'utilisateurElle est définie et siT'as rien ça met ça, okPar contre si tu veuxC'est spécifier précisémentSi l'utilisateur est none ou pasLà si je mets is none tu vois ça va être
00:50:49 :Différent parce que du coupSi je mets donc là PatrickL'utilisateur is noneÇa va pas s'afficherPar contre si je mets none iciLà c'est vrai tu voisAh mais ouiDonc c'est pour ça que là ça peut causer des problèmesParce que là tu veux vraiment, tu veux pas vérifier
00:51:07 :Si ton objetEst vide ou nonCe qui peut être videDonc là c'est pour çaComment direDonc ces trucs là pour ce qu'on peut encore vuC'est justement quand on fait ce raccourciC'est pour chaque variablePour chaque type en faitVous avez une valeur par défaut qui est interprétée comme false
00:51:27 :Donc pour les chaînes de caractère ça va êtreUne chaîne vide, pour les boules et 1Ça va êtrePour les nombres ça va être 0Pour les listes ça va être une liste videPour les sets, les dictionnaires tout ça pareilÇa va être des éléments videsEt
00:51:43 :Et du coupDonc si on fait juste voilà if utilisateurSi l'élémentSon interprétation booleanEst false, donc là c'est comme si jeFaisais if bool de utilisateurSi je fais bool utilisateur je vais vous le printerVous allez voir print stack comme çaVous voyez ça met false
00:52:03 :Et si je mets quelque chose dedans ça va mettre truePareil si je mets une liste videPrint bool de ça ça va être falseEt si je mets un élément dedans ça va être trueDonc des fois on s'en sert comme çaC'est comme si on mettait ça ici
00:52:15 :If bool utilisateur is trueDonc là on peut simplifier en faisant juste çaDonc là si j'ai un élémentHop ça va afficher, si j'ai 0 élémentÇa va rien afficherMais là c'est pour çaQue c'est important et qu'est ce qu'on veut vérifierSi on veut vérifier que l'objet
00:52:31 :Est vraiment, n'est pas définiParce qu'on pourrait des fois, et c'est ça l'exempleQue j'ai dans ma, que je vous disaisAvec le fichier, c'est que des foisEn fait il y a une différence quand vousLisez un fichier par exempleSi dans mon fichier j'ai un fichier de data
00:52:45 :Avec user comme çaQui est égal àUne chaîne de caractère videLà justement ça passerait pasDans cette fonctionMais on pourrait dire iciHop, ici on pourrait direHopL'utilisateurDonc on pourrait dire la variableHopUserExiste mais elle est videOk, si je mets ici
00:53:13 :Imaginez queHop, on récupère utilisateurQui soit une chaîne de caractère, donc on a notre fichierComme ça, user, okQui est défini dans le fichier de configurationMais il est définiA une chaîne de caractère videDonc là ça veut dire que la variableExiste dans notre fichier de configuration
00:53:31 :C'est juste qu'elle a pas de valeurDonc là du coup si je récupère ça dans une variableUtilisateur, je vais avoir une chaîne videEt là du coupJustement on pourrait vérifierDonc on pourrait dire la variableElle existe mais elle est vide. Si par contre je veux vérifier
00:53:45 :Qu'elle est pas définie, donc si par exempleDans mon fichierDe configuration, j'ai même pas cette variableLà je vais être égal à NoneEt c'est là que c'est important de vérifier Is NoneDonc là on pourrait dire, bah en fait si c'est NoneOn va pas dire que la variable elle existe, on va dire
00:53:59 :La variableN'est même pas définieDans les settingsEt là vous voyez ça va êtreDifférent. Est-ce qu'on a une variableEt c'est là que c'est important de tester Is NoneParce qu'il y a une différence entreRécupérer un objet None et récupérer une chaîneDe caractère vide qui va être évaluée comme
00:54:17 :False. Je sais pas si c'est clairJe pense qu'on pourra revenir là dessusUn peu plus en détail avec unExemple un peu plus concret queLà en mettant tout ça iciPour que ce soit plus clairMais tout çaPour dire que effectivement dans certainsCas précis c'est important de
00:54:35 :Vérifier vraimentSi on a unÉlément. Et Gab tu m'as mis leHopOuais cet exemple làJe fais toujours mes autres par les classesMoi l'autre jour je l'ai refait en fonctionC'est vrai c'est bizarre il met Is Not NoneJe l'ai pas creuséJe sais plusAlors donc là
00:54:57 :Donc s'il n'est pas NoneOk AuthenticateDans le cas de DjangoFaudrait voir peut-être que AuthenticateJustement peut te retourner des fois des valeursVides. Donc ce serait le cas de figure
00:55:11 :Ici tu vois. Ou si AuthenticateTe retourne une valeur vide peut-être que c'estQue l'utilisateur existeMais que tu vois il y a un problèmeEt que c'est différent de quand il est NoneOu là c'est genre ok il existe pas et donc là en faitEssaye même pas de lui dire ton mot de passe c'est pas bon
00:55:25 :Ou des trucs comme ça tu voisDonc c'estVoilà l'important de comprendre iciC'est effectivement qu'une valeur vide c'est pas pareilQue None. On peut avoir des valeurs
00:55:35 :Vides et avec le If c'est un peu ce que tu disJe pense William. Il faut bienComprendre cette notion parce que des foisOn a envie de vérifier que juste la valeurEst vide, que c'est une chaîne de caractère vide, une listeVide, un élément videDes fois on a envie de vérifier que l'élément
00:55:49 :N'existe pas, qu'il est None et pas justeQu'il existe mais qu'il est vide. C'est une différenceQui est quand même importante dans certains cas de figureOkOn y reviendra comme je vous disJe me le suis noté làPour que je vous montre des exemples un peu plus précis
00:56:05 :Et puis je regarderai, je vais me noter aussiDjango, voirDans ce cas-ci pourquoiHopHopJ'ai failli renverser mon motTout est bonJ'ai déjà renversé du café sur le tapis c'était un peu plus graveHopOk je vais m'imiter avec çaTacEuhAvec DjangoDonc c'est bon pour ça
00:56:35 :Enfin c'est bon jusqu'à ce qu'onLe revoitOuais c'est bon parfaitOkAlors on va revenir surCet exerciceDonc ça c'était ton codeDoncÇa hop super intéressantDonc voilàLà je lance le script hopEt il y a GabOui voilà ça c'était effectivementEuhLe test passe pas
00:57:05 :Donc Gab se dit okPar contre si on print comptez en profondeurListe en bazar celle-ciQui est le deuxième exemple que je donne làC'est censé retourner 7Et là si je fais un printJe vais vous le grossir un petit peu iciPour que vous puissiez bien voir
00:57:21 :HopDonc là ça nous retourne 7Donc normalement ça devrait être bonEt si je prends l'autre, si on prend cette première listeIci hop ça nous retourne 5Pourtant le test il passe pasEt là si je vais voir le testLa seule différence qu'on a en fait entre les deux
00:57:37 :C'est que dans le testJe mets les deux à la suiteDonc je fais déjà cette liste, j'appelle la fonctionEt je fais une autre listeEt je rappelle la fonction une deuxième foisEt là si je fais ça iciJe renforce le script plusieurs foisLà vous voyez qu'on a pas le même comportement
00:57:53 :A chaque foisAlors ça c'est pas censé du tout arriverQuand on a des fonctionsC'est le principe un peu d'une fonctionOn est censé quand on lui donne quelque chose en inputAvoir toujours la même chose en outputLà on lui donneOn fait exactement la même chose
00:58:11 :On appelle avec la même liste la fonction deux foisSauf que la première fois on a 5, la deuxième fois on a 10Donc c'est pas du tout censé arriverPourquoi on a ça ? Parce qu'ici en fait
00:58:19 :On a une liste vide et c'est pour ça que ça faitLe lien avec tout ce qu'on a vuDepuis le début de cette sessionC'est que quand on fait ça iciQuand on a le element qui est égalA une liste vide dans la définitionDe la fonction, en fait la fonction
00:58:33 :Elle va être définie une seule foisEt donc ça, ça va être le paramètreIci qu'on définitIl va mettre en mémoire cette listeDans la mémoire de PythonMais il va le faire qu'une foisÀ chaque fois qu'on appelle la fonctionParce que justement là encoreImaginez qu'à chaque fois
00:58:51 :Qu'on appelle une fonctionÇa voudrait dire qu'à chaque foisIl recrée la fonction, il recrée tous les paramètresAvec des espaces en mémoire, ça serait pas très efficaceDonc c'est beaucoup plus efficace de le faire qu'une seule foisEt après de justeAppeler le corps de la fonctionAvec ce qu'elle doit faire
00:59:07 :Donc là le problème c'est que ça c'est fait qu'une seule foisQuand le Python parcourt le scriptIl va lire toutes les lignes, il va se direBon je vais la définir, je vais avoir cet objet en mémoireEt cet objet ne va pas bougerDonc là en fait si je fais un print
00:59:19 :Ici de elementsEt que je relance le scriptJe vais enlever ça iciPour qu'on y voit plus clairOui bah non du coup ça va pasJe vais juste l'appeler sans le printIci comme çaDonc là je relance, là vous voyez queJustementOn a la liste qui se construit
00:59:39 :De plus en plus ici, je le lance une troisième foisVous allez voir que là en fait à chaque foisOn va rajouter des élémentsParce que justement ce element iciOn fait un happensDonc on lui ajoute des élémentsSauf que la fois d'après quand on rappelle la fonction
00:59:53 :C'est toujours le même objet en mémoire donc on va reprendre le même objetOn va lui rajouter des éléments etc etcEt ça on le voitEncore plus, moi la première fois que je l'ai vuJe m'en souviens, c'est pour vous dire à quel point ça marqueQuand on a ça
01:00:05 :Je m'en souviens parce que justement j'ai passé des heures à pas comprendreEt puis là je vais voir un développeurSenior après avoir cherchéTout çaEn comprenant pas et c'est pour ça que c'est vicieuxParce qu'on comprend pas en fait que ça vient de là le problèmeDonc en fait on passe des heures à chercher sur Google
01:00:19 :Et on se ditVoilà et on cherche avec des élémentsFonctions qui fonctionnent pas comme prévuSans préciser qu'on a mis un paramètreComme ça, une fois que vous pointez çaSi vous mettez liste vide dans les paramètresVous avez des centaines de milliers d'articlesDe vidéos et tout là dessus
01:00:35 :Mais quand on essaie d'expliquer le problèmeÇa marche pasEt on trouve pas la solutionEt c'est çaMoi je me rappelle être allé voir un SeniorEt dire je comprends pasParce que le pire c'est queMoi je l'avais mis ça dans une boucleDonc c'était une fonction qui était appelée
01:00:53 :De très nombreuses fois pour faire une opérationA l'intérieur d'une boucle qui appelaitTous les élémentsEt donc c'était en plus dans un logiciel 3D avec des hiérarchies d'élémentsDonc très très rapidement c'était assez exponentielEt là je lance le trucEt ça fait fumer l'ordiParce que la liste justement à chaque fois
01:01:09 :Elle ajoute des élémentsEt les ajoute en plus de façon exponentielleDonc ça faisait un truc assez fouEt je comprenais pas et donc je dis çaEt il me dit ah bah oui probablement qu'il a foutu une listeEt effectivement après en 5 minutesOn comprend où vient le problème
01:01:23 :Et quelle est la façon de faire ? Alors pour cet exercice spécifiquementGab d'ailleurs je t'en ai pas reparléMais dans la solutionQue je montre justementJe vais pas la montrer là si tu veuxTout seul mais il y a une façon de faireSans mettre une liste comme ça
01:01:37 :Dans les paramètres de la fonctionMais si jamais vous vouliez le faireLa façon simple en fait c'est justementIci de pas mettre une liste videMais de mettre noneEt là justement ça fait le parfait exempleDu isQu'on va utiliserAvec cet élémentOn va vérifier if element is none
01:01:57 :Et justementPas juste isPas juste if elementParce que là si je fais if elementCa marcherait égalementSi je donne une liste vide ou une chaîne de caractère videOu quoi que ce soitLà ce qu'on veut c'est vérifier spécifiquement est-ce que l'élémentEst noneEt si l'élément est none ça veut dire que justement
01:02:17 :On veut créer cette foisUne liste vide mais on le crée à l'intérieur de la fonctionEt donc là on va faire elements égaleCrochet et là si je relance normalementCa fonctionne on a les confettisParce que le test passeDonc ce qu'on va faire c'est qu'à chaque fois qu'on appelle la fonction
01:02:31 :Donc qu'on l'appelle iciLe element est une liste videEt on va créerOn va dire doncOn recrée une variableQui est égale à une liste videSauf que la différence c'est que cette fois-ciLe element lui il resteCréé une seule foisMais le elementQu'on crée ici lui
01:02:53 :Et là on parle de portée des variablesOn l'avait vu la semaine dernièreCa reviendra aussi plusieurs fois je penseD'ici la fin du Toza sur la portée des variablesC'est important il peut y avoir plein d'effets de bord aussi là dessusEt donc là ce qu'on fait c'est qu'on crée
01:03:05 :Une variable mais juste à l'intérieur de la fonctionDonc quand on relance la fonctionOn va recréer une variable et quand on sortDe la fonction ces variables tout ce qui est définiIci à l'intérieur de la fonction n'existe plusDonc ça permet de garder le scopeLa portée des variables à l'intérieur de la fonction
01:03:19 :Et de ne pas avoir d'effet de bord comme çaCe qui ne serait pas le cas égalementSi je faisais une variable elements en dehorsEt qu'on modifiait cette variableParce que là on aurait une variable globaleQui serait partagée par toutes les fonctionsA chaque fois si on faisait un append
01:03:33 :Là encore ce n'est pas le casAvec les chosesComment direImmuables si je fais un elementsQui est égal à une chaîne de caractèreEt que là ici je refais un elementsÉgal à bonjourLà en fait comme c'est des valeursQui sontQu'on ne peut pas modifier
01:03:53 :Du coup ça va créerUn autre élément à l'intérieurPar contre si je faisUne liste iciEt queJe vais vous montrer un exemple plus simpleEt que là je fais elements.append10
01:04:07 :Et je vais l'enleverDe mon truc iciEt que là je fais un print de elementsEn dehors, hop je relanceAh non là ilAh tiensAlors là je suis en train de dire une connerieAh ouiNon justementC'estJ'ai une vidéo là dessusJustementOuais je m'en souviens
01:04:33 :Alors justement c'est dans les 10 erreursVous voyez je me replante 10 erreursDu débutantJe crois que je l'avais fait là dedansL'égalitéOui voilà c'est çaJe crois que c'est celle làOù je le monte justement sur une variableQuand c'est justement un élémentQuiEst immuable justement
01:04:57 :Vous allez avoir une erreurEt quand par contre c'est un élémentQui n'est pas immuable vous n'aurez pas d'erreurC'est un peu le mêmePar contre alors làJ'ai un petit doute quand mêmeJe revoisMoi aussi ça me permet de revoir ces éléments làAprès de toute façon ça
01:05:15 :PourquoiSurprenant tiensJe m'en rappelle plus de ça parce que c'est rarementUn truc qu'on fait justement parce queCa c'est comme avec le global je sais même pas pourquoiCe mot existe encoreIl y a des très très rares cas de figure dans lesquels ça peut êtreUtile mais franchement
01:05:31 :Ca fait des années et des années et des années que je ne l'ai pas utiliséEtEn fait justement là encore quand on fait une fonctionSouvent c'est pour avoir le même comportementA chaque fois si vous commencez à avoirDes variables qui sont en dehors de votre fonction
01:05:43 :Et que vous les modifiez dans la fonctionLà encore ça peut créer plein d'effets de bordParce que ça va justement pas avoirToujours le même résultat si vous modifiez les chosesDe façon comme çaEt alorsOui je reviens là il y a des questionsJe vérifierai là ça parce que j'ai un petit doute
01:06:01 :Quand même qu'on puisse pas modifier comme çaJe sais plus exactementJe vais remettre ça hopTrimbo c'est ton resteÉlément que tu poses dans ta fonctionOuaisEt elle n'est pas modifiéeDu coupOuiJe vais vérifier dans PyCharm parce queJe vous ai perduParce que non
01:06:25 :La meta fonction elle n'est pas appeléeJe crois qu'elle n'est pas appelée c'est peut être pour çaAh oui oui ouiOui et puisEn plus avec les tests unitaires là j'étais pas sûrOk là je vais mettre1,2,3OkOui voilà ok c'est ça je suis pas fou
01:06:43 :Ça c'est bien okC'est ce que je pensaisC'est juste que là j'avais quoi j'avais une erreurOui non c'est çaJ'avais juste une liste videNon pourtant là je lanceOk bon je sais pasC'est pour ça que je voulais le faire dans PyCharmParce que là il y a trop de trucs qui se passent
01:07:01 :Pardon Jonathan on a pas bien entenduJe crois qu'il y avait pas deAh il était avant oui oui il est avantEffectivement oui oui c'est juste çaEffectivement si je lance làOui merci c'est juste çaEt là on le fait 3 fois donc on ajoute 10 à chaque fois
01:07:19 :Oui oui donc voilàDonc je suis pas fou et ce que je voulais vous direAvec l'autre aussiPar contreC'est important quand vous avez des objetsDonc il y a 2 cas de figure il y a soitVous avez un objet muable comme çaEt là vous pouvez effectivement le modifier
01:07:35 :Le problème c'est que du coupEt c'est pour ça que je vous dis il faut pas faire ça parce que ça fait des effets de bordParce que vous modifiez l'objet qui est en dehorsEt vous voyez qu'à chaque fois qu'on appelle la fonctionDu coup ça modifie l'objet
01:07:45 :Donc là imaginezLe bordel que ça peut être si vous appelez la fonctionA chaque fois qu'elle est appelée ça modifie le trucC'est pas possible de faire ça comme çaDonc là il y aPlein de trucs intéressants aussi iciEt si je reviens sur lesErreurs du débutant
01:08:01 :HopErreur du débutantSur cette dernière partieLà vous allez avoir quand même une erreur je vais vous mettre le lienDe cette sessionHopParce que là ça peut poser un problèmeSi vous avez une variable que vous essayezDe modifier comme çaAvec un plus égalDans ce cas ci regardez
01:08:23 :Cette partie parce queJustement la façon dont ça fonctionne ça fait que vous aurez une erreurPar contre si vous avez fait çaLa façon de faire ici ce serait justementLà encore de passer la liste iciDe faire liste.append de 10
01:08:35 :Et de passer quand on fait çaJe vais enlever un petit peu d'occurrenceEt là vous passez liste égale àElements et là si je fais un printDe elementsEt que je relanceAh oui alors là on a un autre effet de bordQui est justement le passage
01:08:51 :ParJ'y ai pensé tout à l'heureC'est le passage en valeurVersus référenceC'est que là justement vous passezLa liste et c'est pour çaQue là encore il faudrait faireUn autre bon exemple dans lequel on peut faire le crochetDe points parce queEt là si je print le liste à l'intérieur
01:09:11 :HopVous voyez qu'à l'intérieur on a bien le 10Mais qu'après à l'extérieur notre element puisqu'on l'aDupliquéIl est pas modifié mais si je l'enlève comme çaLà il est modifié même si on le passeParce que justement on passe la référenceDe la listeEt donc ce que ça fait c'est qu'on passe
01:09:29 :En fait l'objet en mémoireEt ça fait exactement ce qu'on a vu au débutC'est à dire que ça va du coup modifierCet objet même si on le passeComme ça à notre fonction ça aussi je crois que j'avais faitUnePassageDans la formation de baseOuais c'est ça
01:09:47 :Je l'ai regardé 5 fois à l'époque pour comprendreMais vraiment au début j'ai eu du mal à comprendre çaC'était compliquéIl faut le voirAh ça c'est sur les fonctionsC'est aussi pas mal de choses intéressantes là-dedansLes fonctions locales, globales, espaces globales, localesIl y a pas mal
01:10:03 :De choses importantes là-dedansAussi donc je vous ai mis le lienParce que c'est importantÇa fait partie de tous les effets de bordQu'on peut avoir avec ça justementOuaisMais puisque tout est objetDans PythonTout est passé par référence non ?
01:10:21 :Bah justementÇa dépendAttendsOui et nonDans le sens oùNonParce queOui mais ça vaComment expliquerOui mais aprèsSi on prend par exempleUn objet qui est pas muable cette fois-ciSi je prends Patrick iciL'important pour nous c'est justementLes effets de bord que ça peut générer
01:10:51 :Dans le sens oùEt c'est ce que je montre justement dans l'autreOuais dans l'autre lien que j'ai misJe crois les erreurs de scopeC'est queJustementBah je pourrais vous montrerCet exemple là en fait justementHop si je me trompe pasOuiOn va mettre username égale
01:11:13 :À PatrickHop usernameEt là je fais plus égale et on va direHop et làJe vais enlever çaSi j'en ai pas besoinOkDonc voilà là tu vois on peut pas accéder à usernameParce que justement on essaie de modifierLeOui c'est une réponse énorme
01:11:35 :On essaie de modifier la variableDonc le plus égal c'est comme si on faisait usernamePlus smithEt là en fait il va essayer comme on peut pas modifierUne chaîne de caractère parce que c'est un objetQui est immuableMême si finalement c'est une listeDe caractère ça agit pas comme une liste
01:11:51 :Donc on peut pas le modifierDonc en fait quand on fait un plus égal comme çaIl va essayer d'accéder à la variable qui est localeEt comme elle est pasDéjà définie ça va planterEt c'est ce qu'il ditCannot access local variable usernameAlors que si je mets une liste justement
01:12:07 :On a vu que ça pouvait changerDonc finalement en fait l'important iciC'est justementD'abord ça peut avoirSi vous avez besoin d'une valeur que vous passezEt que vous l'utilisezEffectivement si j'ai besoinLà on va faire un autre trucOn va direUser nameUser to add
01:12:29 :On va dire name to addPar exempleEt là je vais faireUsersComme çaOn va faire un truc comme çaUserQuand tu fais un plusQuand tu fais un plus égalLà où t'as le droitEn fait il recréeUn objetUn ID en fait quand tu fais un plus égal
01:12:56 :Oui oui oui et c'est ça en faitEt effectivementParce que tout est immuableDonc si c'est immuable de toute façon tu pouvais pasLe modifier mais en fait même làIl le fait mais en fait il changeIl change d'objetEffectivement c'est le genre de chosesEffectivement quand on vient dans notre langage
01:13:14 :Et c'est pour ça que des fois par abus de langageOn dit qu'on va écraser une variableOu un truc comme çaEnfin justement qu'on va modifierEn fait ce qu'il faut comprendreC'est que si je faisA égale 10Et après je fais A égale 15Attends j'essaie de
01:13:32 :Quel exemple j'avais aussiQui était mieuxBah en fait oui le plus égalEst un bon exempleOui c'est ça si je fais user égaleEt que je dis PatrickOuais et tu fais le print làVoilàJe vais le remettre dans PyCharmParce que les identifiantsC'est un autre truc
01:13:54 :Et là je fais user plus égal smithEt je remets hopJe refais l'IDLà tu vas voir qu'on a pas le même identifiantEt effectivement l'erreur qu'on faitC'est de se dire ok on va juste prendre notre variableEt puis la modifierEt en fait on recréeUn objet on recrée une variable
01:14:12 :Et du coup on a pas la même choseEt là encore c'est important de le comprendreParce que si on pense que c'est le même objetAlors qu'en fait on crée un nouvel objetCa c'est un problème de performance aussiQue je montreDans une formation aussi je crois
01:14:26 :Que si en faitQuand vous voulez faire la concatenationComme çaIl vaut mieux passer par une listeVous allez construire votre listeEt comme ça justement vous avez une seule liste en mémoireVous allez ajouter des éléments dans cette listeEt après vous allez concatenerUne seule fois dans un nouvel objet
01:14:44 :La longue phraseDonc comme ça vous allez juste avoirDeux trois objets qui vont être créésLa liste d'origineEt puis la chaîne de caractère au finalAlors que si vous faites un plus égalA chaque fois il va créer un nouvel objetQui va être de plus en plus grand
01:15:00 :Et donc au niveau de la mémoireJe crois que c'est peut-être sur Youtube seulement celle-làOù on voit qu'en termes de performanceQuand vous faites ça sur des grands nombres de donnéesCa change vraiment beaucoupEt du coup si je reviensOuais donc si je reviensLà j'étais là-dessus
01:15:18 :Si je fais un userJe sais plus trop ce que je voulais, sur quoi j'étais partiUser Append Name to AddEt là on va fairePatrickOuais non c'est pas çaAddQu'est-ce que je voulais vous montrerJ'ai essayé de retrouverLà je print UsersDonc là c'est normal
01:15:40 :Par contre c'est çaEt là si je fais Name to AddPlus égal SmithEt que làHopEt que là c'est çaJe voulais montrerUsername égal PatrickHopEt que là je passeName to Add égal UsernameVoilàJe lance et là je remets UsernameVoilà c'est ça que je voulais montrer
01:16:10 :Donc là j'ai une listeVideListe videEtLà je lui passe, comme j'ai fait tout à l'heureDe passer la liste, sauf que là je passeUne variable qui est une chaîne de caractèresEt après je modifie cette variableEt après je la réafficheEn dehors, et là on voit qu'elle n'a pas changé
01:16:30 :Alors que quand je l'ai fait avec la listeJ'avais Elements qui était une liste vide, après j'ai ajouté 10Dans la fonction, et quand je ressortaisDe la fonction, le Elements avait bien été modifiéParce que c'est un objet immuableEt que du coupJe lui passe non pas un nouvel objet
01:16:44 :Il ne crée pas un nouvel objet, il va justeRécupérer l'objet en mémoire, il va le modifierEt du coup en dehors de la fonctionIl va m'afficher ce même objetQui est toujours le même en mémoireDonc je l'ai modifié en passant dans la fonctionAlors que quand je lui passe UserName
01:16:58 :Ici, je ne vais pas lui passerL'objet en mémoireJe vais lui passer la valeurDonc c'est pour ça qu'on appelle çaLe passage par référence ou par valeurQuand on fait un passage par référenceAvec un objet muableDonc un objet qu'on peut modifier, il va faire un passage
01:17:14 :Par référence, donc il ne va pas envoyer les valeursIl va envoyer l'objetDonc l'objet, comme il estMuable, il peut être modifiéEt donc on a des effets de bordPar contre quand c'est un objet qui est immuableIl ne peut pas être modifié, donc il va envoyer
01:17:28 :La valeur de l'objetDonc là dans ce cas-ci PatrickOn peut utiliser cette valeur pour l'ajouter dans la listeQui elle va être modifiée du coupParce que là elle est définie en dehorsOn peut y accéder dedans et elle va être modifiéeEt ce sera la même chose si on passait cette liste
01:17:42 :En paramètres, là je fais juste utiliserLa variable globale mais si je la passaisComme on a fait avec Element tout à l'heureCe serait la même chose. Par contre le NameToAdd
01:17:50 :Ici, là c'est pas notre variableUsername, et là encore on peut le voir très bienC'est pour ça que je dis que le IDEst intéressant ici. Si je fais
01:17:58 :Un printID de NameToAdd, je vais le faireAprès ici, et que je fais un printIDDe Username, on va le faire iciUsernameEt printUsername, alors là je ne sais pasS'ils vont ici, moi s'ils demandent des trucs quand mêmeBien, donc là il y aBeaucoup de print, je vais enlever lui
01:18:14 :Je vais enlever luiDonc vous voyez on a le premier print de IDUsername, ok, on a 25.92A l'intérieur làJe refais un print, là on a quelque chose de différentEt quand je reviens en dehorsLe Username, là il est toujours le mêmeDonc cette variable elle n'a pas bougé
01:18:30 :Je l'ai passé ici à NameToAddA l'intérieur du coup il a crééUne autre variable qui est justeValide dans cette fonctionEt qui est différente du coup, qui va utiliserLa valeurQu'on avait donnéeQu'on avait donnée, donc PatrickIl va lui ajouter Smith, il va utiliserCette valeur qu'on a envoyée
01:18:50 :Il va lui ajouter quelque chose et il va créer une nouvelleVariable, okEt en dehors après par contre ça n'aura pas changéDonc, voilà, ça faitBeaucoup de, là ça je vais vous le mettreJe vais vous le mettre dansL'exerciceDef, on va l'appeler variableScopes, je l'appellerai mieux
01:19:12 :AprèsDonc, ouais okJe vous mettrai ça un peu plusAu clairÇa vaQuand même, ou c'était peut-être un petitPeu rapide, il y a beaucoup de chosesMaisLe bon truc pour ça c'est que j'ai faitDes vidéos sur tout ça, je vais vous trouverLe passage par valeur aux références
01:19:40 :Je vous l'ai mis aussiDonc allez voir ça, allez voir mêmeToute la formation sur les 10 erreurs du débutantC'est des trucs très classiquesSouvent des questions d'examen aussiEt passage par valeur aux références aussiJe l'expliqueDonc n'hésitez pas à revoir tout çaEt ça fait déjà 1h20
01:19:58 :Qu'on est dessus, donc je pense queOn remettra les exercicesPour une autre foisAh oui, je vais justeVous montrer le DefaultDict parce queC'est rapide et c'était quand même intéressantDefaultDictEt une façon deDonc là par exempleLe type de cet exerciceC'est de créer une structure de données
01:20:20 :En utilisant un DefaultDictL'intérêt du DefaultDict, on l'utilise très souventQuand on a des listesQuand on a par exempleDes dictionnaires avec des listesEt que si la liste n'existe pasOn veut la créer et après on veut l'ajouter dans cette listeÇa permet de faciliterLe code
01:20:38 :Parce que souvent si on n'a pas le DefaultDictEst-ce que la clé existe dans le dictionnaireS'il n'existe pas, tu l'initialisesAvec une liste videEt après tu ajoutes dans cette listePar contre si elle existeTu fais juste directement ajouterFaire un append dans la listeDonc ça permet de faciliter ça
01:20:56 :Et donc làJe vais vous montrer la solution parce que vous allez voirQue c'est très très rapideLa seuleL'erreur qu'on fait souvent en faitC'est de ne pas faire une fonctionParce que le DefaultDictIl faut lui donner une valeur par défautMais en fait c'est pas une valeur qu'il faut lui donner
01:21:14 :C'est une fonction qui va générer une valeurDonc ce qu'on peut faireC'est utiliser par exemple une listeDonc ça c'est l'exemple comme je vous disQui est très souvent utiliséEt là j'ai plus l'exemple en têteEt avec l'or qui l'estJe vais utiliser mon petit ami copilot
01:21:30 :Comme ça je suis sûrQu'il va me faireUn petit exempleOn va direCreateDictWithDefaultDictToAutomaticTo listOk on va essayer avec çaOkC'est exactement ça que je voulaisMerciÇa m'évite de perdre du temps à réfléchirJe relance et voilàDonc vous voyez c'est l'exemple que je vous donnais
01:22:02 :On aOn va enlever ça pour le faire directementHop hop hop hop hopDonc là l'intérêt c'est queVous voyez c'est très très rapideOn fait un DefaultDict et là on lui passe listeEt c'est pour ça que je dis que c'est souvent confusParce qu'on oublie que liste ici en fait c'est une fonction
01:22:18 :C'est une fonction qui permetC'est une classe en faitQui permet d'instancer des listes justementEt du coupQuand onQuand on luiLe DefaultDict ici si vous allezIci vous avez un DefaultFactoryEt il vous l'expliqueVoilà je croisVoilà it's calledDonc en fait ça ça va être appelé
01:22:42 :Donc c'est bien ça qu'il faut vous dire iciC'est que cet élément là en fait il va mettre des parenthèsesAprès tout simplementDonc c'est pour ça que ça marche avec des classes ou avecDes fonctions parce queIl va appeler cet élément ici pourCréer l'objet qu'il va mettre par défaut
01:22:56 :Donc pourquoiJe suis allé un petit peu vite ici làC'est que ici vous voyez que j'aiUne clé ADonc j'ai un dictionnaire si je mettais juste un dictionnaireComme ça en fait ça ne marcherait pas parce que là si je lanceVous voyez on a un clé erreur
01:23:10 :Parce qu'on lui dit tu prends la clé AEt tu lui ajoutes 1Donc ça marche si j'avais une clé A qui était égale àUne liste videEt une clé B qui étaitÉgale aussi à une liste videDonc là ça marche je lance ça ajoute bienLe problème c'est que j'ai pas envie
01:23:26 :Préalablement de faire cette opérationDéjà toutes mes valeursAvec des listes vides ça serait un peu chiantEt puis ça ferait des opérations en plusPour pas grand chose, moi ce que je veux c'est justeAvoir un dictionnaire videEt puis après en fonction, donc là c'est des exemples
01:23:40 :Qui sont un peu stupidesMais on pourrait imaginer par exempleQu'on a une liste d'utilisateurs avec des notesÀUne certification Tosa par exempleEt donc là ce qu'on voudrait c'estRajouter toutes les notes de tous les tests à notre dictionnaireDonc on pourrait avoir un truc test ici
01:23:56 :Avec un dictionnaire videEt là on voudrait dire par exempleTest de GabTu vas ajouter la note 9Et puis après tu vas ajouter 12 etcEt on a pas envie préalablement de faireCe dictionnaire avec toutes ces valeurs videsDonc ce qu'on va faire iciC'est qu'on va garder notre dictionnaire vide
01:24:14 :Sauf que plutôt que de faire un dictionnaire videOn va faire un default dictEt on va dire par défaut si cette clé n'existe pasTu vas créerUne liste videJe relance et je fais un print de testVous voyez qu'on a un objet un petit peu différent
01:24:28 :MaisAh tiens on aIsraël qui vient de nous rejoindreOuais j'ai vuD'ailleurs désoléJe sais pas si c'était ce que j'ai vuJe fais une petite parenthèse làJe sais pas si c'était pareil la semaine dernièreEt je me suis dit queOn va changer peut-êtreParce que si finalement t'es le seul qui est pas disponible
01:24:50 :À cette horaire le jeudi soirTu vas louperToutes les sessions des 3 prochains moisDonc on essaiera de changer quand mêmeMême si des fois ça arrangeUn petit peu moins de mondeAh non t'inquiète pasJ'ai eu 2 semaines un peu chargé mais normalementJe vais pouvoir migrer
01:25:10 :Ah bah superJ'ai l'impression que le jeudi soir convientLà ça fait 2 semaines de suiteQue ça convenait à la majorité des gensNormalement je devrais y allerAprès il y a les rediffusionsMais c'est cool quand même si tu peuxT'inquiéter pour poser des questionsDonc voilà
01:25:28 :Là on a le default dictMoi l'erreur que je faisais souvent c'est de voir cette listeEt puis après des fois on se dit voilà on met la listeEt là on a un problèmeEt je me rappelle avoir souvent eu cette erreurDe me dire bah non il me semblait que je passais une liste
01:25:40 :En fait on passe pas une listeOn passe une fonction ou une classe qu'on peut appelerEt c'est pour ça et pareil aprèsDes fois j'ai eu des exemples où ce que je voulais c'était une chaîne de caractèreDonc là je mets la chaîne de caractère et pareil ça marche pas
01:25:50 :Et là en fait il faut mettre le stringAh oui bon là ça marche pas parce qu'on a des happensMais si j'enlève çaÇa va marcherOn verra bienIl va pas nous gueuler dessusEt donc dans le cas de l'exerciceLà ce qu'on voulait justement c'était une chaîne de caractère
01:26:06 :Donc si je reviens sur hop iciDonc c'est pour ça, là on veut que en fait par défautÇa génère un utilisateurDonc si on met user3Égal jaune et ben ça vaÇa va nous créer une entréeAvec cet utilisateurEt par contre si il existe pasÇa va nous retourner
01:26:24 :AnonymeEt c'est pour ça que làDu coup on peut pas, de la même façon je peux pas direAnonyme ici comme çaEt donc je vous dis ça m'a vraiment pris du tempsAvant de me rappeler ce truc làDonc la façon de faire ça rapidementC'est de créer une fonction lambda
01:26:40 :C'est une fonction justement qu'on appelle une fonction anonymeC'est exactement la même choseQue si je faisais fou iciEt que je retournais anonyme sauf que ça va plus viteMais c'est juste que c'est plus visuelQuand on le fait avec une fonctionDonc si je mets fou ici
01:26:54 :Là je peux lui passer ça iciEt là je peux faireGabIl faudrait que je modifieEt que je dise testComme on l'a faitEt là en fait il va pouvoirAppeler du coup cette fonctionDonc là si je lanceVous voyez qu'on a plus de problème
01:27:14 :Qu'on a bien le testQui est inséré et queSi on a une clé, si je fais un printDe test30 par exempleBah là on a bien l'anonyme qui nous est retournéParce qu'il va appeler cette fonctionEt donc ça on peut le faire tout simplement avec un lambda
01:27:30 :Voilà donc c'est justeÇa qu'il faut se rappeler comme je vous disÇa m'a pris vraiment des annéesParce que c'est pas un trucQu'on utilise très souvent non plus aussiMais c'est très très pratiqueQuand on a besoin de l'utiliser pour justementÉviter 4 ou 5 clines de code
01:27:46 :Où on vérifie si la clé existeSinon on la crée etcDonc ça permet vraiment d'être plus efficaceEt à chaque fois je me rappelle comme je vous disJe revenais, j'étais là, je mettais ma valeur par défautEt ça plantaitEt puis je me rappelais qu'il fallait mettre une fonction
01:28:00 :Une classe qui va être appeléeMais ça vous le voyez bienLà encore si vous avez un douteDans le Toza vous pouvezAppuyer la fonction helpQui va vous afficher du coup les docstringsEt vous le voyez dans la docstring iciIl vous dit bienDefault factory is called without arguments
01:28:18 :Donc il va bien appeler en fait cet élément iciPour générer la valeur par défautCe qui permet de faire des trucsBien compliqués parce que justementLà c'est l'intérêt aussiParce que si on mettait juste uneSi c'était juste une valeur comme çaOn n'allait pas la calculer
01:28:38 :Là l'intérêt c'est que justement on pourrait avoirDes cas de figure, ça m'était arrivé justementOù vous avez un truc un peu plus complexeQui se passe quand un utilisateurExiste pas, il faut aller calculerDes trucs et puis récupérer une donnéeEt puis après vous allez insérer cette donnée par défaut
01:28:54 :Qui va être différente en fonction des utilisateursEt donc c'est pour ça que làC'est intéressant de pouvoir donner un objetQui va être appelé plutôt qu'une valeur par défautParce que la valeur par défaut justement elle serait statiqueAlors que des fois quand on veut insérerUne valeur qui existe pas, on a besoin de la calculer
01:29:08 :Dynamiquement à partir d'une base de donnéesOu des trucs comme çaDonc c'est pour ça que c'est intéressantDe pouvoir passer un objet callableIciOkOn va s'arrêter làJe vais prendre les dernières questionsOn déborde un petit peu mais c'est pas graveJe pense que c'est des trucs importants
01:29:28 :A chaque fois j'ai l'impression que ça va être rapideEt finalement si on veut expliquer dans le détailLe dernier petit trucC'est importantDu coup si on met argsMathieuSi on met args là iciDans le DefaultDexAlors dans quelle configurationTu voudrais le mettreParce que là quand on
01:29:54 :Ah dans une fonctionQue tu fais toi mêmeOk si tu mettais un args iciEt que là tu mettais par exempleFoo et queBonne questionAlors attendEst-ce que ça pourrait être utileEt dans quel cas tu dis argsBah t'as pas le droit je croisC'est écrit là dans la doc
01:30:18 :Ah oui c'était okOui bah il l'appelle sans argumentAprès est-ce que tu peux lui mettreEffectivement desOui parce que ce que j'étais en train de me direC'est que tu peux pasLà tu vois quand tu fais unJustement quand tuC'est juste quand t'accèdes au truc
01:30:38 :C'est pas toi qui fais cette manipulation justementOuais mais si tu retournes ton argsLà faudrait que je réfléchisseT'es trop poséParce que tu peux pas lui spécifier ce que tu veux envoyerTu voisDoncEt je vois même pasTropEn fait je pense que si t'as besoin de faire
01:31:04 :Un truc comme ça où tu vas passer des arguments différentsJustement quandA chaque fois quand tu vas créer une valeur en faitTu passes pas par un defaultTu vasTu vas faire un truc customParce que si tu dois, si les valeurs doivent être dynamiquesIci tu peux pas
01:31:20 :Tu vas la définir une seule fois tonDonc si finalement les valeurs que tu passesIci en faisant lambdaEt en lui passant des trucsQui vont être différentsLà tu peux faire çaEffectivementMais quel est l'intérêtTu vois tu peux pas le modifierLà dans ce cas-ci j'ai envie de dire tu vas juste retourner direct
01:31:40 :1, 2, 3Parce que ça ici tu pourras pas le modifierOu alors à moins de mettre un trucDynamique justement si tu metsMais là ça commence à devenirA l'embiquer et je pense que tuT'es peut-être mieux de justementPasser parLe truc sans les default dict
01:31:58 :Parce que là si je mets A du coup et que je metsComme on l'a vu justement une liste videEt que après jeFais un append là tiens c'estUn bon testOuais là j'ai bien le 1 donc tu pourrais effectivementFaire un truc comme ça mais là
01:32:12 :Là je serais pasTrès content d'être le collègue qui passe derrièreSi tu me fais çaParce que là justement tu prends un truc qui est censéT'éviter deEnfin être assez simpleEt t'éviter d'écrire quelques lignes de codeMais si finalement c'est pour faire un truc où il faut que tu lises
01:32:28 :Les 5 lignes de code en étant genreWaouh pourquoi il a fait un truc compliqué comme ça alors qu'en faitTu pouvais juste écrire les 4 lignes de codePour éviter le default dict mais pour avoirUn truc plus clairLà je passerais pas par le default dictMais effectivement c'est intéressant et ça fait
01:32:42 :Le lien avec un peu tout ce qu'on a vuQue tu peux passer un élémentQue tu passes là qui est modifié iciQui est appelé même pas par toiEt qui finalement fait que t'as un effet de bord qui est pas forcémentVoulu parce que là siFinalement après je continue de faire ça et que j'affiche
01:32:56 :Là effectivement on va avoir desOn va avoir des résultats différents à chaque foisOk est-ce queIl y a d'autres questions ?T'as raison en même temps ça pourrait être une questionTosa ça m'étonnerait pasC'est un truc comme çaExactement ce code làEt puis à la fin quel est le résultat
01:33:22 :De cette ligne de code et là vous seriez genreWaouh pourquoi il fait çaC'est une bonneT'as raison de poser la questionParce que ça pourrait être une questionD'examen ça m'étonnerait pasD'autres questions ou c'est tout bon ?
01:33:42 :Il y a un autre code là comme je disaisCelui-là aussi je pourrais le mettre ça pourrait être intéressantJe vais l'appelerWhat the fuckComme j'étais beaucoup absentJe voulais juste avoir une informationÇa finit par parler de l'arbre làPour récupérer le parent et l'enfantNon ça on l'a pas
01:34:08 :Ça je le garde pour plus tardOn reste sur des basiquesAvec quand même pas mal de subtilitésLà tu verras si tu regardes la rediffusionOn a vu plein de petits trucsD'effets de bord de trucs qui moi mêmeDes fois ça m'a mélangéParce que justement en fonction de quand
01:34:26 :T'appelles les trucs et tout ça modifie pasDans le bon ordreLe graph on verra çaUn peu plus tardEt bah s'il y a pas d'autres questionsJe vais arrêter làJ'ai eu peur de ne pas avoir lancé l'enregistrementMais non je me souviens de l'avoir faitOk bah écoutez
01:34:48 :Je vous laisse du coupAvec la rediffusionEt avecLes dernières tâchesÀ compléterDonc là on est jeudiOui c'est çaOn a vu un peu la progression de tout le mondeVous avez tous au minimum commencéY'en a qui ont finiY'en a qui sont à peu près à la moitié
01:35:10 :Je pense que d'ici la fin de la semaine vous devriez pouvoirCompléter çaLes deadlines sont là un peu de façonIndicativeY'a pas un coup près à la finSi vous finissez pas les trucs ça reste disponibleDonc c'est plus indicatifJe me rappelle même plusOk bah
Aucune occurrence trouvée pour « ».