Session de mentorat TOSA
Session du 20 juin 2024 à 20h00
Bases du Langage
TOSA & Certifications
Veille & Discussions
Programmation Orientée Objet (POO)
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Session de mentorat TOSA
Session de mentorat TOSA dans laquelle on va revoir tout ce qui concerne les objets avec Python : gestion en mémoire, les principaux types d'objets, la conversion d'un type à un autre, la vérification du type d'un objet, et ce qui concerne l'orienté objet, notamment l'héritage.
00:00:00 :Et c'est parti. Donc ouais, je sais pas si vous avez tous vu mon mail là pour letosage, je vais vous en envoyer aussi avant que j'oublie la petite feuille de présence.
00:00:15 :Tac, je vous le mets dans le chat. Pas de soucis Cécile, ouais c'est pas urgent là,et puis même si vous avez rien à dire vous n'êtes pas obligé de répondre. Après c'est
00:00:28 :sûr que j'ai eu 2-3 retours, c'est quand même bien pratique pour évaluer, pour voirce qui va, ce qui va pas, ce qu'on peut améliorer, tout ça. Donc si vous avez le temps, ça
00:00:38 :n'a pas besoin d'être un pavé non plus, ça peut être juste 2-3 petits points, cequi va pas, ce qui va, ce que vous aimeriez en plus, etc. Ça peut être assez rapide.
00:00:46 :Parfait, donc je vais vous mettre sur mon autre écran. Ok, donc il n'y a pas d'autrespersonnes qui arrivent pour le moment, donc on va commencer. Donc bon déjà, comment
00:01:09 :ça va, est-ce que vous avez pu continuer un petit peu, je sais que là effectivementc'est un des retours qui m'a été fait, effectivement de ne plus avoir de programmetoutes les semaines comme on l'avait, donc comme je vous ai expliqué un petit peu dansle mail, j'avais créé les tools là, donc les outils pour la correspondance. De notre
00:01:28 :côté, ça c'est des trucs que vous voyez pas, mais de notre côté j'ai essayé de faire desoutils notamment avec Kevin pour qu'on puisse faire les choses à deux, et c'était un peucompliqué, et bon ça a été plus de travail que ce que j'espérais, donc finalement j'aipassé plus de temps à fixer les outils qu'à vous donner des choses à faire, donc ça fait
00:01:47 :que voilà, il n'y a plus eu grand chose là-dessus, et ça fait partie justement des retours, je saisque j'ai eu des retours de quelques personnes qui m'ont dit qu'ils aimaient bien avoir des étapes,j'ai eu des retours aussi sur les mails, donc clairement c'est des choses qui étaient appréciées,
00:02:01 :qui n'ont plus suivi, et avec les CPF en plus qui sont sur une autre temporalité justement,c'était un petit peu compliqué. Donc on va essayer de ramener quelque chose comme ça,
00:02:13 :il y a aussi le fait que de plus en plus vous prenez des chemins un petit peu différents,dans le sens où il y a des gens qui sont encore assez débutants, qui n'ont pas fait beaucoup detests, qui n'ont pas vu beaucoup de sessions de mentorat, il y en a qui ont fait tous les tests,
00:02:27 :toutes les sessions de mentorat, qui ont déjà un bon niveau, donc ça fait que voilà, les niveauxcommencent à être assez différents, là où au début on pouvait faire quelque chose d'assezsimilaire pour tout le monde, là ça devient beaucoup plus personnalisé, donc ça fait que làaussi en fait, je vais avec Kevin, on va, comme je vous ai dit, on l'a pas encore fait, mais on va
00:02:46 :vous peut-être potentiellement faire des calls one-on-one avec chacun, si vous avez envie defaire un call, sinon ça peut être aussi en asynchrone par email, mais voilà pour voirplus concrètement, c'est pour ça que je vous ai demandé aussi de faire le plus possible les tests,comme ça, ça nous permet de vraiment évaluer votre niveau, j'avais pensé éventuellement aussi,
00:03:08 :ça c'est, je vais voir, faut que je vois en termes de coût là, parce que les évaluations qu'on vousa fait passer, qu'on a fait passer au tout début du coup, pour les gens qui sont en CPF là maintenant,qui sont un peu dans ce que vous avez fait, on va la faire passer plus tard en fait, donc on va
00:03:25 :commencer avec des tests comme les tests sur le site, qui permet d'évaluer votre niveau,et une fois qu'on voit que vous avez un bon niveau, on va vous faire passer l'évaluation que vous avezfaite au tout début, parce que là le problème c'est qu'on vous l'a fait passer au tout début,
00:03:37 :il y a des gens qui avaient encore pas trop de base en Python, il y a des gens qui ont fait leparcours en mode express pour passer le test, mais donc finalement les niveaux étaient assezfaibles au début, donc je pense que c'est plus intéressant de déjà vous emmener jusqu'à un
00:03:51 :certain point, vous faire passer l'évaluation, voir après tout ça, qu'est-ce qu'il y a,qu'est-ce qui bloque encore ou pas, et donc là pour le moment, si vous pouvez le faire avec lestests sur le site comme ça, ça nous permet nous de voir plus concrètement là où ça bloque,
00:04:05 :et puis après de vous proposer des ressources plus spécifiques, plus individuelles par rapport à ça,pour que vous puissiez continuer à progresser là-dessus. C'est ça va pour tout ça ? C'était
00:04:16 :clair ? Donc, si c'est clair, je reviens, bon je crois qu'il n'y aura pas plus de monde. Donc,et puis par rapport aux sessions de Mentora aussi, comme je vous disais, n'hésitez pas à venir auxautres, on en a rajouté beaucoup, là on va en avoir presque tous les jours de la semaine, du coup
00:04:40 :c'est le but. Alors pas toutes les semaines, mais en fait on va faire trois sessions une semaine,deux sessions l'autre semaine, donc ça va être lundi, mercredi, vendredi une semaine, et la semained'après ça va être mardi, jeudi, des fois un petit peu différent, là vous allez peut-être voir,
00:04:54 :aussi on en a une, je vais vous partager mon écran tout de suite, comme ça ce sera fait.Donc, si je vous partage l'écran ici, encore des gens qui arrivent. Donc, si je vous montre là,
00:05:12 :par exemple, la semaine prochaine, donc vous voyez là, ça commence, enfin c'est ça, vu qu'il y ales événements Discord aussi, donc comme par exemple la semaine prochaine, il y en a un quiva être assez intéressant je pense, on essaye de ne pas se marcher dessus. Donc, comme je vous dis,
00:05:28 :en règle générale, ça devrait être lundi, mercredi, vendredi une semaine, et mardi, jeudi,la semaine d'après, peut-être qu'on fera des week-ends aussi, on va voir. Les week-ends,
00:05:38 :je sais que finalement il y a assez peu d'activités, mais il y a aussi des moments pendant lesquelsc'est les seuls moments où les gens sont disponibles, à l'inverse. Donc là, par exemple,
00:05:46 :la semaine prochaine, vous voyez que finalement, comme il y a le jeudi qui est déjà pris, et queje me suis dit que le week-end ça pouvait être bien, on va en faire une le mardi et une le samedi.
00:05:54 :Donc, c'est des sessions qui ne seront pas spécifiques Tosa, c'est des sessions qui sontdes sessions de mentorat avec aussi des gens premium, donc qui ne sont pas sur le Tosa,pas sur le CPF, qui sont juste des gens qui payent au mois, mais comme je vous disais,voilà, c'est des choses qui vont recouvrir un peu tout, si vous avez des questions,
00:06:12 :ben vous venez les poser aussi, on y répondra. Donc voilà, n'hésitez pas à venir à ces sessionsaussi, si vous êtes disponible, si vous avez des questions, si vous voulez voir ce qui se passe,je pense que c'est toujours très bien pour progresser aussi. Donc, je vois Walid qui nous
00:06:26 :a rejoint, donc Walid, si je ne me trompe pas, toi qui viens de commencer du coup sur le Tosa,mais CPF, donc tu as dû commencer il n'y a pas très longtemps. Là, ce soir, on va revoir des
00:06:37 :notions, je vais aller un petit peu plus loin que ce qu'on avait vu pour ce qu'on fait le Tosa,c'était peut-être un peu vague là ce que j'ai mis dans la description, tout ce qui est objets,gestion mémoire, principes au type d'objet, conversion, vérification, oriente-objet aussi,avec l'héritage si on a le temps à la fin, l'oriente-objet avec l'héritage, ce sera plus
00:06:55 :des révisions. Le reste, même si c'est des choses qu'on avait un petit peu vu, comme je vous dis,on va aller un petit peu plus loin. Donc je vous ai préparé plein d'exemples, plein de choses un
00:07:03 :petit peu plus avancées, des choses qu'on voit un peu moins, des trucs qui peuvent poser problèmecomme d'habitude, je pense que vous commencez à être habitués, il y a la base, il y a les chosesqu'on apprend, et puis après il y a toutes les petits, qu'on appelle ça les edge case, j'ai plus
00:07:17 :le nom en français, les cas particuliers qui font que des fois ça peut faire des trucs unpetit peu bizarres. Donc on va voir pas mal de choses, on va voir IsInstanceType, on va voir
00:07:27 :comment vérifier le type d'un objet, on va voir les différences entre IsInstance et Type, on vavoir les fonctions de conversion, les problèmes qu'on peut avoir avec ces fonctions de conversion,dans quel cas on les utilise, on va voir donc ici plein d'erreurs qui peuvent être causées, on va
00:07:41 :parler des haches aussi un petit peu, notamment du coup voilà quand on essaie de convertir desdictionnaires, on va voir une erreur avec une erreur qui fait un petit peu peur des fois parceque ça nous dit un unhashable, donc il faut déjà savoir ce que c'est un hash, pourquoi un hash comme
00:07:56 :ça, pourquoi dans les dictionnaires ça peut poser problème, etc. On va aller voir aussi un petitpeu le garbage collector, donc là on rentre vraiment justement dans tout ce qui est objet,dans tout ce qui est les références aux objets, les passages en référence aussi quand on passedans une fonction ici, qu'est ce qu'on fait concrètement, comment donc c'est pour ça je
00:08:16 :dis ça va faire des petites révisions aussi parce que là c'est pour ceux qui voient rapidement cequi se passe ici, le coup classique, on passe un objet muable, on le modifie dans la fonction, ça lemodifie en dehors, donc on va revoir cet exemple là mais dans le contexte du garbage collector,
00:08:32 :des références de qu'est ce qu'un objet, qu'est ce qui se passe quand on fait a égale 5, est cequ'on crée une variable, est ce qu'on crée un objet, est ce qu'on crée un nom, etc. On va revenir un
00:08:39 :petit peu tout là dessus, on va voir aussi par exemple ici un autre exemple assez sympa,quelle est la différence entre faire liste égale et liste plus séquence, et le plus égal. On a Kevin
00:08:52 :qui vient d'arriver, qui vient de nous rejoindre aussi, donc voilà je sais pas si Kevin est làpour me passer un message ou si c'est juste pour, je suis en train d'aller regarder mes whatsapp,il y a peut-être un problème quelque part non ? ou c'est juste par curiosité Kevin que tu rejoins ?
00:09:12 :Aucun souci, ok c'est bon, parfait. Donc voilà, quelle est la différence entre ça, parce que voilàça c'est un cas, j'aime bien ce cas là, parce que dans les faits, quand on print la liste à la fin,il n'y a aucune différence, on a les mêmes valeurs, mais quand on va regarder un petit peu plus en
00:09:32 :détail avec le fameux ID ici, on voit qu'il y a des choses qui changent, et c'est important de lesavoir, parce que comme toujours ça peut causer des effets de bord, voilà c'est ça que je cherchais,des effets de bord qui n'est pas exactement la tradition de Edgecase, c'est des scénarios un
00:09:49 :petit peu hors des sentiers qui peuvent arriver dans certains cas. Donc voilà un petit peu pourle programme de ce soir, comme je vous dis on va essayer d'aller un petit peu plus loin que lesbases, mais quand même avec des choses qui sont assez basiques dans l'ensemble, puisque c'est la
00:10:04 :gestion de variables, d'objets, etc. C'est bon pour ça ? Est-ce qu'il y a des questions avant decommencer sur le programme, sur des choses que vous auriez vu dans la semaine, ou déjà avectout ce que je vous ai montré, des petites questions qui apparaissent ? Ou est-ce que ça va jusque là ?
00:10:18 :Je suis un petit peu perdu par rapport au programme, je ne sais pas ce qu'il faut suivre,le planning, qu'est-ce qu'on a dans la semaine, les séances qu'il faut venir assister,c'est que j'ai vu le planning sur le site durant la semaine, mais je n'ai pas assez,est-ce que c'est facultatif tous ces trucs, ou c'est obligatoire, il faut assister à toutes ces
00:11:08 :sessions, etc ? Oui, j'avais prévu de vous envoyer un mail parce que je me suis rendu compteeffectivement que dans toutes les étapes, toi Wally tu es sur le CPF, donc tu es le seulje crois ce soir qui est dans ce cas-là, mais oui je vais te faire recevoir un mail ce soir ou
00:11:25 :demain, parce qu'effectivement je me suis rendu compte que cette partie-là n'était pas suffisammentexplicite. Oui c'est ça, parce que j'essaie maintenant de suivre les cours, en suivant tous
00:11:37 :les cours, on vient de commencer soi-disant, mais il y a beaucoup de sessions, j'ai vu il y aaussi des feuilles d'absence, là je vous ai mis, je sais pas, c'est pour ça je me demande, c'est tout.
00:11:51 :Ouais, bah toi effectivement, je vous remets le lien, je sais pas si vous avez l'historique detout le chat, je vous remets le lien, effectivement là tous les gens qui sont ici ce soir, vous pouvezsigner la feuille de présence, donc c'est oui, dans ton cas effectivement tu peux la signer, et
00:12:09 :c'est pas obligatoire, donc ces sessions-là sont facultatives, toutes les sessions en fait,mais voilà c'est pour justifier de votre, quand on fait le rapport à la fin, pour justifier devotre présence, du nombre d'heures que vous avez suivi, etc. Mais oui donc t'inquiète pas,
00:12:27 :je vais vous envoyer un mail dans ton cas, parce que je me suis rendu compte effectivement quec'était pas assez précis sur sur quelles sont les sessions, qu'est-ce qu'il y a dans les sessions,est-ce que c'est progressif, est-ce que de quoi ça va parler, est-ce que c'est obligatoire, comme tu
00:12:42 :disais, donc je vais clarifier tout ça, t'inquiète pas. Et pour ce soir, je pense que là ça va êtreintéressant même si tu commences, parce que justement ça se peut que des fois tu aies latête qui chauffe un peu, parce qu'on va quand même comme je disais un petit peu rentrer dans des
00:12:54 :trucs plus spécifiques, mais ça va te permettre de voir déjà un petit peu tout ça, d'être confrontéà ces choses là qui sont quand même au début du programme. D'accord, non ça m'inquiète pas,
00:13:05 :j'ai déjà assez d'expérience en tant que développeur, mais c'est juste, je me familiariseavec Python c'est tout, mais je suis soi-disant un expert en COBOL mainframe, c'est mon cursus,j'ai déjà fait du Java avant, ça s'échappe un petit peu, j'ai une expérience dans le développement.
00:13:27 :Ça va être intéressant parce que justement, par exemple là on va voir tout ce qui est passagepar valeur, par référence, c'est des choses qui sont différentes, pas mal différentes selon leslangages, et où justement Python est un petit peu l'ovni par rapport à d'autres langages comme du C
00:13:41 :ou du Java, donc ça ça va être intéressant aussi pour des gens qui, je crois que t'es pas le seulici ce soir, il y en a quelques-uns je crois, Cécile si je me trompe pas par exemple, qui touchent àd'autres langages, donc c'est toujours intéressant les petites piqûres de rappel sur tout ça. Donc
00:13:57 :voilà, on va commencer avec ces petits exemples là, et puis j'ai plein de scripts là,donc ça va être un petit peu, je vais me balader d'un script à un autre parce que j'ai essayé deséparer les choses mais tout ça se fait un petit peu écho. Donc première chose, c'est sur ce qu'on
00:14:14 :appelle les conversions de type, et ce qu'il faut bien comprendre justement c'est qu'à chaque foisqu'on a un égal, je pense que je vais grossir encore un petit peu, je sais pas si c'est, au pire je mebaladerai pour les phrases un peu longues, donc les conversions de type, ça permet de modifier le
00:14:32 :type d'un objet, et c'est là justement, vous allez voir, ça va être, je vais essayer d'être le plusprécis possible sur les termes que j'emploie, et des fois justement là vous voyez j'ai parlé demodifier un objet, donc justement c'est là qu'à chaque fois il faut préciser, parce que quand on
00:14:46 :fait une assignation comme ça en fait, on ne va jamais modifier un objet, on va créer un nouvelobjet, même si vous avez quelque chose d'immuable, et c'est de muable pardon, donc de modifiable commeune liste par exemple, on peut créer une liste vide et la modifier, donc ça c'est un objet muable,
00:15:03 :un objet immuable c'est une chaîne de caractère comme ici, donc ça on peut pas la modifier, maisvous allez voir, et on y reviendra avec cet exemple là, que si on a un objet qui est muablecomme une liste, dès qu'on refait une assignation comme ça en fait, on va créer un nouvel objet. Dans
00:15:20 :ce cas là, quand on fait le plus égal, et c'est là on y reviendra plus en détail comme je vous dis,mais quand on fait le plus égal, là vous allez voir qu'en fait dans ce cas ci, on ne modifie pasl'objet, donc la liste va rester avec le même identifiant mémoire, parce qu'on passe par ce
00:15:33 :plus égal, et donc c'est vraiment la différence entre les deux ici, mais dès que vous avez 1 égalici, on crée un nouvel objet, même si je refais la même chose ici, donc c'est pour ça que si jecrée le même objet avec la même valeur ou une autre valeur, on va créer un nouvel objet, et c'est
00:15:50 :pour ça que quand je dis modifier, quand on fait une conversion ici, quand je dis numstring égaleà la chaîne de caractère 1 2 3, et qu'ensuite même si je le mets dans le même nom ici, doncmême si je refais numstring égale à int de numstring, je recrée un objet, donc on aura un
00:16:05 :autre identifiant en mémoire, et on crée un nouvel objet à partir de mon objet qui était une chaînede caractère ici. Là pour bien séparer les choses, je crée un autre objet, donc on va avoir les deux
00:16:14 :objets en mémoire, le numstring qui va rester inchangé, et le numint qui va être égal ànumstring mais converti en integer. Donc là on va avoir le nombre entier 1 2 3, et non plus la
00:16:26 :chaîne de caractère 1 2 3, mais le numstring n'aura pas été modifié. Et ça c'est donc, c'estle petit attention que j'ai mis ici, c'est l'erreur que je vois la plus courante, les gens qui pensentqu'il suffit de convertir cet objet comme ça, donc de dire je vais convertir numstring en int,
00:16:41 :et ça va modifier l'objet. Donc là c'est pas le cas, parce que déjà premièrement parce que c'estun objet qui est immuable, une chaîne de caractère, il y a certaines fonctions qui vont permettre demodifier l'objet, comme par exemple le sort quand on va trier une liste, on le verra un petit peu,
00:16:58 :je vais vous montrer l'exemple. Mais dans ce cas-ci, quand on fait une fonction de conversioncomme ça, comme string, int, donc si je fais string, si je fais int, si je fais list, si jefais dict, donc toutes ces fonctions comme ça qui sont les fonctions des types natifs qui permettent
00:17:12 :de convertir un objet d'un type à un autre, eh bien il faut vraiment soit le remettre dans lamême variable si on n'a pas envie de créer un autre nom, soit le mettre dans un autre nom,et on peut mettre un numint comme je l'ai fait ici, et on va créer un nouvel objet à partir de
00:17:27 :l'objet d'origine. Donc si je fais pas ça, c'est ce que j'ai mis ici le output, si je ne remets pasça dans une variable, ça va rien changer. Si je fais un print du type de numstring ici, ça sera
00:17:39 :toujours une chaîne de caractère, donc on n'aura rien modifié, on va juste lui dire de faire uneconversion, il va la faire mais il va la stocker nulle part, et après le numstring n'aura pasbougé. Ça va jusque là ? Pour l'instant c'est bon ? Oui, j'ai vu ça dans les cours aussi. Ok,
00:17:58 :parfait. Donc là, voilà, c'est bien important à comprendre, et comme je vous disais, je vaisvous montrer le petit exemple sur la liste, il y a certains objets, certaines variables,certains types d'objets, comme les objets muables, comme les listes, qu'on peut modifier en place,comme on dit en anglais, en place, comme ça. Par exemple si je fais une liste qui est égale à,
00:18:25 :on va mettre 4, 3, 2, 6, et que je fais list.sort, je vais enlever mon copilot, sinon ça va êtreembêtant. Donc là, quand j'utilise la méthode directement sur la liste, on va modifier l'objet
00:18:41 :directement en mémoire. Donc là, on n'a pas besoin, et ça c'est une autre erreur, je vais vousmontrer dans un terminal. Donc si je fais une liste, si je fais list.sort, là la liste a été
00:19:03 :triée directement. Et ça c'est donc l'autre erreur en parallèle à ça, du coup là les gens se disentbon bah ok, dans ce cas-ci il faut que je fasse list.sort comme ça, parce que j'ai appris dans
00:19:13 :mes cours que si je réassignais pas ça dans ma liste, ça ne le stockait pas, et là c'est,attention, l'erreur inverse, c'est-à-dire que list.sort, ça va trier la liste, mais ça ne
00:19:24 :retourne rien. C'est-à-dire que quand je fais ça, là vous voyez, j'ai pas de output, ça m'afficherien ici, ça m'affiche pas la liste triée, donc ça veut dire qu'en fait ça me retourne none. Donc
00:19:33 :si je fais list.sort, et que j'affiche la liste, là il n'y a plus rien dans ma liste. Donc çac'est le petit truc sur lequel il faut faire attention, surtout que dans le cas des listes,on a, et c'est là où ça devient un petit peu confus pour certaines personnes, c'est que si je
00:19:49 :fais sorted de listes, là on a les deux cas de figure, on a soit, voilà Walid, on a soit lafonction, soit la méthode. Donc la fonction par contre, là elle va nous retourner le résultat
00:19:59 :trié, mais elle ne va pas modifier la liste. Donc là vous voyez c'est l'inverse. J'ai un output decette fonction qui est trié, mais je ne modifie pas la liste. Donc là elle n'est pas triée. Donc
00:20:09 :là dans ce cas-ci, si je veux la trier avec ça, il faut que je refasse une assignation dans cecas-ci. Donc là si je fais list.sorted, là je l'ai bien trié et j'ai créé un nouvel objet. Donc ça
00:20:23 :on peut le voir avec la fonction ID de nouveau. Donc si je fais ma liste, je fais un ID de liste,j'ai un certain numéro, et si je fais list.sorted et que je refais mon ID, vous voyez que là,
00:20:35 :le ID a changé. Parce qu'on a donc recréé un objet qui a le même nom, mais on a recréé un objeten fait en mémoire, qui cette fois est égal à l'ancien objet, mais cette fois-ci trié. Donc
00:20:50 :voilà pour cet exemple avec les listes. Donc vous voyez que c'est pas quelque chose d'absolu,ça dépend vraiment de ce que vous utilisez, de si c'est un objet muable ou immuable, de la fonctionque vous utilisez. Quand c'est les fonctions de conversion comme ça, ça va, je réfléchis mais
00:21:06 :je crois pas, il n'y a pas d'exemple dans lesquels ça va modifier. Si on fait un dict, une liste,un int, un string, tout ça, ça va pas modifier l'objet directement. Dans le cas des trucs un
00:21:20 :petit peu plus spécifiques comme le tri, là vous voyez que ça va dépendre de la méthode que vousutilisez. Ok pour ça ? Donc ensuite, le isInstance. Donc isInstance, là j'ai des petits
00:21:35 :exemples pour vous, ça aussi c'est quelque chose qui est assez confus au début parce que les deuxpeuvent faire la même chose, mais dans certains cas ça va pas donner la même chose. Donc quelle
00:21:44 :est la différence entre type et isInstance ? Je vous l'ai mis ici, je vous mettrai les sourcesavec la session après dans un dépôt git. Donc type, ça permet de vérifier un type exact d'un
00:22:00 :objet. Donc là par exemple, truc classique, j'ai un objet qui est le nom x ici qui est associé aunombre entier 5, on lui demande c'est quoi le type de x, il me dit c'est une classe int, si je faisune chaîne de caractère on me dit c'est une classe string, et ça ça me permet de vérifier du coup
00:22:17 :le type d'un objet. Donc là je vais vous montrer par exemple ici, je fais une fonction qui mepermet de vérifier le type de l'objet, ça me permet de vérifier un type très précis. Donc est-ce
00:22:26 :que le type de l'objet est un nombre entier, est-ce que le type de l'objet est une chaîne decaractère, et sinon c'est un autre type. Donc ça nous permet de vérifier par exemple est-ce que 10
00:22:34 :c'est un nombre entier, est-ce que c'est hello, c'est une chaîne de caractère, donc ça peut êtrepratique dans certains cas de figure. Par exemple si vous récupérez des informations, des fois on
00:22:42 :récupère des informations d'une API ou d'un fichier, et en fonction de ce que vous utilisez,ça se peut que l'outil que vous utilisez pour récupérer ces informations fasse une conversiondirectement. Par exemple avec Python 2 ou Python 3, en fonction de ce que vous utilisiez, donc de
00:23:00 :la version que vous utilisez, ça c'est un cas de figure que j'avais eu en entreprise, on avaitplusieurs, on avait des pipelines sur différentes versions de Python, et je sais plus pourquoi onn'arrivait pas à savoir quelle version de Python était utilisée, et comme on avait la différenceentre input et raw input, qui n'est plus d'actualité maintenant avec Python 3 parce qu'on a
00:23:25 :juste input, mais avec Python 2 on avait input et raw input. Donc avec Python 3, input retournetoujours une chaîne de caractère, donc on n'a pas besoin de se poser la question, on a toujours cequi nous est retourné par l'utilisateur qui est une chaîne de caractère même s'il entre un nombre,
00:23:37 :même s'il entre 10, ça va être la chaîne de caractère 10. Donc c'est plus simple parce qu'onsait toujours ce qu'on a en input, et après c'est à nous de faire les vérifications si on veutmodifier le type ou l'utiliser différemment. Par contre avec Python 2, ça pouvait être input
00:23:50 :ou raw input, et raw input de base interprétait ce que vous donniez. Donc si vous donniez unnombre comme 10, il va vous retourner le nombre 10 sous forme de integer. Et là ça peut être un
00:24:02 :exemple où on a besoin de vérifier ce qui nous est retourné, est-ce que c'est un nombre, est-ceque c'est une chaîne de caractère, etc. Quand c'est des types natifs comme ça, souvent on peut
00:24:12 :se contenter de type ici, parce que ça va être, et encore j'allais dire oui et non, parce que parexemple les int et les booléens ça se chevauchent un petit peu des fois. Les booléens sont, je vais
00:24:27 :dire dans le mauvais sens, les booléens sont un sous-type des nombres entiers ou l'inverse,c'est-à-dire que le booléen true ou false c'est l'équivalent de 0 et 1, et dans le code de Pythonen fait les booléens héritent des nombres entiers. Et c'est là où quand on a un héritage, justement,
00:24:45 :ça va être différent avec isInstance. Donc je vous ai montré d'autres petits exemples, donc làvous voyez avec des choses simples comme ça, ça ne change pas grand-chose, et c'est pour ça qu'onpeut confondre les deux et on peut utiliser les deux même des fois pour la même chose, mais là
00:24:58 :encore ça peut créer des effets de bord des fois qui sont inattendus. Donc la même chose, x égale5, isInstance x int, ça nous donne true, isInstance y de string, ça nous donne true. Donc là pour
00:25:10 :l'instant ça change rien. Un des cas de figure dans lequel on peut vouloir utiliser isInstanceen dehors de l'héritage, c'est si on veut vérifier deux types ou plus d'un coup. On peut en mettre
00:25:21 :d'autres ici, on peut vérifier est-ce que c'est un dicte aussi. Donc là par exemple, le casclassique d'un nombre, si on veut vérifier que c'est un nombre au sens large, que ce soit unnombre entier ou un float, on peut faire un isInstance ici avec entre parenthèses les deux
00:25:34 :types. Donc c'est plus simple que de dire if type de x is int or type de x is float. C'est plussimple d'utiliser isInstance dans ce cas-ci avec les deux pour vérifier si ça appartient à l'unou à l'autre. Donc là vous voyez que 10 soit avec 10,5, ça va nous retourner un nombre, int ou float dans
00:25:52 :les deux cas, et avec le hello ça ne va pas nous le retourner. Maintenant là où c'est différent,c'est sur l'héritage. Donc là j'ai un héritage très simple, une classe de base animal et une
00:26:05 :classe dog qui hérite de animal. Et là vous voyez qu'avec isInstance ça va commencer à être unpetit peu différent. Je vous ai pas mis l'exemple avec false d'ailleurs. Donc isInstance dog, est-ce
00:26:19 :que le chien qu'on a créé à partir de dog ici, est-ce que c'est une instance de dog ? Donc làc'est assez logique, oui parce qu'on l'a créé directement à partir de dog. Par contre,
00:26:30 :isInstance dog de animal, c'est aussi vrai parce qu'en fait il va remonter lahiérarchie. Donc est-ce que dog est une instance de animal ? Oui parce que dog hérite de animal.
00:26:41 :Donc il va remonter la chaîne, il va regarder est-ce que dog hérite de animal ? Si oui,dans ce cas-ci dog c'est effectivement une instance de dog mais c'est aussi une instancefinalement de animal puisque dog hérite de animal. Par contre si on vérifie avec le type,
00:26:58 :là vous voyez que c'est false parce que le type de dog c'est pas animal, c'est dog spécifiquement.Et le type ici il va pas remonter la chaîne de hiérarchie comme ça, il va s'arrêter plusbasiquement. Est-ce que c'est un animal ? Non c'est pas directement un type animal,
00:27:13 :c'est un type de dog. Si par contre là je fais isType dog, là ça va me retourner de fou.Et c'est pour ça que je vous disais si je reviens sur mon terminal avec les boules et 1,donc si je fais a égale à true et que je fais isInstance a de bool, là ça me retourne true,
00:27:30 :c'est logique. Et si je fais isInstance a de int, ça va me retourner true aussi. Donc c'estpour ça je vous dis parce que les boules et 1 héritent des nombres puisque true c'est en fait1 et false c'est égal à 0. Donc là vous voyez que dans les deux cas a c'est à la fois une
00:27:48 :instance de boules et 1 mais aussi une instance de int. Alors que si je fais type a isInt, là çasera false. Par contre type a de bool, là c'est vrai. Et Simon pour répondre à des questions,
00:28:04 :inString sont des singleton ? Bonne question, j'imagine que oui. Je sais que none par exempleest un singleton, ces fonctions là de conversion je me suis jamais posé la question, j'ai jamaisvérifié mais je vois pas pourquoi ça ne serait pas des singleton en fait. Je me posais cette
00:28:33 :question parce que comme tu mets type isInt ou type is, en fait c'est l'utilisation du is. Ouioui oui. Oui effectivement dans ce cas-ci, après là c'est plus un truc sémantique dans le sens
00:28:51 :où quand on utilise égal égal, là vu que les valeurs, attend je réfléchis parce que oui lavaleur sera la même oui mais après c'est que tu vois là tu vas pas vérifier une valeur, tu veuxvérifier si c'est le type que tu vérifies mais parce que le égal égal c'est pour vérifier les
00:29:15 :égalités entre les valeurs des objets donc si t'as vraiment une liste qui contient les mêmesvaleurs ou une variable qui contient les mêmes valeurs. Donc à chaque fois quand j'utilise les
00:29:25 :types je le fais avec is même si ça peut marcher aussi avec l'égal égal. D'autres questions surtout ça, les types, isInstance, donc dans quel cas on utilise, et là c'est ce que je vous ai misà la fin en résumé, donc pourquoi utiliser type ? C'est ça, faut faire attention parce que c'est
00:29:50 :ça, isInstance peut vous faire des effets de bord des fois si vous le prévoyez pas, si vous vousdites bon en fait c'est pareil type isInstance donc je vais pas m'embêter je vais toujoursutiliser isInstance, faites attention parce que des fois il peut y avoir des cas de figure dans
00:30:02 :lequel vous ne voulez pas forcément que ça remonte dans la hiérarchie de votre orientéobjet, enfin de vos classes, il y a des cas où vous voulez vraiment spécifiquement vérifierque c'est une classe spécifique sans que ça remonte la chaîne d'héritage.
00:30:19 :Et sinon isInstance, donc voilà si vous voulez vérifier si un objet est instance d'une classeou d'une sous-classe, là aussi dans le sens inverse ça peut être utile si vous avez unehiérarchie comme ça avec une classe personne, une classe comme je montre dans les formations,une classe student, une classe prof, une classe etc, et vous voulez vérifier par exemple que,
00:30:41 :et qu'à côté vous avez des classes avec des animaux et tout, et vous voulez vérifier engénéral qu'un de vos objets est dans la classe humain on va dire ou la classe animaux,bah là vous pouvez vérifier avec isInstance si ça va être de type prof, student, etc,ou si ça va être de type chien, chat, animal, etc. Donc là si vous vérifiez animal au sens large,
00:31:04 :ça va vérifier si vous donnez des chats, des chiens, etc, ça va remonter jusqu'à l'animalet ça va définir que c'est un animal, et si vous avez human, bah là que ce soit un prof,un student, ça va remonter la chaîne aussi et définir que le prof est un humain et qu'à
00:31:18 :l'inverse le chat est un animal. Et pour les vérifications multiples aussi comme je vousdisais, donc si vraiment là vous avez des choses isolées aussi, parce que là il faut faire attentionsi vous voulez vérifier plusieurs choses, donc si vous avez plusieurs classes à vérifier mais quevous voulez pas que ça remonte la chaîne de hiérarchie, bah là ça peut être sournois avec
00:31:38 :isInstance parce qu'il va remonter la chaîne, donc faites gaffe quand même. Si vous avez plusieurschoses à vérifier mais que vous voulez vérifier des types précis, faites un type avec plusieursconditions. Ok, donc, ouais bon là j'étais parti sur les, on verra ça, je sais pas pourquoi j'étais
00:31:57 :parti dans ma préparation sur ces petits exercices là avec les compréhensions de listes, maisfinalement ça sort un petit peu du sujet donc je vais passer là-dessus. Et on va aller voir,
00:32:09 :donc ouais, les conversions, on va revenir là-dessus sur les conversions, parce que les conversions çapeut causer des problèmes, c'est pour ça, ça c'est un des premiers trucs que je montre aussidans la formation avec les calculettes etc, sur le fait que c'est pour ça qu'on vérifie le type
00:32:25 :des objets, enfin de l'input de l'utilisateur avec isDigit, donc puisque dans le cas de Python 3comme je vous ai dit, avec Input on récupère toujours une chaîne de caractère, mais après sion veut faire des conversions, donc si on veut convertir pour faire, comme dans le cas de la
00:32:40 :calculatrice, des opérations, il faut qu'on puisse, il y a un mot qui vient d'arriver, il faut qu'onpuisse s'assurer du type avant, ou alors si on veut pas faire une vérification avecisDigit comme je le montre, on peut faire un try-except, et parce qu'effectivement on peutavoir des cas de figure dans lesquels on va avoir des erreurs. Les erreurs ça peut être parce
00:33:02 :qu'on donne pas des bonnes données, donc là par exemple je donne 1, 2, 3, ABC, donc là c'est mêmepas une question de Python ou pas, voilà, on pourrait se dire qu'il y a des, je sais pas siça existe, il y a peut-être des langages de programmation, on leur donne ça et ils se disent
00:33:14 :bon ok, je vais faire un try, je vais garder, si j'essaie de convertir cette chaîne de caractèreen int et qu'ils me donnent des lettres, je vais juste enlever toutes les lettres et faire, voilà,faire 1, 2, 3, je réfléchis là avec Javascript, ce qu'il fait c'est quand on additionne, il va
00:33:30 :forcer la conversion de quelque chose qui n'est pas forcément un nombre en nombre, Python il vapas réussir là dessus, mais là voilà c'est assez logique moi je trouve dans ce cas-ci parce que bon,on lui donne des lettres, il sait pas quoi faire avec le ABC, donc voilà, merci Walid qui a de
00:33:47 :l'expérience sur plusieurs langages, voilà j'ai pas non plus, j'ai jamais testé de langage commeça qui prenait cette décision à notre place de se dire je vais faire une regex pour récupérerles nombres, isoler les trucs et puis convertir, donc voilà ça c'est pas étonnant, il y a des
00:34:01 :choses peut-être un peu plus étonnantes, par exemple le liste ici, on pourrait se dire tienspourquoi je peux pas convertir une liste, on peut convertir si je fais 1, 2, 3 comme ça,je vais vous le montrer dans un terminal, si je fais ça comme ça, là on peut lui passer une
00:34:17 :chaîne de caractère et il va réussir à, dans ce cas-ci, là encore on pourrait se dire il y ades langages où ça nous retournerait une erreur en disant non je sais pas quoi faire, je sais pascomment tu veux que je le sépare, là les gens qu'on connaît Python, ils se sont dit bah si en
00:34:29 :fait c'est assez logique puisque une chaîne de caractère c'est une suite de caractères, donc onva juste mettre chaque caractère dans un élément et là encore il y a un parti prix qui est prisquand même parce qu'on pourrait se dire, enfin oui et non, parce que dans ce cas-ci on a juste des
00:34:43 :chiffres mais vous voyez qu'il nous met bien, du coup il ne met pas 1, 2, 3 en int, il les gardebien en chaîne de caractère, ce qui est logique parce que si on a a, b, c à la place après çava être des chaînes de caractère aussi, donc il va pas faire une conversion si c'est des nombres et
00:34:55 :des lettres gardées en chaîne de caractère, il va à chaque fois garder des chaînes de caractèremême si on a des nombres ici. Par contre si je fais liste 1, 2, 3 ici, là vous voyez on a un
00:35:07 :problème parce que le liste en fait pour pouvoir faire la conversion il faut lui passer un itérable,donc c'est pour ça que ça va marcher avec d'autres types, si je lui donne un tuple par exemple 3comme ça ici, il va convertir mon tuple en liste parce que le tuple est un itérable, une chaîne
00:35:23 :de caractère aussi on peut itérer dessus, donc l'itérable c'est voilà si je fais 1, 2, 3comme ça et que je veux itérer dessus soit avec une boucle soit récupérer un élément comme çaavec les indices, c'est un objet itérable. Un nombre ici je peux pas itérer dessus, là encore
00:35:40 :c'est des choses des fois qui surprennent les débutants, ils se disent bah pourquoi je peuxpas faire ça et ça me retourne tout simplement le premier intégre, pourquoi pas, on aurait pupenser que les développeurs de Python se seraient dit bah oui ça peut être utile, allez on va le
00:35:51 :rendre possible mais là c'est pas le cas. Donc c'est ce qui fait que quand on essaie de leconvertir en liste ça ne fonctionne pas et on a cette erreur. Donc vous voyez c'est pour ça là
00:36:01 :encore il faut le savoir si vous avez un nombre, je pense que je dois avoir des exercices là dessussur docstring où je vous demande de faire des opérations comme ça où vous avez un nombreen input, on veut ensuite le séparer, imaginons qu'en input on ait des nombres comme ça et que
00:36:18 :là on veut trier tout ça. Je sais pas si j'ai un exercice là dessus sur docstring mais ça pourraitêtre un bon exercice. Donc imaginons que j'ai un nombre comme ça et on se dit bon en fait j'aimerais,
00:36:32 :je vois pas trop de cas de figure dans lesquels ça pourrait être utile mais bon, imaginons quelà je me dis j'aimerais en fait prendre ce nombre et le trier, c'est à dire avoir 2, 2, 3, 4, 4, 5,8. Là si je fais ça, ça marche pas. Donc là il faudrait déjà faire justement une fonction de
00:36:49 :conversion. Donc on va, imaginons qu'on ait input user égal à ça, là il faudrait donc le convertirdonc on va dire input user as a string par exemple, là on va le convertir. Donc on se retrouve bien
00:37:03 :avec notre input user qui est toujours là, qui est toujours comme on l'a vu il y a cinq minutesun int et notre input user as string qui lui est bien une chaîne de caractère. Et ensuite là je
00:37:15 :peux dire ok on va faire liste de input user as string. Donc là je vais bien me retrouver avecdes éléments séparés et là justement on se retrouve avec notre compréhension de liste quej'avais montré parce que là si je fais .sort pour trier la liste, alors je vais faire sorted
00:37:36 :plutôt justement ici pour afficher le résultat. Donc là vous voyez dans ce cas-ci ça marcheparce qu'il va quand même réussir à trier même si c'est des nombres dans des chaînes decaractère, il va les trier correctement. Mais si après tout ça je veux le récupérer en nombre,
00:37:52 :là je pourrais faire une compréhension de liste et faire int de i, for i, in, comme ça. Et là onpourrait faire tout ça en une ligne, c'est pas forcément très beau mais vous voyez comment onpeut résoudre ce problème là dans ce cas-ci et à la fin on pourrait regrouper tout ça. Donc là
00:38:11 :si on voulait regrouper tout ça on serait pas obligé de justement de les convertir, on pourraitfaire juste un join. Je sais que j'ai quelques exercices comme ça sur docstring, pas exactement
00:38:23 :comme ça. Ouais voilà c'est ça Arnaud, je peux faire ça et après faire un int de tout ça. Donclà vous voyez ça c'est pas des exercices, et là je retrouve mon nombre trié cette fois-ci. J'ai
00:38:35 :cet exercice je sais avec des noms dans une chaîne de caractère, donc il y a Marc, Julie, Patrick,machin tout ça, dans une chaîne de caractère comme ça, Patrick, Julie et Marc, et je demandede remettre tout ça dans l'ordre alphabétique, dans ce cas-ci d'avoir Julie, Marc et Patrick,
00:38:57 :si ma mémoire de l'alphabet est bonne. Et donc là justement ça c'est des trucs qui sont quandmême comme je vous dis, dans le cas du nombre là, bon je vois pas comme ça d'exemple très précis,mais ça vous force à manipuler tout ça parce que là il y a dix mille choses qui peuvent ne
00:39:15 :pas fonctionner. Vous pouvez avoir justement des erreurs comme on l'a vu avec les erreursde conversion ici, parce que vous essayez de convertir un objet qui n'est pas itérable.
00:39:22 :Vous pouvez avoir des erreurs après parce que si je me trompe pas, dans quel cas de figure ? Ouivoilà c'est ça, si on fait un join, si on fait un join mais qu'on a des nombres, donc si ici parexemple, imaginons que je mette tout ça dans une liste, donc on va dire liste triée, donc là j'ai
00:39:42 :ma liste triée comme ça, et imaginons que cette liste triée là je la convertisse en nombre. Doncje vais faire int de i for i in liste triée, donc je la retrie, enfin je la convertis comme ça avecjuste des nombres. Là je peux plus faire le join, parce que le join ne va pas vouloir être fait
00:39:59 :avec, si je prends ma liste triée ici, juste avec ça en fait, si je prends ma liste triée ici vousvoyez, il ne veut pas, là encore, petite chose qui aurait pu être prévue ou voulue par lesdéveloppeurs de Python, mais là c'est pas le cas. Donc si vous avez le cas inverse, c'est à dire une
00:40:22 :liste avec des nombres et que vous voulez les joindre ensemble, là ça veut dire qu'il fautfaire le truc inverse, c'est à dire que depuis votre liste, il va falloir convertir les élémentsen chaînes de caractères pour ensuite pouvoir les joindre ensemble. Donc vous voyez ça c'est
00:40:36 :c'est important parce qu'il y a plein d'erreurs possibles, il y a plein de petits trucs, il fautsavoir dans quel ordre mettre les trucs, il faut savoir là si on fait le sorted, est-ce que ça vanous trier la liste sur place, ou est-ce que ça va nous la retourner, vous voyez il y a plein plein
00:40:48 :plein de petites choses comme ça, donc c'est pour ça que j'aime bien ces exercices là, pour voir unpetit peu comment on peut naviguer à travers tout ça et être forcé à manipuler tout ça. Et merci
00:40:57 :Kevin pour le lien de l'exercice, je crois que je vous l'avais donné à faire d'ailleurs pour ceTosa, mais je parle plus pour Walid du coup, parce que là Walid pour te situer aussi le contexte,là on a des gens qui ont commencé le 15 avril avant qu'on ait le CPF, donc il y a une grosse
00:41:13 :batch de 12 personnes qui ont commencé tous en même temps, donc voilà c'est pour ça que jefais référence à eux. Et là on a une autre erreur aussi, je regarde le temps là, ok on avance bien,
00:41:28 :là une autre erreur qui est courante, qu'on voit passer assez régulièrement et qu'on a dans ce casci, c'est cette erreur là, erreur de conversion un hashable type, d'ailleurs Kevin va vous faireun glossaire là dessus, parce qu'on n'a pas de glossaire sur le hashable, qu'est ce que ça veut
00:41:47 :dire, qu'est ce que c'est, pourquoi on a cette erreur là. Alors je vais vous expliquer vite fait, et Arnaudoui, alors ça j'ai toujours un petit doute dans le sens où me semble, j'ai toujours une petite voixdans ma tête qui me dit qu'il y a des cas de figure dans lequel c'est pas le cas, donc c'est
00:42:05 :pas une vérité absolue, donc Arnaud qui dit généralement les méthodes agissent directementsur l'élément et les fonctions on doit les attribuer à des variables, oui sauf que, parcequ'en fait, si je me trompe pas, les cas de figure dans lesquels ça s'applique pas justement c'estquand tu as des objets qui sont immuables, parce que le fait que la méthode, quand on a
00:42:27 :notre list.sort, ça peut la trier directement, c'est parce que ça peut, on peut modifier, enfin c'estun objet muable donc on peut le modifier, mais si tu as, j'ai pas d'exemple en tête là, mais si tuavais une chaîne de caractère sur laquelle il y avait quelque chose, par exemple voilà,
00:42:43 :Upper par exemple, oui voilà, ça c'est un bon exemple, donc j'ai, on va dire,nom égale Patrick et je veux le capitalise comme ça, donc là voilà, ça c'est un exemple où on aune méthode et c'est pour ça que je dis que c'est pas universel, on pourrait se dire ok la chose
00:43:02 :qu'il faut que je retienne c'est dès qu'on a une méthode sur un objet ça veut dire que j'ai pasbesoin de le remettre dans mon objet, enfin le remettre, j'ai pas besoin de réassigner justement,là c'est pas le cas parce que comme une chaîne de caractère n'est pas un objet muable,
00:43:16 :puis t'on peut pas aller modifier juste le P pour le mettre en majuscule et garder notrenotre objet nom en mémoire inchangé, donc là dans ce cas-ci il faut recréer une variable avecle même nom ou avec un autre nom, là encore si on crée avec le même nom ça va juste entre guillemets
00:43:33 :écraser, là encore vous voyez dans la sémantique il faut faire attention parce que quand on ditécraser ça peut donner l'impression que ça va juste remplacer ce qu'il y a à l'intérieur de lavariable alors qu'en fait non ça va créer un nouvel objet, c'est pour ça que le id est important ici,
00:43:48 :si je fais nom égale patrick comme ça, que je fais id de nom et qu'ensuite je fais,je l'ai plus, je l'ai plus, non ok bon, nom égale nom.capitalize, que je fais id de nom,
00:44:03 :là vous voyez on a toujours le même nom, c'est le cas de le dire, on a le même nom qui estassocié à notre objet mais l'objet n'est plus le même, on a créé un autre objet et finalementparce que voilà on a une assignation, comme je vous disais dès que vous avez une assignation ici
00:44:20 :ça va créer, même si c'est un objet muable, comme j'ai dit même si c'est une liste, ça va créer unnouvel objet. Ok donc et ça me permet, ah oui je vais faire l'explication sur le h et après on va
00:44:33 :revenir du coup sur cet exemple avec la liste, je vais vous montrer pour bien voir avec l'id cequi change et pas. Et al effectivement oui tout ça fait écho à ce qu'on a vu là pour ce qui était
00:44:43 :là il y a quelques sessions avec les, et Walid si tu veux revoir ces éléments là, je sais pas siKevin tu peux me le retrouver, c'était il y a peut-être un mois et demi, j'ai fait une grossesession du coup avec les étudiants Tosa sur tout ce qu'était mémoire, justement quand on fait,
00:45:00 :quand on a une liste, qu'on fait a égale une liste, b égale a, qu'on modifie b, ça aussi Walid ça doitêtre des trucs auxquels tu es un petit peu habitué, j'imagine si tu as fait d'autres langages, c'esttout ce qui est gestion de mémoire, tout ce qui est, qu'est ce qui se passe en arrière-plan, bon
00:45:13 :voilà tu sais qu'il faut faire, voilà tu sais qu'il faut faire attention avec tout ça et quequand on modifie quelque chose à un endroit ça peut très facilement le modifier à un autre endroitsi on sait pas ce qu'on fait et causer des gros problèmes, donc voilà je laisse Kevin aller
00:45:27 :rechercher ça s'il le trouve, donc voilà donc pour ceux qui avaient vu tout ça aussi, ça doit vousrappeler des choses, comment faire avec le copy, voilà si on veut vraiment s'assurer que c'est desobjets distincts avec les listes, avec les listes imbriquées, le copy, le deep copy, tout ça, des
00:45:44 :choses très importantes là dessus, donc n'hésitez pas à aller le revoir aussi. Et donc le hash,qu'est ce que c'est ? Donc je vais vous montrer ça, en fait le hash c'est quelque chose qu'on
00:45:52 :voit notamment si vous êtes dans git, pour ceux qui ont fait un peu de git, les hashes en faitc'est très très utilisé dans git parce que ça permet d'identifier de façon unique un élément,redis, ah redis oui, ça c'est la déformation tech, redis, je pensais que tu parlais de redis
00:46:16 :pour la base des années. Le sujet du mentorat c'était je pense c'était la première ou deuxièmesession de Toza, donc elle doit être identifiée comme telle, c'était sur tout ce qui étaitjustement copie, cherche deep copy ou copie avec la recherche et filtre par session de mentorat,tu devrais tomber dessus parce que je crois qu'elle doit être transcrite, il y a les sous-titres,
00:46:42 :donc tu devrais la retrouver en cherchant deep copy, en cherchant dans les sessions de mentorat.Donc le hash en fait c'est très pratique parce que ça ne va pas changer en fait,donc dans le cas de Python j'avais vérifié, en fait ça va être différent quand vous relancezvos scripts, donc là par exemple vous voyez, je vais prendre un autre exemple, celui-là ici,
00:47:07 :donc là vous voyez si je le relance, ici dans l'exécution du script on va toujours avoir lemême hash, mais si je relance le script là ça se peut que le hash soit différent, ce quinormalement ne devrait pas être le cas avec un hash, parce que c'est donc là je reviens sur mon cas
00:47:26 :de git, c'est très intéressant pour faire des comparaisons, c'est ce qui est utilisé pour lesmots de passe par exemple, vous faites un hash du mot de passe et ce que vous stockez en basede données c'est pas le mot de passe en tant que tel mais c'est le hash et après vous pouvez
00:47:38 :comparer les hashes pour vérifier si le mot de passe est le même et si vous pouvez vousloguer sans avoir à stocker le mot de passe en clair, et pour git en fait ça va permettre,si vous prenez un fichier texte en fait, vous avez un fichier, vous créez un hash à partir du
00:47:53 :contenu du fichier et vous êtes assuré avec un hash suffisamment long que vous n'aurez pas dehash similaire et par contre si vous changez un seul petit élément, vous changez une lettre dansle fichier, le hash sera différent, donc ça permet de facilement, sans avoir besoin de comparer des
00:48:11 :fichiers qui pourraient être assez énormes, imaginez si vous devez comparer pour vérifiers'il y a eu des différences entre deux versions de fichiers et le fichier au complet, c'est pastrès pratique, si votre fichier fait 50 000 lignes ça va pas être très pratique, par contre si vouscréez un hash de 300 caractères qui identifie de façon unique le contenu de votre fichier,
00:48:28 :parce que comme je vous dis en fait il peut pas y en avoir deux similaires, là ça va être plusfacile de comparer, de faire un hash pour votre fichier à l'instant T, de faire un hash pourvotre fichier à un autre moment, si le hash n'a pas bougé ça veut dire que le contenu du fichier
00:48:42 :n'a pas bougé et s'il y a juste un espace en plus, une lettre en plus ou en moins, le hash seradifférent et là ça indique qu'il y a eu un changement et après on vérifie lequel. Donc le
00:48:53 :hash en fait c'est utilisé par les dictionnaires, on parle de table de hash, donc en fait c'estutilisé par le dictionnaire et c'est ça qui fait que c'est très rapide aussi, je vous ai fait unpetit test ici, dictionnaire optimisation, ça aussi c'est quelque chose qu'on retrouve souventdans les évaluations Tosa, sur l'optimisation le dictionnaire est très pratique parce que comme
00:49:16 :on peut pas avoir deux clés avec la même valeur, enfin on peut pas avoir deux clés avec le mêmenom en fait, si je crée une clé 1, enfin comment vous dire, si je fais un dictionnaire comme ça jepeux pas faire A égale 1 et une autre clé A comme ça, je peux pas en avoir deux, ça va pas marcher.
00:49:39 :Donc là si je fais ça vous voyez au final il n'en reste qu'une, on n'a pas d'erreur dans ce cas-ci,mais au final il va pas garder la première, on n'en aura qu'une, ce qui fait que c'est trèspratique parce que du coup là si je lance l'optimisation, on a là encore si vous vous
00:49:52 :rappelez ce qu'on avait parlé sur l'optimisation, la notation O comme ça avec le 1 versus ON,donc ça veut dire que peu importe la taille de votre dictionnaire, votre dictionnaire peut êtreimmense, si vous allez chercher une clé dans le dictionnaire, que le dictionnaire il ait deuxentrées ou dix mille, ça va pas être plus long, ça va pas être exponentiel en fonction de la taille
00:50:11 :de la liste, ce qui est différent du dictionnaire. Ce qui est différent quand par exemple vous faitesdes opérations comme on l'avait vu là encore, on a fait un mentorat là-dessus il y a peut-êtredeux trois semaines, où on voyait qu'on peut avoir des opérations qui sont de type O, N comme ça,
00:50:26 :donc ça veut dire que ça va dépendre de la taille de la liste, donc par exemple pour parcourir uneliste, c'est le cas le plus classique, si vous faites une boucle 4, de façon très logique sila liste a dix éléments ou si elle en a dix mille, ça va être plus long avec dix mille qu'avec dix,
00:50:39 :parce qu'il va falloir passer sur dix mille éléments au lieu de dix, donc là on a une complexité quiest de 0N parce que ça va dépendre de la taille de la liste, donc ça va être dix fois long,si on peut dire comme ça, avec une liste de dix, et mille fois long avec une liste de mille,
00:50:54 :et dix mille fois long avec une liste de dix mille, et on a des trucs exponentiels aussi,le bon exemple c'est le logarithmique avec le sort, avec les algorithmes de tri,où là on voit très bien, je vous avais montré les petites vidéos youtube, où on voit très bien
00:51:12 :qu'avec le tri à bulles c'est pas le plus efficace, parce qu'à chaque fois il repasse sur tous leséléments, et on voit que pour trier une liste, ça prend beaucoup beaucoup de temps avec ça,et qu'il y a d'autres algorithmes de tri qui sont un peu plus efficaces, mais que quand même ça
00:51:25 :nécessite pas mal de calcul. Je reviens sur mon dictionnaire, là si je lance ça, vous voyez on ades dictionnaires assez larges, c'est pas incommensurable, mais quand même, et si je lancele script là, ça va être très rapide, vous voyez là on a des exposants, donc 10 puissance moins 6,
00:51:41 :donc on est à 0,000, temps d'insertion c'est tellement faible qu'il l'affiche pas, le tempsd'accès on est à 0,000, et le temps de suppression pareil 0,0003. Donc ça ça fonctionne parce que
00:52:00 :voilà, si on avait un dictionnaire avec potentiellement deux clés, il faudrait qu'ilaille vérifier potentiellement où sont les clés, qu'il fasse plus d'opérations, là comme il y al'unicité des clés, ça pose pas ce problème. Et je reviens donc dans mon dictionnaire,
00:52:17 :oui voilà avec les haches. Donc en fait, là pourquoi on a une erreur ici, parce qu'on luipasse un élément muable, donc ça c'est la règle numéro 1 si je puis dire des dictionnaires, c'estqu'il faut que votre clé, la clé du dictionnaire, ça peut être plein de types d'objets différents,
00:52:35 :ça peut être une chaîne de caractère, un nombre, etc, mais ça peut pas être un objet qui va êtremodifié, donc c'est ça le fameux unhashable, parce que si en fait l'élément ici est modifié,ça va changer son hash, comme je vous ai dit avec les fichiers git, c'est la même chose,
00:52:54 :si notre liste elle a zéro élément, ensuite elle en a un, elle en a deux, et qu'elle bouge,le hash va être différent, et du coup ça veut dire que dans notre dictionnaire, il faudraitqu'il change le hash de la clé, et du coup ça tue un petit peu l'optimisation du dictionnaire.
00:53:08 :C'est pour ça que les clés, il faut que ce soit des objets dont le hash ne bouge pas.Donc c'est pour ça que là, dans ce cas-ci, si j'essaye de créer, alors là je fais une fonctionde conversion, mais ça serait la même chose si on essayait de créer un dictionnaire, c'est juste
00:53:23 :pour vous montrer le type d'erreur qu'on peut avoir, mais si j'essayais de créer un dictionnaireavec une liste comme ça, ça serait la même chose. Donc si je fais un dictionnaire avec 2.a comme ça,
00:53:34 :là c'est pareil, un hashable type liste, c'est la même erreur qu'on a. Donc voilà,c'est pas une question de fonction de conversion, c'est le principe de fonctionnement des dictionnairesqui fait que quand on essaye de créer un dictionnaire ou de le convertir comme ça,on aura cette erreur dans ce cas-ci. Ça va pour tout ça, ça fait beaucoup beaucoup de petits
00:53:57 :trucs, mais après comme je vous dis, tout ça il faut aussi, voilà, là encore des choses,il faut tester, il faut tomber sur ces erreurs pour les voir, je sais juste que voilà, ça c'estle genre d'erreur aussi, je me souviens vraiment être tombé sur les hashable type, etc. et être
00:54:10 :là à ne pas comprendre, et finalement à régler le problème sans comprendre ce qui se passaitderrière, donc à me dire, ok, à comprendre finalement, ok bon là j'avais mis une liste,il veut pas, ok je l'enlève, c'est bon, et finalement après on comprend pourquoi on peutpas faire ça, qu'est-ce que ça implique, pourquoi ça peut être problématique d'avoir des changements
00:54:32 :comme ça dans les éléments, donc c'est toujours mieux de comprendre pourquoi ça cause des problèmesderrière. Ok, on arrive à la fin, j'ai deux petites choses à vous montrer, on va parler un
00:54:43 :petit peu du garbage collector et ça va faire écho à tout ça aussi, et je reviens sur cet exemple là,donc comme je vous disais, on a une liste, une séquence qu'on veut ajouter, et on pourraitpenser que faire ça, ou faire ça ici, c'est la même chose, mais en fait non, parce que là quand
00:55:00 :on a plus égale, en fait ce qu'on voit pas, comme beaucoup de choses en Python, et j'ai envie de direheureusement parce que ça veut dire qu'on n'a pas besoin de le faire à la main, c'est qu'on aune fonction ici qui est la fonction, enfin une méthode, qui est la méthode iadd, et implement,
00:55:15 :vous voyez, self plus égal value. C'est toujours intéressant d'aller voir ces fonctions spécifiques,il y en a plein, ça permet de faire des trucs assez avancés, ça permet des fois de faire destrucs qu'on ne pourrait pas faire dans certains contextes, ça permet de créer ses propres objetsaussi, parce que tout ça finalement c'est des objets Python, mais vous pouvez créer vos
00:55:36 :propres objets qui vont réimplémenter ces choses là, pour vous permettre de faire ces mêmesopérations. Un exemple qu'on peut avoir, vous faites une classe pour gérer des comptes bancaires,
00:55:46 :et vous vous dites ok, on va avoir des opérations de fusion de comptes des fois, donc on va avoirun compte bancaire, on va avoir quelqu'un qui a plusieurs comptes bancaires, ça me fait penserque j'ai regardé l'arnaque du siècle hier, la fraude à la taxe carbone, je pourrais faire un
00:56:03 :petit exercice là dessus pour ceux qui l'ont vu, où le gars justement à la fin il dit qu'il atellement de comptes qu'il sait même plus ce qu'il a fermé ou pas, donc voilà on pourrait avoir unscénario comme ça avec quelqu'un qui a tellement de comptes bancaires qu'à un moment il veut les
00:56:14 :fusionner, et là justement on pourrait se dire bon je vais faire une méthode qui va me permettreon pourrait se dire si je reviens là, on va faire compte01.merge avec compte02 et puis après faire
00:56:30 :un point merge avec compte03, un truc comme ça, mais bon vous voyez que c'est pas très, ça peutmarcher mais c'est pas très lisible, et à l'inverse on peut se dire ce serait quand même mieux depouvoir faire compte01 plus compte02 plus compte03, vous êtes d'accord que c'est quand même un peu
00:56:45 :plus facile à lire, et en même temps on n'a pas envie de faire compte01, c'est pour ça que jevous dis que c'est pratique ces petits trucs là, .a de compte02, on pourrait le faire dans ce cas
00:56:55 :ci, et ça revient au même en fait du coup de faire ça, parce que finalement c'est ce quefait Python derrière, et c'est pareil avec le plus égal, mais voilà c'est ce que vous pouvezimplémenter derrière, donc c'est pratique d'implémenter ces choses là, et c'est là où je vous dis
00:57:10 :voilà ça va être un comportement custom à chaque fois, vous pouvez dire en fait c'est pas possible,par défaut si vous l'implémentez pas ça va pas être possible, il va vous retourner une erreur,il va vous dire vous pouvez pas additionner deux instances, parce que vous lui avez pas dit quoi
00:57:23 :faire, si vous avez des comptes bancaires avec des attributs, nombre d'argent dans le compte etc,et que vous lui dites fais moi juste un plus, lui il sait pas quoi faire, qu'est ce que j'additionne,est ce que j'additionne les id des comptes, les montants dans les comptes etc, je sais pas. Par
00:57:37 :contre si vous lui faites cette méthode add et que vous lui dites bon ok quand t'additionne plusieurscomptes ensemble, ce que tu fais c'est que tu additionnes tous les montants des comptes, et tusupprimes le compte qui a été additionné, ben voilà ça peut être un truc que vous implémentez de
00:57:49 :votre côté. Et donc le I add ici c'est le plus égal, on a la même chose avec I mult fois égal,on va avoir la même chose avec division aussi si je me trompe pas, on peut faire, c'est pas quelquechose que je fais très souvent aussi, c'est pour ça j'ai un petit doute, mais on doit pouvoir faire
00:58:09 :a égale 5 et a divisé égal par 2, donc on doit avoir un I diff quelque part, c'est pas des chosesqu'on utilise très souvent donc comme je vous dis j'ai un doute, mais voilà donc ça par contre çava pas être pareil dans l'implémentation justement avec des objets qui sont muables, parce que donc
00:58:32 :là si je lance le script vous allez voir ça va faire beaucoup de choses printées à la suite,donc on a l'idée initiale de la liste 3 4 4, quand on fait liste égale liste plus sec, comme je vousdis quand on a une assignation ici même si c'est un objet muable on crée un nouvel objet en mémoire,
00:58:48 :donc là sans surprise on a deux id différents parce qu'on a juste dit que la liste est égaleà elle même plus une séquence, donc là on l'a vu, une assignation, on crée un nouvel objet en mémoireet comme on écrase parce que voilà on aura plus la liste d'origine parce qu'on utilise le même
00:59:04 :nom et on peut pas avoir deux noms similaires qui pointent vers deux objets différents, donclà on l'écrase entre guillemets, dans l'autre cas par contre vous voyez que là l'id il change pas,après liste plus égale séquence on va ajouter, donc en fait ce qui se passe dans l'implémentation
00:59:23 :derrière quand Python il fait ça, c'est qu'on fait liste point iadd séquence, donc c'est comme ça queça se passe et si on imagine l'implémentation du coup de la liste derrière, dans ce truc on vaavoir la séquence à ajouter et là en fait il va faire un self.append de la séquence, donc en fait
00:59:44 :il va ajouter ces éléments ou extend de la séquence, donc là on voit bien que voilà çava pas créer un nouvel objet, ça va pas retourner notre self plus la séquence, là ce qui créeraitun nouvel objet, ça va juste l'étendre ou le extend pour l'ajouter à notre liste sans modifier
01:00:09 :l'objet. Donc là vous voyez c'est quand même important de savoir ça ici parce que déjà auniveau de l'utilisation de la mémoire si vous avez un script qui va faire ça des milliards defois à la seconde, c'est plus intéressant de faire un plus égal que de faire un plus égal plus
01:00:24 :un liste plus séquence parce que vous n'allez pas recréer un objet en mémoire à chaque fois, donc auniveau de l'optimisation de votre script c'est plus intéressant ici de faire un plus égal maisaussi parce que justement dans ce cas-ci vous allez créer un nouvel objet et là encore avec toutes les
01:00:39 :implications potentielles que ça pourrait avoir. Alors j'arrive à Arnaud ce que tu disais pour lagestion des mots de passe, les haches pour les comptes crypto, les adresses de portefeuille sontrésultables plusieurs haches successives pour les rendre uniques. Oui je ne suis pas un expert en
01:00:56 :crypto mais effectivement j'imagine que pour tout ce qui est blockchain ça doit être assezimportant d'avoir des choses uniques pour tout ça, quand on fait des transactions là pourvalider qu'il n'y a pas de transaction similaire, j'imagine que c'est effectivement tous ces... enfin
01:01:10 :le hache aussi avec probablement une surcouche comme tu dis pour s'assurer que ça ne va pascauser de problème parce que j'imagine que si sur le bitcoin à un moment il y a deux transactionsavec le même ID. Oui c'est l'algorithme SHA256 qui est un algorithme plus sécurisé, plus robuste du
01:01:31 :hachage. Oui effectivement il y a le SHA128 l'autre ou encore moins que ça non ? Oui oui il y en abeaucoup mais ce qu'ils utiliseront en bitcoin c'est le SHA256. Qui effectivement doit faire un
01:01:46 :truc assez long. J'avais vu ça aussi quand on fait une clé SSH, on a le choix, je crois quemaintenant je pense qu'ils ne laissent plus trop le choix mais je me rappelle qu'à un moment quandon crée la clé justement SSH, ils vous laissent le choix entre différents algos pour créer la
01:02:10 :clé et à un moment ils vous disent justement bon celui là il est ultra sécure mais il a un petitpeu plus long et je l'avais essayé et effectivement ça avait pris... là où généralement créer une
01:02:21 :clé SSH c'est quasi instantané, enfin c'est instantané oui presque. Avec l'autre algorithmeça avait mouliné un petit peu et je me suis dit ah ouais là on est au niveau au dessus de sécuritéde la clé. Ok donc on va terminer sur le... ça va pour tout ça ? Il y a des questions là-dessus ?
01:02:41 :C'est bon ? Ok donc on va terminer avec le garbage collector. Voilà le garbage collectorqui est là encore quelque chose, toi Walid justement ça va peut-être faire écho à pasmal de bons ou de mauvais souvenirs justement dans d'autres langages. Normalement c'était le Java
01:03:13 :qui a initié en premier si je me rappelle bien, parce que c'était incorporé directement dès sanaissance en 95 et cette notion a été instaurée en Python dans une version fin des années 90 ouen 2000, quelque chose comme ça. Ah ouais c'est intéressant ça, je pensais que tu vois j'aurais
01:03:32 :eu tendance à penser que c'était un quelque chose qui avait été vraiment inclus dans lelangage Python dès le tout début. Non non parce que le Python c'est ancien, c'est plus vieux que moi.
01:03:45 :Ouais c'est ça. Je savais pas que ça allait changer mais effectivement c'est leun sinon le truc j'allais dire qui fait que c'est agréable rapidement à utiliser pour desdébutants qui n'ont jamais touché à d'autres langages. Aussi la raison pour laquelle d'autres
01:04:03 :à l'inverse ne l'aiment pas parce que ça prend des libertés pour nous mais en même temps bon.Mais c'est le meilleur, moi je me rappelle très bien lorsque j'ai travaillé avec Ducé, avec Caloc,Maloc, Free avec la gestion de mémoire, c'est la cata. Ouais ça dépend voilà ça dépend ce qu'on
01:04:21 :fait justement il y a des cas de figure dans lesquels c'est même pas envisageable j'imagined'utiliser Python parce qu'on a besoin vraiment de ce niveau de contrôle là mais en même tempsvoilà c'est quand même agréable pour 98% des usages de pas avoir besoin de s'embêter avecça. Donc là voilà le garbage collector c'est un truc des fois c'est ça justement vous pouvez
01:04:41 :passer trois quatre ans à faire du Python sans jamais l'entendre parler, des fois ça arrive etpuis vous dites ok bon je sais vaguement ce que c'est mais est-ce que ça sert à quelque chosede savoir ce que ça fait je sais pas. Là je vais vous montrer justement pour vous montrer
01:04:55 :derrière ça un petit truc un peu spécifique. Donc le garbage collector c'est un système qui vaautomatiquement nettoyer la mémoire si vous voulez en gardant une référence en gardant en mémoireen fait le nombre de références que vous avez sur les objets. Donc quand vous créez un objet,
01:05:15 :quand je fais un objet comme ça a égale à une liste vide, dans ce cas-ci ça peut être un nom çapeut être n'importe quoi n'importe quel objet, là ce que vous faites dans la mémoire si vous créezvous avez l'objet en tant que tel dans ce cas-ci la liste et vous avez un nom et il va associer
01:05:30 :les deux. Là aussi je le montre bien dans les cours avec des petits schémas vous avez le nomavec une flèche qui pointe là dessus et c'est là où c'est important de comprendre que vous pouvezavoir plusieurs noms qui pointent vers le même objet. Donc là on revient sur tout ça si je fais
01:05:42 :B égale A, là dans ce cas-ci vous avez A et B qui pointent vers le même objet donc si je faisA.happen1 vous allez modifier à la fois A et à la fois B. Là encore on répète on répète je pense
01:05:52 :que ça commence à rentrer et du coup c'est ça qui fait que le garbage collector il va nettoyer lamémoire uniquement quand vous n'avez plus de références à un objet. Donc si à un moment ou
01:06:06 :à un autre, et ça vous n'avez pas besoin de le gérer, c'est automatiquement Python il regarde àchaque fois il se dit ok là j'ai un objet on l'utilise plus. Par exemple quand vous avez des
01:06:15 :fonctions vous avez l'espace local de la fonction, quand on a une variable Aégale 5 ici dans la fonction, quand on sort de la fonction cette variable on n'en a plus besoin. Donc
01:06:25 :il va se dire ok ça sert à rien de garder une référence à cette variable qui est dans lafonction parce qu'on l'utilise plus en dehors de la fonction. Donc hop il supprime et il libère de
01:06:34 :la mémoire et c'est ça qui fait qu'on n'a pas ces risques justement comme disait Walid de lesfameux mallocs de memory allocation. Parce que quand vous avez besoin de gérer ça de votre
01:06:46 :côté ça peut créer plein de problèmes parce que vous pouvez, si vous ne nettoyez pas bien tout ceque vous faites, créer des problèmes de surcharge de mémoire parce qu'à un moment si vous créezplein d'objets que vous ne les supprimez pas, votre ordi n'aura plus la place de les stocker.
01:06:59 :Ça peut créer aussi des problèmes parce que vous allez écrire dans quelque chose où il y a déjàun objet donc il faut l'enlever avant de réécrire là où vous allez le mettre etc.
01:07:08 :Donc ça peut créer plein de problèmes où des fois c'est de la gestion très compliquée et enfintrès compliquée, ça rajoute une gestion qui peut être compliquée. Et donc Python s'en charge tout
01:07:22 :seul. Si vous voulez voir un petit peu tout ça il y a le module 6 qui permet avec GetRefCount icide voir le nombre de références qu'on a et la première chose qu'on voit, je vais commenter çaici, c'est un truc qui est un petit peu bizarre quand on utilise justement ce GetRefCount. Je
01:07:37 :vais le faire de façon très simple ici pour vous montrer. C'est que si je fais print 6.GetRefCountde A ici, vous vous attendriez à ce qu'on ait 1. On est d'accord de se dire ok on a une référence à A,
01:07:54 :on a un seul A dans le script donc, je réponds à ta question après Sylvain,donc on devra avoir un seulement. Par contre si j'exécute le script vous allez voir qu'on a 2.
01:08:10 :Pourquoi ? Parce qu'en fait on a, c'est ça qui est un petit peu méta, c'est que quand on passe A icià notre méthode, ça crée une nouvelle référence en fait. Et c'est ce qu'on voit ici en fait avec
01:08:26 :cet exemple là. J'ai fait une fonction très simple, changelist, j'ai un argument et j'ajouteargument.happened. Quand on fait ça ici, et là en fait on le voit très bien, si je l'enlève ici,
01:08:36 :je le mets ici, là on a en fait, vous voyez on a une assignation. On dit que arg est égal à B.Donc là on voit bien qu'on a deux assignations en fait. On a B qui est égal à la liste vide et
01:08:46 :ensuite on a arg qui est égal à B. Donc là je le fais indirectement ici parce que je dis argégal à B. Donc c'est pour ça qu'on va avoir deux références ici à B. Et là c'est la même chose
01:09:01 :qui se passe ici, getRefCount ici. Si je vais voir, alors là on n'a rien ici. Voilà, ça c'est pas mal,real signature unknown. Parce que normalement on devrait avoir un argument ici, à l'intérieur de
01:09:13 :ça logiquement, puisqu'on y passe quelque chose. Mais voilà en fait là ce qu'il faut voir c'estquelque chose comme ça. Vous voyez on a du coup une assignation qui est faite ici parce qu'on va
01:09:23 :passer cet élément à getRefCount et Python il en a besoin, il a besoin de garder cette référencepour que quand il va être dans la fonction, il puisse utiliser cet objet pour faire ce qu'il abesoin de faire à l'intérieur de la fonction. Dans ce cas-ci, nous indiquer combien de références
01:09:36 :on a. Donc c'est pour ça que c'est un peu bizarre parce que juste le fait d'appeler ce getRefCount,ça va augmenter le compte de 1. Donc en fait dans ce cas-ci, même si on a qu'une seule instance,
01:09:45 :on va toujours avoir 2, on n'aura jamais 1 ici. Par contre si je fais b égale a, et que là jerelance, là vous voyez qu'on a bien 3. Parce que du coup on a créé une référence en plus,
01:09:56 :mais on n'aura jamais 1 ici parce que le simple fait de l'appeler ça va augmenter de 1. Et Simon,pourquoi le garbage collector ne nettoie pas les variables créées dans les boucles et dans lesgestionnaires de contexte ? Parce que justement, quand tu fais une boucle, tu ne crées pas un
01:10:10 :contexte local à la boucle. Si je fais a égale 5, on va faire une liste, et que je dis pourelement in a, et que je print element, là en fait si je fais b égale 10, le b je peux leprinter là, et il va être égal à... Attends, c'est ça, je ne suis pas fou. Pourquoi il me le
01:10:41 :surligne là, un bound, aucune variable, ok. Ah parce que je l'aurai défini après peut-être. Donctu ne crées pas un contexte local à ta boucle. Alors, supprimer les variables des
01:10:58 :compréhensions de liste. Ah tu veux dire si tu crées, alors attends je réfléchis parce que dansune compréhension de liste, oui si tu fais, oui après dans les compréhensions de liste, alorsattends j'ai un, là j'ai des flashbacks qui me reviennent parce que je sais qu'ils ont modifiéça justement dans la dernière ou avant-dernière version de Python. Faudrait que je revoie,
01:11:25 :parce que je sais qu'il y a eu une modification justement et qui optimise les compréhensions deliste, parce qu'avant justement ils isolaient et maintenant je crois que justement en fonction descontextes ils isolent plus tout le temps dans les compréhensions de liste, et que du coup çapermettait d'améliorer les performances. Je vais mettre une note parce que j'ai un souvenir de ça,
01:11:46 :je vais voir, garbage collector et nouveauté Python. Je regarde ça et je vous tiens au courantsur le Discord, parce que ça me dit des trucs, parce qu'effectivement si tu crées, si tu fais,je réfléchis là, si tu fais une liste et que tu dis ça, tu dis A pour A in liste, et que tu fais
01:12:15 :une liste comme ça, liste 2, là effectivement tu n'auras pas accès à A après, si tu fais print de A,il va te dire, je ne sais pas ce que c'est A, donc il ne va même pas, après, je ne sais pas,je vais revoir là dessus, parce que c'est un peu différent d'une boucle, là tu crées du coup
01:12:44 :je ne sais pas, je réfléchis comment est-ce qu'on pourrait voir l'implémentation, comment c'est fait,parce que je pense que là si tu veux voir directement tu vas aller dans le code, l'implémentation en Cde Python. C'est pour ça que je te dis, parce que je me rappelle avoir vu du code de comment c'était
01:12:59 :fait derrière les compréhensions de liste, et comment c'était isolé ou non, donc c'est pourça je pense que ça peut être intéressant d'aller voir justement comment c'est fait,et comment du coup ça peut répondre à cette question là de si c'est isolé ou non dans lecode derrière. Voilà, donc je reviens là dessus, juste le fait de, comme je vous disais,
01:13:17 :d'appeler ce getRefCount, ça fait qu'on arrive à, on incrémente, et donc là, voilà j'avais faitcet exemple là aussi, je relance, là on a, je ne sais plus pourquoi j'affichais le ID, oui parce quelà on passe, on a 3, donc hop hop hop, ok j'ai rien de plus ici, ok donc c'est ça. Donc là on a la
01:13:43 :création ici, on a le getRefCount qui va l'augmenter de 1, et on a le arg égale A, où là comme jedisais encore une fois, on passe l'élément en argument ici au paramètre arg, donc on l'incrémenteaussi. Et là vous voyez qu'on passe d'ailleurs, on a le même, oui c'est pour ça, je print l'ID,
01:14:03 :ça aussi c'est un truc, donc là encore on revient sur le copy, on l'a vu, là quand on passe uneliste, si on modifie à l'intérieur ce que je fais ici, on modifie, ça va modifier égalementl'élément dehors, parce que comme on le voit avec le ID ici, c'est le même élément qu'on a ici.
01:14:17 :C'est le fameux, alors c'est dans le cas de Python, c'est encore un petit peu spécifique parce qu'onparle de passage par valeur, par référence, là encore il y a des langages de programmation,on va passer juste la valeur, des fois ça va être la référence, dans Python c'est l'objet,
01:14:33 :puisque tout est objet finalement, on passe l'objet, donc là comme vous voyez ici en fait,on va passer directement, c'est le même objet à l'intérieur, quand je fais un printID de arg,on a bien le même identifiant que le A qui est en dehors. Et ce qui fait que là quand on modifie
01:14:50 :l'objet, même si finalement la liste est définie en dehors, ça va le modifier, même si à l'intérieurde cette fonction ici je fais un x égale arg, et que je fais x.happen, ça va modifier du coup le
01:15:11 :B en dehors, et le x après il sera plus là, parce qu'il est juste local à la fonction. Donc voilà,ça fait beaucoup de petits trucs, on pourra revenir un peu plus en détail sur les scopes justement,la portée des variables locales, globales, tout ça. Je voulais aussi vous parler du fameux mot
01:15:30 :global que finalement on n'utilise jamais, je ne vais pas avoir le temps là, il y a pas mal dechoses à dire là dessus aussi. Global aussi, globals comme ça, on a locals aussi qui permettent
01:15:42 :de voir justement les différents espaces. Voilà, donc on reviendra un petit peu là-dessus une autrefois. Je vous conseille aussi d'aller voir, je pourrais peut-être vous les mettre, il y a eu
01:15:53 :quelques questions vraiment intéressantes posées récemment. Ici il y a Mohamed qui a posé unequestion sur les blocs try-except, je vous l'ai mis dans le discord, je vais vous mettre le lien aussilà ici, notamment sur les blocs try-except, et c'est ça qui me fait penser aussi à quelqu'un
01:16:12 :qui avait fait, je réfléchis où est-ce que c'était, pourquoi le nom, ok. Il y a quelqu'un qui a, ah oui voilà c'est ça,interaction entre, voilà, est-ce que c'était ça, non, non c'était pas celle là, mais c'était quelqu'un,je vais la trouver là, bon je vais la retrouver aussi, mais chercher une interaction, non je ne trouve pas,
01:16:37 :quelqu'un qui avait posé une question sur les scopes, ah non c'est lui, c'est ça, je vous le remets là.Voilà, Étienne qui se demandait comment Python fait la différence entre deux noms similairesquand on fait import pprint ou from pprint, import pprint, et là je lui montrais justementqu'avec globals on peut afficher tous les noms qui sont disponibles dans l'espace global, et on a
01:17:06 :aussi locals qui permet de le faire dans l'espace local, donc quand on est dans l'espace global duscript qu'on appelle locals ou globals, ça change rien parce que l'espace local est par définitionl'espace global du script, enfin bon, c'est difficile à expliquer comme ça rapidement sansmontrer des exemples, donc on reviendra là dessus, mais voilà, c'est intéressant d'aller lire un
01:17:30 :petit peu tout ça si vous voulez vous préparer à ça. L'article, qu'est-ce qu'il apparaît pasSimon, normalement, ah il doit être dans le guide alors, ça doit être dans les guides, ouais c'est ça,parce que ça c'est un petit peu, je réfléchissais à ça, entre ça, les projets aussi, on va peut-être
01:17:49 :faire du ménage un petit peu là dedans, parce qu'il y a pas mal de choses dans le blog quipourraient être des guides, genre générer des données aléatoires avec Faker, ça pourrait êtreun guide, mais en même temps je me suis dit que si je mettais vraiment les trucs qui sont des guides
01:18:02 :dans les guides, il va rester principalement genre les articles sur les nouveautés de Python quiseront dans le blog, et c'est presque tout, peut-être des questions comme ça, donc ouais il est dans leguide ici. Après n'hésitez pas à utiliser la recherche, je la remets en avant, mais optimiser,
01:18:18 :là vous tapez optimiser, vous cherchez, ah oui peut-être par contre, article il va peut-être pas,ouais c'est ça, faut que je rajoute les guides, bon bah oubliez ce que je vous ai dit, parce quej'ai pas mis les guides là dedans. En général elle est très bien, sauf pour les guides du coup
01:18:32 :qui ne sont pas dedans. Ouais Simon c'est un peu qui tout double, des fois ça permet vraiment de,c'est Algolia qui est derrière ça là, qui des fois te permet de retrouver très, parce que c'estdu, la recherche c'est assez intelligent, donc des fois tu peux trouver des trucs très spécifiques,
01:18:49 :et des fois je suis surpris que des trucs assez simples ils les trouvent pas, parce que t'asoublié un S, un truc et puis il ne les remonte pas, je trouve ça un peu bizarre des fois,mais en général ça marche bien, ça dépend ce que tu cherches, les guides comme ils sont pas,
01:19:00 :ils sont pas dans le filtre là, du coup ouais, c'est pas, c'est pas optimal,mais pour pas mal d'autres choses c'est pas mal. Et oui en fait, ultimement oui, du coup tout est,
01:19:14 :tu passes l'objet à chaque fois en fait, effectivement, tu passes, tu passes jamais,parce qu'effectivement tu peux pas, il va pas faire une copie, tu vois, quand tu passes pasjuste la valeur et puis l'objet il reste tranquille de son côté, parce que de par le fonctionnement debase de Python, tu vas lui passer, comme on l'a vu, tu vas avoir le même identifiant, donc tu
01:19:34 :vas passer l'objet, donc même quand c'est un objet qui est immuable comme une chaîne de caractère,tu passes l'objet. Alors après par contre c'est ça le truc qui est un petit peu différent entre
01:19:43 :le muable et immuable, c'est que si je reviens sur cet exemple là, et que je fais une chaîne decaractère, donc on va dire bonjour, et que là je lui passe ça, ok, et là je vais dire nouveau,ouais, on va même faire b égale arg plus tout le monde, voilà comme ça, on va faire un print de b.
01:20:12 :Donc voilà, donc là si je fais ça, et je vais enlever ça, et je relance, là tu vois c'est ça,là si je fais un print du id, si je print le id de arg ici, et que je print le id de b ici,on a bien le même identifiant, donc tu vois effectivement que là on va bien passer,
01:20:36 :on passe finalement l'objet b, mais que après quand je le print en dehors, il n'a pas bougé,parce que là on crée un nouvel objet, on ne modifie pas b parce qu'il n'est pas muable,on ne peut pas le modifier, donc on a une variable b locale à la fonction, on a une variable b qui est
01:20:52 :dans l'espace global du script, et on a le arg qui comme on lui passe tu vois, va être à ce niveau làégal à b, mais après comme on va finalement faire b égale, on va écraser du coup, enfin on va créerune nouvelle variable, et arg sera pendant un moment égal à b, mais après on va créer un autre b.
01:21:14 :Cela va générer une exception, si je fais ça là, c'était ça que tu pensais qui allait générer uneexception ? Dans ce cas là non, parce qu'en fait on va créer une variable locale du coup.
01:21:34 :Là c'est pour montrer que tu vois on a bien le même identifiant, donc effectivement en faiton passe l'objet. On ne dit pas qu'on passe par référence, parce que justement si tu viens d'autres
01:21:58 :langages, alors il faudrait que je revoie là dessus, parce que ça peut porter à confusion avec d'autreslangages où vraiment tu passes par référence, mais comme ce n'est pas des langages vraimentsimilaires à Python avec de l'orienté objet, il y a des mécanismes encore différents. J'ai un
01:22:12 :exemple en tête là, il faudrait que je vous retrouve. Donc c'est pour ça qu'on utiliseencore un autre terme où on parle vraiment d'objet, où on passe, je ne sais plus le terme exact,mais c'est un truc en mode, on passe en référence par objet, c'est un truc comme ça tu vois,
01:22:25 :où on précise que c'est encore un truc un petit peu différent du passage par référence qu'onretrouve dans d'autres langages, qui est un petit peu différent de ce qu'on retrouve en Python.
01:22:33 :Mais finalement si tu veux simplifier et que tu fais que du Python, oui on peut dire que tu passespar référence. Voilà donc du coup ça fait le tour de ce que je voulais vous montrer. Est-ce
01:22:47 :qu'il y a d'autres questions sur tout ça ? Je vais vous mettre tout le code disponibledans les notes de la session pour que vous puissiez vous y retrouver.
01:22:57 :Me voilà de retour. Désolé, je n'ai pas vu qu'on avait dépassé un petit peu comme d'habitude. Doncs'il n'y a pas d'autres questions, on va s'arrêter là, parce que de toute façon je suis essoufflé,je viens de courir. Donc est-ce que c'était bon pour tout ça ? Si vous avez d'autres questions,
01:24:17 :n'hésitez pas, de toute façon le Discord ou sur le site, et on va répondre à vos questions.D'accord, merci, on ne vous en met pas plus que ça.
Aucune occurrence trouvée pour « ».
Bravo, tu es prêt à passer à la suite