Session du 29 janvier 2022 à 18h00
Bases du Langage
Veille & Discussions
Frontend & UI
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
Comprendre les boucles, *args et **kwargs
Découvre concrètement les boucles Python, le principe d’unpacking et l’usage de args et *kwargs au travers d’exemples simples et comparaisons avec Excel.
00:00:00 :L'enregistrement. Les args et quarks, je ne sais pas à quel point vous êtes rendu dans la formation du coup, de votre côté.Pour moi c'est les boucles en ce moment.
00:00:54 :Et maintenant c'est vraiment le genre de truc où j'ai du mal à comprendre pourquoi je ne comprenais pas en fait.Et parce que c'est après on l'utilise, enfin c'est un des trucs qu'on utilise le plus souvent.
00:01:11 :Après techniquement c'est pas un truc très compliqué, c'est juste selon les exemples que tu vas avoir.C'est un peu comme des fois une langue, t'as pas besoin de comprendre le temps à utiliser, tu fais juste l'utiliser sans forcément tout comprendre dès le début et puis après tu peux explorer un peu plus.
00:01:28 :C'est un peu comme les ARCs et les Quarks, vous allez voir c'est un peu ça aussi.Salut Yassine, parce que ARCs et Quarks c'est le genre de truc aussi qu'on voit passer pas mal et puis on peut l'utiliser sans trop comprendre et c'est pour ça que je vais essayer de vous expliquer un peu.
00:02:03 :Parce que c'est le genre de truc comme je vous dis qu'on voit souvent passer et puis on comprend pas forcément trop pourquoi ça existe.Donc juste comprendre l'intérêt sans forcément après comprendre tous les détails ça peut déjà être intéressant.
00:02:26 :Et Yassine je sais pas si t'as vu toi les ARCs et Quarks.Ah on a Thierry aussi qui nous rejoint, salut Thierry!Salut!Ça va?
00:02:38 :Très bien et toi?Je suis surpris, comme je disais en préambule je suis de retour en Bretagne donc là je suis surpris on a deux webcams et ça a l'air de bien marcher.
00:02:58 :Tu peux couper sans problème.Moi je vais partager mon écran et salut Nicolas aussi qui nous a rejoint.Alors partage.Comme je disais je vais parler un petit peu des ARCs et Quarks, donc je sais pas si ça va durer une heure.
00:03:26 :Parce que c'est un des trucs sur lequel il faut vraiment mettre les mains dedans.C'est pas ultra compliqué à comprendre, mais vous allez voir il y a en fait un concept sous-jacent qu'on appelle l'unpacking qu'il faut déjà comprendre.
00:03:56 :J'en profite aussi, alors juste si vous pouvez couper les micros quand vous parlez pas comme ça on aura pas de bruit de fond.Et sinon si vous avez des questions ou quoi que ce soit n'hésitez pas à poster dans le chat ou à prendre la parole du coup pour m'interrompre et poser votre question.
00:04:14 :Et je vais peut-être aussi du coup voir si je peux couper, désactiver la caméra.Ok, donc Yassine, ok, bah tu vas voir Yassine on va aborder tout ça, comme je disais, donc un peu aussi à ceux qui étaient là au tout début.
00:04:28 :C'est vraiment des trucs qu'on voit passer très souvent, arcs et quarts, et qu'on peut utiliser sans forcément trop comprendre pourquoi.Et donc là je vais essayer de démystifier un peu le truc et de montrer aussi des cas de figure dans lesquels ça peut être utile.
00:04:41 :Avant ça, je vais juste vous parler deux petites secondes, que vous ne soyez pas étonné, je ne sais pas si vous êtes tous abonnés à la newsletter,mais je vous présente un petit peu vite fait le nouveau design du site qui va être déployé prochainement, ça devait être cette semaine,
00:04:56 :ça sera peut-être probablement plutôt la semaine prochaine, mais donc voilà, juste pour vous montrer vite fait et vous dire de pas vous inquiéter du coup,si vous voyez un changement comme ça qui va apparaître d'ici, enfin dans les prochains jours, donc vous voyez c'est pas énormément de changements,c'est principalement le petit fond étoilé, le logo aussi qui a changé, donc voilà, des petits changements comme ça de design,
00:05:17 :donc vous étonnez pas, après ça change rien au contenu et à tout le reste que vous avez ici au niveau de l'interface,il n'y a rien qui a changé, c'est vraiment juste visuellement.
00:05:27 :Donc voilà, je voulais juste vous prévenir que ça va changer, donc ne soyez pas surpris par ce changement.Donc oui, les ARGs et Quarks, alors je vais commencer par vous parler de ce qu'on appelle en bon français l'unpacking,que comme vous voyez ici, j'ai dit qu'on pourrait traduire par déballage, alors je sais pas, je crois qu'on en avait déjà parlé Thierry justement,
00:05:48 :de trouver la bonne traduction à ce terme, et je sais pas si vous voyez mon écran, je vois qu'il me dit,je sais pas si vous voyez tous mon écran avec le bon, le bon, le unpacking, c'est ça?
00:06:04 :Ok, parfait, super. Donc oui, on en avait parlé avec Thierry un peu, je me rappelle de ce concept de déballage,unpacking, c'est vraiment cette idée, le terme anglais, c'est vraiment ça, c'est cette idée, je trouve que le mot déballage est assez bon,après dans les faits, on peut le voir aussi un peu comme un déballage, puisqu'en fait on va avoir, comme vous voyez ici par exemple,
00:06:27 :des structures de données comme les listes, qu'on va en fait sortir de leur contenant, si on peut dire comme ça.Donc là par exemple, le premier exemple que je donne avec les listes, où on a trois variables, et on a une seule liste qui contient trois éléments.
00:06:42 :Donc c'est pour ça qu'on déballe, c'est qu'on a un seul objet, donc une liste, et dans cet objet unique, on a trois objets.Et donc c'est pour ça qu'on unpack, qu'on déballe, c'est qu'en fait on va prendre les valeurs individuelles qui sont à l'intérieur de cet objet unique,donc de cette liste, et on va les assigner dans ces éléments distincts que sont A, B et C, dans ce cas-ci, donc les trois variables.
00:07:11 :Donc si j'exécute le code là, j'ai bien 1, 2, 3 qui correspondent aux valeurs qui sont donc associées aux trois variables.Donc on a déballé notre liste et on a assigné chaque élément de cette liste aux variables.
00:07:22 :Donc jusque là normalement ça devrait être assez simple à comprendre.Et ensuite, ce qu'il faut faire attention bien sûr, c'est d'avoir, c'est le principal risque qu'il y a dans ce côté déballage,c'est qu'on peut avoir trop de valeurs d'un côté ou de l'autre.
00:07:39 :Par exemple si on a quatre variables ici mais qu'on a que trois éléments à l'intérieur de notre objet,là on a un problème parce que, comme le dit en fait, l'erreur que vous avez, not enough values to unpack.
00:08:05 :Et l'inverse est vrai aussi, si on a trois valeurs ici et qu'on n'en a que deux de l'autre côté, là c'est pareil.Il va mettre 1 dans A, 2 dans B, et le C il ne saura pas à quoi l'assigner.
00:08:21 :Il me semble que j'avais vu, il faudrait reconfirmer, peut-être Thierry tu le sais, mais il me semble que cet opérateur splat pour l'assignation comme ça,c'est pas un truc qui existait avec Python 2, mais je me trompe peut-être?
00:08:34 :Non c'est ancien, c'était aussi ancien que le args.Ok oui c'est ça, ils l'ont intégré avec, ok j'étais plus sûr, mais là vous voyez ce qu'on va faire c'est qu'avec cet asterisque ici,on va dire que le 1 va aller dans le A, ensuite on va récupérer tout le reste, tout ce qui est ici dans le B,
00:08:56 :et le dernier on va le récupérer dans le C. Donc le 6 il va aller dans le C.Vous voyez c'est ce qu'on a ici, cette association.
00:09:02 :Donc en fait on pourra avoir n'importe quoi ici, on pourra avoir 2, 3, 4, 5 et plein d'autres choses.Et en fait le premier et le dernier vont être assignés dans le premier et le dernier,et tout ce qui est au milieu va être assigné dans celui au milieu.
00:09:13 :Et on peut changer la position de cet opérateur, donc si on commence par A et B, on va avoir A et B qui vont récupérer les 2 premières valeurs,et le C qui va récupérer tout ce qui se situe après.
00:09:23 :Donc ça c'est des trucs, personnellement ça m'arrive, je sais même pas si ça m'est déjà arrivé d'avoir besoin de faire des assignations comme ça,mais ça peut être le cas, je commence à réfléchir à des cas de figure, je me dis peut-être dans des cas de tableau,si vous avez un fichier Excel et imaginez que la première ligne vous avez le header avec les informations qui disent par exemple
00:09:48 :que la première colonne c'est le nom, la deuxième c'est le prénom, etc.Et ensuite à partir de la deuxième ligne, vous auriez toutes les séries de valeurs,et là on pourrait avoir quelque chose du genre.
00:09:57 :Et imaginez que la dernière ligne ce soit aussi une ligne spéciale, on pourrait dire que la première variable va récupérer la première ligne,la dernière variable va récupérer la dernière, et la variable au milieu avec cet opérateur va récupérer toutes les rangées qui contiennent des données.
00:10:10 :Ça pourrait être un cas de figure.Souvent on le fait, parce que quand tu as des données dans une séquence comme ça,admettons que le premier contient effectivement le prénom, le dernier le nom par exemple,et puis admettons qu'on veut ignorer tout ce qui est au milieu, on récupère dans B toutes les valeurs qu'on désire ignorer,
00:10:29 :et puis A et C seront peut-être les valeurs qu'on désire garder.Et puis dans ce cas-là on nomme souvent le B avec un underscore pour simplement dire « ah bah je veux ignorer ça ».
00:10:40 :Mais c'est par exemple une application.C'est effectivement le coup de l'underscore, il arrive juste après, puisque comme tu dis Thierry,c'est une convention qu'on utilise pour signifier qu'on ne va pas utiliser la variable,et c'est pour éviter les erreurs, je vais y revenir plus en détail juste après.
00:11:00 :Juste avant, pour terminer sur ce concept d'unpacking, sur cette partie,il faut noter que c'est possible avec tous les itérables, même avec par exemple un dictionnaire ici.
00:11:09 :Donc si on exécute le code, vous voyez que dans ce cas-ci il va récupérer les clés.Donc on va avoir 1, 2 et 3, donc le numéro 1, 2 et 3, ils n'ont pas les valeurs qui vont être récupérées dans les variables dans ce cas-ci.
00:11:20 :Et ça marche aussi avec une chaîne de caractères, puisque une chaîne de caractères est un itérable,c'est tout simplement une suite de caractères, une chaîne de caractères comme son nom l'indique.
00:11:28 :Donc on pourrait récupérer comme ça avec des variables chaque lettre de notre chaîne de caractères.Donc là il faudrait faire bien attention, là encore, parce que si j'enlève une lettre et que j'exécute, là on a une erreur,puisqu'on a plus de variables à gauche que d'éléments qu'on peut récupérer à droite.
00:11:46 :Et de la même façon si je rajoutais un G, là on aurait l'inverse, en fait on aurait plus de valeurs icique ce qu'on peut avoir du côté gauche de l'opération.
00:11:56 :Donc là on pourrait faire ce qu'on a vu juste au-dessus, mettre une astérisque,et comme ça on récupérait dans la dernière variable, le G ici,on récupérait tous les éléments qui sont en trop à partir du numéro 7 ou 8 ici.
00:12:11 :Donc à partir du G dans cette chaîne de caractères, on récupère tout ça dans cette variable.Donc voilà un peu pour ce concept de l'unpacking.
00:12:19 :Maintenant l'utilisation, et donc c'est là qu'on va s'en aller dans le côté ARCs et QUARZ.Donc on va le voir d'une façon très hard-coded, si je puis dire en français.
00:12:28 :Je ne sais jamais ce terme-là en français, comme on dit codé en brut,puisque avec les ARCs et les QUARZ vous allez voir que c'est quelque chose qui est un peu plus souple.
00:12:37 :Là on va déjà voir l'utilisation de l'unpacking d'une certaine façon.Donc par exemple, il faut savoir qu'on peut dans une fonction retourner plusieurs valeurs,donc dans ce cas-ci on retourne deux valeurs, et en fait ça va retourner un tuple avec ces deux valeurs,et ces deux valeurs du coup on peut les récupérer de cette même façon avec l'unpacking.
00:12:54 :Donc par exemple on a une fonction ici, validate user,et on va retourner à la fois si l'utilisateur est valide et son identifiant.Donc c'est vraiment une fonction un peu bateau,enfin si on avait vraiment un identifiant on irait le chercher depuis une base de données ou quelque chose du genre,
00:13:10 :c'est vraiment juste pour l'exemple.Mais donc imaginez là qu'on souhaite savoir si l'utilisateur est valide et récupérer son identifiant,on pourrait retourner ces deux informations,et ici donc il faudrait récupérer ces deux informations dans deux variables.
00:13:23 :Et donc là on se retrouve avec le même cas de figure,c'est-à-dire que, je crois que je le montre ici,c'est que si finalement on ne retourne qu'une chose, et qu'on met deux choses ici,ben là on va retourner une chose, et on va avoir une erreur,si j'exécute vous voyez il n'arrive pas à unpacker.
00:13:37 :Et de la même façon si on mettait, donc si je remettais le 827 ici,et que de ce côté là j'enlevais un élément,alors là en fait on pourrait le récupérer, mais on le récupérait,on récupérait le tuple donc directement, on n'aurait pas d'erreur,mais on va récupérer les deux éléments directement dans une variable.
00:13:53 :Donc là ça veut dire user is valid, il va récupérer un tuple qui contient true et 827.Donc c'est là où on en revient à ce que disait Thierry,c'est que si on veut faire ça,donc si on veut en fait récupérer les valeurs de façon séparée,il faut qu'on mette donc les deux variables,
00:14:10 :et là vous voyez imaginons qu'on souhaite juste vérifier si l'utilisateur est valid,et que l'identifiant on n'en a pas l'utilité par la suite,ben là vous voyez que par convention on met un tiré.
00:14:21 :Donc ça en fait on pourrait mettre user id comme ça, et ça serait valide,mais c'est juste que si on met ça en fait, quelqu'un qui va lire notre code après,il va penser qu'on utilise cette valeur plus loin.
00:14:32 :Si par contre on met un tiré du bas, ça indique que cette valeur on ne va pas l'utiliser.C'est vraiment une convention, c'est pas un truc qui va faire planter votre script ou pas,c'est vraiment juste une convention,et donc c'est juste pour indiquer cette valeur on la met parce qu'on veut la récupérer,
00:14:47 :enfin on veut récupérer en fait ces deux valeurs ici séparément,mais ensuite on ne va pas utiliser celle-ci.Je vois qu'il y a une question je crois, ah non il y a Vincent qui voulait rejoindre,et dans le chat, alors un, deux, autre,ah oui ok, il y a Thierry qui fait des quiz dans le chat, j'avais pas vu.
00:15:06 :Je croyais que tu posais une question, je me disais mais tu maîtrises ça Thierry, je comprends pas.Donc si vous voulez faire les petits quiz, il y a Thierry qui pose des questions,qui fait les quiz en même temps que je parle, du coup c'est bien, ça vous permet de tester,
00:15:18 :c'est vrai que des fois je me dis ça serait bien, en plus avec Whereby on peut faire des groupes,donc ça pourrait être bien des fois de faire des petits trucs comme ça, des challenges,et puis de vous mettre en groupe pour tester des choses.
00:15:31 :Donc est-ce qu'il y a des questions jusque là pour un peu le côté unpacking et tout ça,ou est-ce que ça va pour ces exemples?
00:15:40 :Ce qui est bien avec l'underscore c'est que c'est une convention qui est bien supportée égalementpar PyCharm ou VS Code, les linter souvent ils vont se plaindre quand on utilise User ID par exemple,et qu'on l'utilise pas après, et puis ils vont pas se plaindre justement quand on utilise l'underscore,
00:15:59 :ils connaissent cette convention, ça c'est également une bonne chose que les IDE supportent ce genre de choses.En fait effectivement à chaque fois si vous utilisez, si je fais par exemple,donc là je suis de retour dans PyCharm, je sais pas si ça le fait dans VS Code,mais là si par exemple je fais une variable A, et si j'attends un petit peu,
00:16:22 :voilà vous voyez elle est devenue grise, donc ça en fait c'est une indication de coloration syntaxiquequi m'indique que la variable, et là vous voyez c'est ce qu'il me dit avec le pop-up,il me dit la variable n'est pas utilisée.
00:16:32 :Donc par la coloration syntaxique je peux voir directement si une variable est utilisée ou non.Là elle est à l'intérieur du scope de la fonction ici, donc on voit assez rapidement que cette variable n'est pas utilisée,mais ça peut être assez intéressant quand même dans les scripts en général.
00:16:48 :C'est le cas même sur les imports, si vous allez voir dans les imports,si je fais un import de, je sais pas, random, et que je l'utilise pas,normalement de la même façon, alors peut-être que là je l'utilise, non, voilà, vous voyez,là pareil en fait il me le met en gris pour m'indiquer que j'ai un import qui n'est pas utilisé.
00:17:06 :Donc ça c'est effectivement quelque chose qu'on a dans les IDE et qui, comme le disait Thierry,donc si vous avez, si je reviens dans le save, si vous mettez un tiré du bas,il va comprendre qu'en fait il faut pas qu'il affiche cet avertissementparce que le tiré du bas par convention c'est quelque chose qu'on n'utilise pas.
00:17:25 :Donc, est-ce qu'il y avait des questions jusque là ou ça va pour l'instant sur ça?Ok, ça a l'air d'aller, donc je vais, ouais, ok, super.
00:17:39 :Donc on va continuer avec des exemples un petit peu plus concrets et aussi,alors oui, il y a l'exemple de la boucle qui est intéressant aussi,et après en fait je vais vous montrer ce fameux opérateur splat qu'on va retrouver.
00:17:51 :Donc l'opérateur splat c'est l'astérisque tout simplement,mais son nom officiel en anglais c'est l'opérateur splat, S-P-L-A-T,donc vous allez probablement retrouver ce terme dans des tutoriels en général.
00:18:03 :Donc on va voir les boucles et après vous allez voir en fait on va passer à cet opérateur splatet voir comment on peut l'utiliser autant lors de l'appel d'une fonctionpour éviter, enfin pour se simplifier la vie,et après comment ça va être utilisé aussi du côté de la définition de la fonction.
00:18:19 :Donc un truc intéressant à regarder c'est aussi l'unpacking.Vous avez probablement déjà vu, on fait des fois le enumerate,donc quand on fait enumerate de, par exemple une chaîne de caractères,et si je fais un print de ça, je vais commenter,je ne sais pas si le enumerate est supporté, je ne suis pas sûr,
00:18:44 :dans mon éditeur ici, donc je vais ouvrir un terminal tout simplement.Donc voilà, alors là effectivement depuis Python 3.1, je ne sais plus combien,il nous sort toujours des objets, print list,donc il faut les convertir en list pour avoir quelque chose d'affichable,et mon print ne marche pas, ok, on va refaire, print list de,
00:19:08 :non, de enumerate de docstring,et je me suis planté, j'ai oublié une parenthèse, hop, voilà.Donc là vous voyez en fait quand on fait un enumerate de docstring,on se retrouve en fait avec une liste qui contient des tuples.
00:19:24 :Et donc là en fait tout ce que ça fait, c'est nous créer une liste avec à chaque foisl'indice et la valeur associée, donc on a 0, D, 1, O,donc pour chaque lettre ici dans notre chaîne de caractères,on a un indice qui est associé. Et c'est ça qui nous permet,
00:19:40 :donc si je reviens dans la boucle, exactement ce qu'on a ici sous forme brute,qu'on pourrait faire avec un enumerate, et en fait ce que ça va faire après,c'est qu'on va pouvoir utiliser ce fameux déballage pour récupérer chaque élémentséparément dans des variables différentes.
00:19:57 :C'est pour ça qu'on pourrait avoir même plusieurs variables,et c'est là où généralement les gens ne s'en rendent pas compte,ils se disent bon bah avec le enumerate ça marche,et on a l'impression que c'est un truc un peu magique,donc là si je faisais par exemple le enumerate comme ceci,
00:20:08 :avec John, comme ça, Marie, voilà.Donc là on pourrait faire ça de la même façon, et on aura 0, John, 1 Marie,et en fait ce qu'il faut savoir c'est qu'on peut en mettre autant qu'on veut ici.
00:20:22 :Donc si je reviens sur l'exemple que j'avais ici, avec une liste brute,là on pourrait mettre par exemple un nom de famille,et on pourrait mettre Marie, Marie, Dupont, et le troisième je sais pas,donc je vais l'enlever.
00:20:37 :Et donc là en fait ça veut dire qu'on peut rajouter ici le nom de famille,on va mettre son name, et je peux le printer à la suite.
00:20:45 :Donc là si j'exécute on a bien 1 qui correspond à ça,le prénom qui récupère John, et le surname qui récupère le dernier élément.Et tous les concepts qu'on a vu au début s'appliquent,donc on pourrait utiliser l'opérateur splat pour récupérer plusieurs éléments, etc.
00:21:00 :Donc c'est vraiment, vous voyez, il n'y a rien de magique,c'est vraiment ce même concept qui s'utilise ici à l'intérieur d'une boucle,et on a les variables qui vont être assignées à ces éléments qu'on va déballer.
00:21:12 :Même chose ici avec un dictionnaire, quand on utilise la méthode d.items,si vous faites un print de tout ça, vous voyez que d.items,ça retourne tout simplement exactement la même chose,ça va prendre notre dictionnaire et ça va mettre dans un tuple,le premier élément ça va être la clé,
00:21:28 :et le deuxième élément ça va être la valeur qui est associée à la clé.Et donc ça nous permet après de faire la même chose,cette fois-ci avec des variables que j'ai appelées différemment,qui value, on pourrait les appeler n'importe comment,et ça nous permet de récupérer à chaque fois la clé et la valeur sur les éléments d'un dictionnaire.
00:21:43 :Ok? Ça va pour tout ça?Questions dans le chat?Il n'y a même pas de Patrick, oui.De listes, oui avec le zip effectivement,zip c'est un autre, c'est vrai que je pourrais le rajouter dans cet exemple ici,je vais y penser, ça pourrait être un bon exemple,le zip pour parcourir plusieurs listes en même temps en fait,
00:22:05 :avec la fonction zip, je ne sais plus si j'ai un glossaire sur zip,je ne l'ai pas fait, mais fonction zip c'est un truc assez intéressant aussi,pour gagner du temps.
00:22:16 :Donc, et maintenant on va voir l'utilisation de l'unpacking dans l'appel d'une fonction,et c'est là qu'on va avoir l'opérateur splat qui va être utilisé,puisque là j'ai une fonction en fait tout simple qui s'appelle rgbToX,qui me permet à partir de trois valeurs rouge, vert, bleu,de récupérer une couleur sous format hexadécimal.
00:22:37 :Donc là on a des valeurs rgb qui sont récupérées dans un tuple,et sans l'unpacking, on va les passer une à une.On va dire donc, on va prendre le premier élément de notre tuple,le premier élément de notre tuple,en le ciblant avec l'indice 0 pour le passer au rouge,
00:22:53 :on va prendre le deuxième élément pour le passer au vert,et le troisième élément pour le passer au bleu.Là ça va à la limite parce qu'on a que trois éléments,mais imaginez que vous ayez je ne sais pas une dizaine d'éléments ici,ça va être un peu long à chaque fois de faire crochet 0, crochet 1, crochet 2, etc.
00:23:05 :Et c'est là qu'on peut utiliser l'unpacking,cette fois-ci en utilisant l'astérisque.Parce que si je ne mets pas l'astérisque ici,là je vais lui passer directement mon tuple au premier élément de ma fonction.
00:23:15 :Donc dans ce cas-ci, ça voudrait dire qu'on passe les trois éléments ici,donc le tuple au complet, au paramètre r ici.Donc là en fait il se plaindrait parce qu'il me dirait« moi j'attends trois éléments ici et tu ne m'en passes qu'un ».
00:23:28 :Donc ce qu'on fait c'est qu'on utilise l'astérisque,et là en fait on va déballer tout ce qu'on a ici à l'intérieur.Donc c'est vraiment comme si on enlevait les parenthèses en fait,et qu'on mettait des virgules.
00:23:36 :Donc là encore il faut vraiment penser à ce concept de déballage, unpacking.Donc c'est comme si on faisait 128,255,255.Donc on enlève les parenthèses de notre tuple en quelque sorte,et on passe les éléments de façon séparée.
00:23:51 :Et ça marcherait si on en avait 4, 5 ou 6,et après par contre il faudrait qu'on ait là encore le bon nombre d'élémentspour les récupérer de l'autre côté.
00:23:58 :Parce que si on en passe plus, et c'est ce que je montre ici,si on en passe 4, donc si on a 4 éléments dans notre tuple,là en fait on n'a pas le contrôle par contre sur le nombre d'éléments qu'on passe.
00:24:08 :Contrairement à ce qu'on faisait ici, où là on passait spécifiquementl'élément 0, l'élément 1 et l'élément 2,ce qui nous permettait aussi par exemple d'inverser,on pourrait dire par exemple je veux passer le 1, ensuite le 0 et ensuite le 2,bah là on n'a pas cette latitude avec l'unpacking.
00:24:22 :Si on passe, si on fait astérisque ici avec RGBA value,ça va vraiment passer toutes les valeurs ici,et là on aura un problème parce que dans ce cas-ci,on n'a que 3 paramètres qui sont définis,et donc on n'a pas de quoi récupérer la dernière valeur qui est envoyée.
00:24:35 :Donc ça c'est une autre utilisation de l'unpacking,au moment de l'appel de la fonction, et c'est très pratiqueparce que vous voyez que ça permet d'écrire pas mal moins de codes,et d'avoir quelque chose qui est beaucoup plus facile à maintenir.
00:24:46 :Imaginez qu'on rajoute des éléments par la suite,et bien vous n'aurez pas besoin de changer quoi que ce soitdans l'appel de la fonction ici.
00:24:53 :Ça va pour tout ça?Ça c'est vraiment la base de tout ce qu'on va voir sur les ARGs et les QUARGS,qui vont vous permettre de comprendre comment ça fonctionne.
00:25:05 :Alors du coup, si ça va avec ça, on va passer aux ARGs et QUARGS.Avec des petits exemples, et puis après je vais vous montrerce que j'ai ouvert ici, avec là encore Django,qui je trouve est un bon exemple,parce qu'il y en a probablement d'autres,mais c'est celui que j'ai, vu que je fais beaucoup de Django,
00:25:26 :c'en est un que j'ai sous la main, et que j'ai déjà utilisé pour d'autres choses,notamment la semaine dernière pour la fonction Super.Donc pour ceux, si vous suivez les rediffusions,ça vous permettra d'avoir un petit peu un fil rouge.
00:25:39 :Donc déjà on va commencer avec un truc assez basique,avec ces fameux ARGs et QUARGS qu'on retrouve,donc comme vous le voyez ici, souvent dans les définitions de fonction,on les voit ici et ils sont renvoyés des fois avec ce Super,et on ne comprend pas trop pourquoi, quel est l'intérêt de les renvoyer,
00:25:56 :est-ce que je peux l'enlever, parce que des fois on les enlève et ça marche quand même,donc on se dit, bon ben en fait j'ai pas besoin de les mettre,donc dans quel cas est-ce qu'on doit les mettre, pourquoi les mettre, etc.
00:26:03 :et qu'est-ce que ça fait concrètement.Donc là je vais vous montrer ça avec des exemples très simples,je sais pas si Thierry, j'ai entendu un bruit de micro,si tu voulais dire quelque chose?
00:26:13 :Ah non j'ai même pas, j'étais en train d'écrire,les noms étaient juste une convention.Ok, oui oui c'est ça, effectivement je vais expliquer ça,je regarde, Yacine a posté,alors je vais regarder, on va prendre ton exemple après Yacine,et on va étudier ça, je vais finir mon explication du coup du ARGs et QUARGS,
00:26:42 :et puis après je vais revenir sur ton exemple et puis on va répondre à ça.Donc je reviens là-dessus, on a effectivement les ARGs et QUARGSqui ne sont que des conventions, là encore,et c'est je dirais peut-être une des conventions qui est,alors je sais pas comment le tourner, j'allais dire la moins utilisée,
00:27:00 :c'est pas forcément que c'est la moins utilisée,c'est celle avec laquelle je dirais que vous avez le plus de latitude,par exemple avec le self, c'est vraiment quelque chose que j'ai jamais vu être modifié,le self, j'ai toujours vu self à tel point qu'on a même l'impression que c'est une obligation,
00:27:14 :tellement c'est utilisé partout, avec les ARGs et QUARGS,vu que c'est des noms qui sont très génériques,en fait ARGs, qu'est-ce que ça veut dire, ça veut dire arguments,et QUARGS c'est Keyword Arguments,donc c'est tout simplement un raccourci pour K-Arguments,donc c'est des arguments, et des arguments,comme on dit en français, en mots clés, il y a des arguments positionnels et des arguments...
00:27:42 :Des arguments mots clés, ou...Ouais, il me semble qu'il y a un mot spécifique qui est utilisé,mais en tout cas les arguments nommés, c'est ça,il y a les arguments positionnels et les arguments nommés, donc qui ont un nom,et donc en fait c'est juste ça la distinction entre les deux,
00:27:57 :il y a les arguments et les arguments nommés, donc Keyword Arguments,mais là encore on peut les appeler n'importe comment,on peut mettre le fameux Patrick, et ça marcherait de la même façon,et c'est pour ça que je dis que c'est probablement une des conventionsqu'on voit le plus souvent modifiées,
00:28:12 :dans le sens où ARGS et QUARGS c'est tellement génériqueque ça n'aide pas beaucoup à la lecture du code,et des fois ça peut être plus intéressant d'avoir quelque chose d'autre,par exemple, là si je reviens dans mon exemple avec le unpacking,là si on voulait récupérer des valeurs, on pourrait par exemple mettre colors,
00:28:31 :ce serait peut-être plus explicite que ARGS,si on envoie des nombres on pourrait mettre numbers,ce serait plus explicite et on comprendrait que cette fonction attend des nombres,plutôt que ARGS qui est argument qui veut dire un peu tout et n'importe quoi.
00:28:45 :Donc voilà, juste pour dire que c'est qu'une convention,ce qui est important par contre c'est l'astérisque ici,donc ce fameux opérateur splat,puisque c'est ça qui va définir si on est en présence d'arguments nommés ou positionnels.
00:28:57 :Donc en fait, le mieux c'est que je vous montre ce que ça donne,parce que je pourrais passer 10 minutes à l'expliquer,puis en fait vous allez voir très rapidement ce que ça donne juste avec un petit print comme ça.
00:29:07 :Donc en fait, l'intérêt de ça c'est que ça va nous permettre de récupérer un nombre indéterminé d'arguments,puisque là je pourrais faire quelque chose de spécifique,dire par exemple on va récupérer A et B, et là printer A et B.
00:29:20 :Et là donc si j'envoie 5 et 10, A va récupérer 5, B va récupérer 10,et là je vais afficher 5 et 10.Donc si j'exécute, là hop j'ai 5 et 10, tout simplement.
00:29:30 :Par contre, imaginons en fait qu'on ait un nombre indéterminé de choses qu'on puisse envoyer.Et ça c'est le cas avec des fonctions qui existent depuis Tom, par exemple la fonction sum.
00:29:39 :Vous pouvez lui passer deux nombres, vous pouvez lui en passer 3, 4, 5, 6, etc.Vous pouvez lui passer un nombre infini d'éléments,et la fonction elle va tout simplement additionner tous ces éléments ensemble et vous retourner le résultat.
00:29:53 :Donc là on peut pas savoir par avance combien d'éléments on va récupérer.Donc vous convenez que ce serait un peu bizarre de faire une fonction comme ça,avec plein de lettres pour récupérer, et puis à un moment on se retrouverait à court.
00:30:05 :Alors après une fois qu'on serait arrivé à Z, on ferait A, A, B, B, C, C, des trucs comme ça.Vous comprenez que c'est pas une façon très optimale de faire les choses.
00:30:13 :Ça pourrait fonctionner jusqu'à un certain nombre et puis après on serait limité.Donc là c'est là qu'on peut faire ce fameux ARMS qui va récupérer tout ce qu'on envoie.
00:30:22 :Donc là si je print ARMS, vous allez voir qu'en fait tout simplement on va récupérer dans un tuple.Et c'est bien important de noter que c'est un tuple et non pas une liste.
00:30:31 :Si je fais un type de ça ici, et que je l'affiche, vous voyez qu'on a un objet de type tuple.Donc un tuple c'est un objet qui est immuable.
00:30:39 :Alors ça a son importance parce que, imaginez que vous vouliez faire des opérations là-dessus.Imaginez qu'on fasse par exemple une fonction SUM plus 10.Là vous pourriez vous dire que vous voulez une fonction qui va ajouter tous les éléments que vous lui passez et qui va rajouter 10 en plus.
00:30:56 :Donc on pourrait faire 5 et 2 et ça nous retournerait 17.Et donc là si vous essayez de faire ARGS.happened 10 et ensuite un return de SUM de ARGS, là ça ne marchera pas.
00:31:08 :Si je lance, on va voir TopOleObject hasNoAttribute happened.Puisque ARGS c'est un tuple et un tuple c'est un objet qui n'est pas modifiable, qui est immuable.
00:31:18 :Et donc on ne peut pas ajouter un tuple.Donc là il faudrait par exemple le convertir en liste et par exemple on pourrait faire liste quelque chose comme ceci par exemple.
00:31:26 :Là c'est un peu du pseudo code mais il retournerait la somme de tout ça.Donc bien important quand même de comprendre que c'est un tuple et non pas une liste.
00:31:33 :Ça peut avoir son importance dans des cas comme celui-ci.Et donc en fait ce qu'on comprend ici après au delà de ça c'est qu'on a récupéré tous ces éléments qu'on avait ici dans un objet qui contient tous les éléments qu'on envoie.
00:32:01 :Et ensuite, et c'est là où on va avoir la différence, c'est si j'en mets deux.Donc si je mets deux astérisques, et là je vais laisser ARGS pour vous montrer que le nom n'a rien à voir avec ça.
00:32:11 :Donc généralement vous allez voir QUARGS comme ceci, mais je pourrais juste laisser ARGS et ça va fonctionner de la même façon.Et là si je lance le script, cette fois-ci vous voyez qu'on a 0 positionnal arguments et on en a envoyé 4.
00:32:22 :Donc là le problème c'est que vous voyez on envoie des arguments qui ne sont pas nommés.Donc c'est des arguments qu'on appelle positionnels, donc ils sont en ordre, ils sont dans une certaine position, mais on n'a pas nommé ces arguments.
00:32:32 :Alors un argument nommé c'est un argument comme ça, avec un nom devant.Et là on s'attend à récupérer des arguments nommés, puisqu'on a mis deux astérisques, et ici on n'en envoie aucun.
00:32:42 :Donc là ce qu'il faudrait que je fasse c'est mettre par exemple A égale 5, et là on enverrait un argument nommé.Et si j'exécute ça, là cette fois-ci vous voyez qu'on récupère un dictionnaire.
00:32:52 :Et donc l'intérêt c'est que là on va avoir le nom également de l'argument en plus de sa valeur.Donc là on voit qu'on récupère le A et la valeur qui est associée à A.
00:33:02 :Donc là on pourrait faire plein d'autres choses de la même façon, et là je vais mettre pour que ce soit plus clair, donc quarks,et j'affiche quarks, et donc là je peux mettre A égale 5, B égale 10, et on peut dire par exemple, on pourrait dire,je vais juste vous montrer ça, puis je vais vous montrer un petit exemple de ce qu'on pourrait faire par la suite.
00:33:23 :Donc là on a les deux valeurs, avec le nom en clé et la valeur en valeur.Et on peut mettre les deux aussi, c'est ça qu'il faut comprendre, on peut mettre les args et les quarks.
00:33:37 :Dans ce cas-ci, on va récupérer à la fois les arguments nommés et les arguments qui ne sont pas nommés.Donc là si je mets 50 et ensuite A 5, B 10, et si je peux en mettre d'autres, on va mettre 10, je lance le script.
00:33:48 :Là on a bien un premier tuple qui est le args ici, qui va contenir tous les éléments qui sont positionnels,donc tous les arguments positionnels, et ensuite on a le quarks qui va récupérer les arguments qui sont nommés.
00:34:01 :Donc on peut très bien mixer les deux, et là encore le seul truc qui va déterminer qui récupère quoi, c'est l'astérisque.Et d'ailleurs vous voyez, je me demande si on peut inverser les deux, j'ai jamais essayé, vous voyez là je crois qu'il n'est pas content.
00:34:17 :Et voilà, par return, donc en fait il faut bien mettre...Non, on ne peut pas.C'est ça, vous voyez il y a des trucs comme ça encore, des fois on a des doutes, et vu que par convention,mais c'est toujours dans cet ordre là, je n'étais même pas sûr si on pouvait l'inverser, effectivement on ne peut pas.
00:34:31 :C'est tout comme on ne peut pas en fait faire ça, si vous mettez des arguments qui sont nommés,vous ne pouvez pas mettre des arguments positionnels par la suite, donc c'est un peu logique qu'on ait cette même restriction à ce niveau là.
00:34:50 :On va avoir les éléments qui vont être récupérés par A, avec les arguments positionnels,et B qui va récupérer les arguments, keyword arguments, donc les arguments nommés.
00:34:59 :Ok?Et l'intérêt de ça, c'est qu'après on pourrait se dire ici, je vais vous donner un cas de figure qu'on pourrait avoir,donc là on va dire par exemple Numbers, et on va dire ici Operator.
00:35:16 :Ici en fait ce qu'on pourrait faire dans cette fonction, c'est dire qu'on va passer des nombres tout simplement,et ensuite on pourrait dire par exemple Divider égale à 10.
00:35:28 :Là ce qu'on pourrait faire dans cette fonction, c'est dire, par exemple, divider in operator.keys,je ne suis pas obligé de spécifier keys parce que par défaut avec l'opérateur in on va vérifier dans les clés du dictionnaire,je peux mettre keys pour être vraiment explicite, mais en fait là je vérifie si dans ce dictionnaire ici,
00:35:53 :on a une clé qui s'appelle Divider. Donc là c'est le cas puisqu'on a un argument nommé qui s'appelle Divider.Donc on pourrait dire if divider in operator.keys, on va retourner la somme des nombres divisé par opérator.divider.
00:36:14 :On va faire ça par exemple, et là si je récupère result, je vais faire un print de result,je lance et là on a bien 6 puisque on avait 50 et 10, donc ça fait 60 divisé par 10, ça fait 6.
00:36:28 :Et ensuite on pourrait faire d'autres cas de figure, et on pourrait dire if multiplier in operator.keys,et là on pourrait faire la même chose avec ici un symbole multiplié.
00:36:42 :C'est clairement pas forcément la meilleure façon de faire multiplier, c'est pas forcément le code le plus efficace dans ce cas-ci,mais c'est juste pour vous montrer le principe d'un cas d'usage qu'on pourrait avoir et qui fait qu'on a une fonctionqui serait modifiée par rapport à ce qu'on donne ici, et sans avoir besoin de spécifier ici directement,
00:37:03 :de mettre divider, multiplier, etc. Et on pourrait avoir un autre, un else par exemple ici,qui fait un return ou un raise, on pourrait faire un raise value error en disant operator non supporté.
00:37:20 :Donc là je lance, là je vais avoir 600, et si par contre je fais addition, ça ne marchera pas,et on a un value error operator non supporté. Donc là ça permet d'avoir différents cas de figure en fonction de ce qu'on passe,
00:37:34 :et de récupérer tous les éléments qu'on veut en premier en arguments positionnels.Là maintenant, une question que vous vous posez peut-être, je vais peut-être prendre les questions avant s'il y en a,parce qu'il y a pas mal d'informations ici, et puis après je vais vous montrer le cas de figure avec Django,
00:37:51 :parce que là on se dit pourquoi on ne met pas directement divider, multiplier, et puis on fait les cas de figure comme ça directement.Ça va jusque là où il y avait des questions. Et Yacine je t'oublie pas, on va revenir sur ton exemple.
00:38:11 :Ok, donc je vais continuer avec Django, et pourquoi en fait cette façon de faire peut être intéressante.Parce qu'en fait, si je reviens dans Django ici, là vous voyez qu'on met args et quarks.
00:38:33 :En plus là ici vous voyez que je fais pas grand chose, et si j'ai envie de rajouter quelque chose,je vais pas m'embêter à dire if mon opération, ou le truc que je veux faire, enfin mon paramètre on va dire, in quarks,et bien alors fait quelque chose avec ce paramètre. Ce serait un peu stupide, on pourrait dire directement, fait quelque chose avec mon paramètre.
00:39:01 :donc cette méthode dans ce cas-ci puisqu'elle est à l'intérieur d'une classe, en fait elle existe ailleurs.Et c'est ce qu'on fait avec le super ici, c'est qu'on va rajouter des éléments dans cette fonction de base,on va insérer quelque chose ici, et après avec le super on va appeler la fonction de base qui est définie ici, dans la bibliothèque de Django.
00:39:20 :Et vous voyez que dans la bibliothèque de Django, là on a des paramètres qui sont définis, donc à l'intérieur dans la fonction de base save,on a pas des arcs et des quarks dans cette fonction de base, on a des paramètres qui sont nommés de façon logique,force insert, force update, choosing, update field, donc là c'est concret.
00:39:41 :Le truc c'est que nous ici, on va pas, quand on veut juste rajouter quelque chose à l'intérieur de cette méthode,pour là par exemple calculer un prix total sur l'année, on a pas envie d'aller fouiller dans le code de base pour se direok donc là il y a tous ces paramètres, et ensuite de faire un genre de copier-coller de tout ça pour se dire
00:40:01 :si jamais, et après on devrait faire ça en gros, on devrait dire si jamais il y a quelqu'un qui utilise notre fonction,si jamais quelqu'un utilise notre fonction dans notre modèle et qui veut insérer quelque chose de façon forcée,il faut qu'on lui permette de le faire. Dans ce cas-ci ça voudrait dire qu'on a pas envie à chaque fois d'aller voir
00:40:22 :la signature de base de la fonction, de copier tous les éléments, pour permettre à l'utilisateur de les spécifieret ensuite les repasser à cette fonction qu'on appelle.
00:40:33 :Donc voilà pour la théorie de base, et ce qu'on fait du coup c'est que, en fait si ça change, après imaginez Django,il change, il rajoute des trucs ici, puisque ça c'est pas nous qui maintenons, imaginons que dans la version 4.1 de Django
00:40:50 :qui sortira dans quelques mois, il change la signature ici, il enlève quelque chose ou il en rajoute,bah là on aura pas, va falloir qu'on change nous aussi notre code pour répercuter les changements qui ont été faits dans le code de base.
00:41:03 :Donc ça serait infernal à gérer puisque ça voudrait dire qu'à chaque changement il faudrait qu'on aille répercutertous ces changements dans notre code. Donc là ce qu'on fait c'est qu'on dit, si jamais au moment d'utiliser cette fonction,
00:41:13 :on a mon modèle save, il y a quelqu'un dans mon équipe qui veut utiliser un force insert, et dire force insert égale à true,et bien ce force insert, dans ce cas-ci on va le spécifier avec un argument nommé, donc ça, ça va aller où?
00:41:30 :Ça va aller dans les quarks, et ça on va le repasser à notre super.save. Et là on doit remettre les astérisques,parce que si on les met pas, si on fait juste ça, là on va passer notre tuple et notre dictionnaire tel quel.
00:41:44 :Donc ça veut dire que dans le save, on enverrait notre liste à force insert, et notre dictionnaire à force update, dans l'ordre,et là il comprendra pas ce qu'il fait parce que lui il attendait boulet 1, et nous on lui enverrait un tuple et un dictionnaire.
00:41:58 :Donc ce qu'on fait ici c'est qu'on re-unpack, si vous voulez, c'est pour ça qu'on a les astérisques des deux côtés,autant au niveau de la définition ici, pour spécifier qu'ici on veut récupérer les arguments positionnels et les arguments nommés,on est obligé de mettre l'opérateur splat une fois et deux fois, et les noms des arguments, donc args et quarks,
00:42:18 :mais on pourrait mettre là encore n'importe quoi d'autre, et ici pour unpacker, pour passer ces éléments,donc dans le cas des arguments pour déballer la liste, et dans le cas des quarks pour déballer le dictionnaire,on est obligé de remettre cet opérateur pour faire cette opération de déballage, au moment d'appeler la méthode save du parent.
00:42:36 :Donc pour ceux qui n'ont pas vu l'orienter objet, pour ceux qui n'ont pas vu les fonctions, vous êtes probablement complètement perdus,et vous vous dites, c'est méga compliqué, et wow, j'ai peur de tout ça, c'est normal, c'est des trucs qui prennent,moi je vous dirais que c'est le genre de truc que j'ai appris après facilement un an ou deux d'utilisation de Python,
00:42:56 :et ça ne m'a pas gêné, et au début je mettais args et quarks partout avec des astérisques, et je ne me posais pas la question,et ça marchait, et des fois j'oubliais de les mettre ici, et puis après vous vous rendez compte d'effet de bord justement bizarre,parce que quand vous utilisez le save et que vous mettez un force insert, votre force insert ne se fait pas,
00:43:19 :au moment où il y a un problème, vous découvrez que finalement vous allez fouiller un petit peu plus,et vous allez avoir des explications comme celle-ci. Donc à la limite si vous n'avez rien compris,
00:43:28 :ou pas rien compris mais si vous avez des difficultés avec tout ce qui a été montré ici, mettez-vous une petite note quelque partqui vous dit quand j'aurai des difficultés là-dessus, revoir la session de mentora du 29 janvier,et puis comme ça vous pourrez revoir ça dans un cadre concret quand vous le trouverez.
00:43:45 :C'est bon pour ça, pour toutes ces explications, même si comme je le disais pour certains c'est peut-être beaucoup d'informations.Si vous avez des questions n'hésitez pas, et moi sinon je vais prendre l'exemple de Yacine pour qu'on voit ça.
00:44:04 :Alors juste avec une boucle et comme Thibault je me suis pas résolu. Alors je vais regarder ton problème Yacine, hop, on va l'ouvrir.Alors tu disais, imagine qu'on a un fichier qui contient plusieurs lignes que j'ai récupérées dans une liste.
00:44:20 :J'ai récupéré que quelques lignes. Donc là t'as une liste avec, j'imagine que t'aurais des virgules entre chaque élément comme ça.Donc là t'as une liste, je parcours et tu fais pour ligne, in-ligne, ok donc c'est ça.
00:45:13 :Est-ce que, oui, il y a quelqu'un qui voulait parler ou non? J'entends des bruits de micro, mais c'est peut-être involontaire.Donc là effectivement on a 1, 2, 3, 4. Donc là on en a 4. Imaginons qu'on ait une entrée ici, on a une ligne en plus, ou d'un coup on a quelque chose.
00:45:30 :Un mot? Oui. Juste si tu reviens sur mon écran, mon écran.Tu vois par exemple la ligne 10, 11, 12, 13, il n'y a pas 4 éléments. Ah oui parce que tu as déjà le... Ok, oui, je ne l'avais pas vu, je me suis fait avoir par le truc là.
00:45:50 :Donc oui effectivement, là tu aurais une... Une erreur. Voilà. Et alors là effectivement tu aurais une erreur.Et alors là du coup c'est une bonne question, est-ce qu'on pourrait... Parce que si tu fais ça en fait, le risque c'est que... Enfin le risque c'est que...
00:47:18 :Donc là c'est une bonne question, faudrait voir du coup, moi en fait ce que je ferais, et alors là il faudrait peut-être voir ça de façon un peu plus, il y a plein de façons d'aborder le problème,moi tu vois j'aurais tendance à dire que je ferais une petite vérification avant pour vérifier si tu as quatre éléments, si tu as quatre éléments, tu les récupères directement dans des variables séparées
00:48:01 :En fait moi je les gérais comme tu as dit exactement, donc je vérifiais la taille, après je me suis dit, en fait c'est une façon de faire, mais elle n'est pas très optimisée dans le sens oùil se peut que tu tombes par exemple dans un cas où tu as plus d'éléments, donc tu ne peux pas gérer, genre, tu m'as dit que je sois à cinq éléments ou six éléments ou plus,
00:48:36 :Ouais, alors là j'avoue que, de base je me dis en fait que c'est le genre de truc que tu ferais si vraiment la performance est importante et que tu as beaucoup de données à traiter,je me dis que c'est quelque chose que tu ferais probablement avec Panda, et je suis loin d'être un expert en Panda, mais je pense bien que tu dois pouvoir faire des opérations,
00:48:58 :enfin tu dois pouvoir en fait filtrer, tu peux faire des options de filtre sur Panda, et il y aurait moyen de facilement lui dire, toutes les lignes qui ne correspondent pas à un pattern par exemple,qui pourraient être faites avec des regex ou d'autres types de validations, tu pourrais dire ne prends pas en compte toutes ces lignes là, et déjà en fait, voilà,
00:49:20 :et Panda est très optimisé parce que derrière c'est NumPy, donc ça marche bien aussi, c'est pour ça que c'est utilisé pour le traitement de données,donc moi je me dis voilà, si tu avais des problématiques de rapidité, tu le ferais probablement déjà avec une librairie qui va gérer ça mieux,
00:49:34 :et après si tu n'utilises pas Panda et que tu as quand même un souci de rapidité, là je me dis qu'il faudrait faire des tests, tu vois,est-ce que la structure conditionnelle, juste faire un line.split, je me dis que faire le split, tu vois, ça va déjà prendre un peu de temps,
00:49:51 :donc est-ce qu'il faudrait, tu pourrais par exemple faire un count, peut-être aussi, vérifier, est-ce que, plutôt que de faire un split, là tu vois,c'est des choses, je ne suis pas sûr qu'est-ce qui est le plus rapide entre le split et le count, est-ce qu'il vaut mieux faire un split,
00:50:25 :Parce que si on regarde le code, même sur la ligne 13, là, la ligne 13, on n'a pas cinq éléments, en fait, on a quatre éléments, d'un point de vue du CSV,parce que le quote et puis le crochet 0 à 5, ça c'est en éléments. Et le défaut de line.split, c'est qu'on découpe sans comprendre la donnée,
00:51:00 :lui, il va comprendre le CSV, il va comprendre la sémantique de ce CSV, il va automatiquement savoir qu'il doit couper après 22, il doit couper après FG,il doit couper après la quote fermante de 0 à 5, et puis il va avoir quatre éléments ici. Lui, il va le comprendre de manière intelligente.
00:51:32 :sinon il ne sera pas valide. Oui, effectivement Thierry, merci pour la précision. Et effectivement, là tu es dans un cas de figure précis,ou un split. Le split, c'est le genre de truc où dans certains cas de figure ça peut être très cool, et dans d'autres cas de figure, effectivement,
00:51:58 :il faut faire gaffe à ça. D'accord, je vais essayer de voir avec la libcsv, voir ce que ça donne. Ah c'est vrai que je...Alors, on va regarder avec la libcsv, je te mets en lien dans le chat, et puis si jamais tu poses une question après dans le Discord. D'accord, merci Thierry.
00:52:19 :Après effectivement, c'est le genre de cas de figure où là encore, c'est ça, il faut vraiment trouver, il faut voir quel est le bon outil pour le bon usage,il ne faut pas non plus, parce que des fois je vois justement un peu une envie de partir dans du panda directement, alors que c'est des trucs qui peuvent
00:52:37 :se faire très facilement en deux lignes avec un split. Donc effectivement, moi je sais que souvent j'utilise le split parce que par exemple,je vais l'utiliser sur des données plus textuelles, donc des trucs très basiques où je sais que je n'ai pas envie de rajouter une dépendance,par exemple sur des articles de blog, des trucs comme ça, où je vais juste couper sur un caractère très précis, et je sais que là il n'y a pas de risque
00:52:58 :que ça plante, je ne vais pas rajouter panda ou des trucs comme ça, ou passer par des librairies externes, ou faire un truc comme ça pour juste un petittruc que je peux faire avec split. Donc là encore, il faut trouver vraiment, il faut voir en fait ce que tu as besoin de faire, il faut se dire aussi au niveau
00:53:14 :performance que très souvent je trouve qu'on se pose la question un peu trop tôt, dans le sens où c'est un peu comme les gens qui demandent si Djangoest rapide ou pas, pour faire un site web où il y a 10 utilisateurs, généralement les problèmes de performance, on peut quand même faire beaucoup de choses
00:53:41 :à écrire des fichiers JSON, rajouter des informations dedans, et lire des fichiers, et j'arrivais à faire ça sur je ne sais plus 10 ou 15 000 fichiers en moins d'une seconde,sur des ordinateurs qui n'étaient pas des bêtes de course. Donc on ne se rend pas compte des fois à quel point même pour faire des opérations qui nous
00:54:13 :avec les outils les plus simples, parce que des fois vous allez peut-être perdre du temps à essayer de tout faire sans utiliser Panda, et finalement vous allez vousrendre compte que vous allez tout refaire avec Panda par la suite, donc il faut quand même analyser le problème au début, mais voilà, chaque cas de figure doit être analysé
00:54:41 :et je ne me rappelle pas, je crois que j'avais vu récemment justement quand j'en avais reparlé à une occasion et j'étais quand même tombé sur un article,il me semble, qui en parlait un peu, mais c'est quand même encore assez nébuleux. Alors que par exemple Netflix, il y a beaucoup de littérature sur le sujet,
00:55:09 :Et Instagram, du coup je me demande concrètement quelle partie est du Django.Alors il y avait un truc sur une vidéo Python US, où ils parlaient de leur stack, vraiment, et effectivement, il y a apparemment, il y a vraiment,bon peut-être pas toute l'application, mais une bonne partie de l'application qui est du Django monolithique, et même pas une SPA, donc pas une API,
00:55:37 :et après je pense que Python est utilisé à différents endroits. Il faudra que je retrouve la vidéo une fois.Mais je crois en fait, maintenant que tu me dis ça, me souvenir qu'ils avaient même fait leur propre version de Django,ils avaient rajouté un truc par-dessus je crois, et il me semble que j'avais vu un truc là-dessus, je sais plus si c'était Instagram ou une autre.
00:56:07 :pour disposer de ça avant que ce soit disponible, donc on avait vraiment besoin pour des questions d'optimisation.Donc je crois qu'ils utilisent quand même vraiment de manière assez fondamentale, et c'est souvent assez faux de penser que Django est lent,au contraire il se positionne pas mal dans les benchmarks. Oui, c'est souvent parce qu'on l'associe à Python qui lui est plus lent en général que d'autres,
00:56:46 :C'est les seuls gens que je connais qui connaissent Python et qui utilisent Ducey, c'était un mec qui faisait des trucs pour des centrales nucléaires,et des trucs de sidérurgie où là, la moindre microseconde était importante. Là on parle de cas de figure très très précis.
00:57:06 :Et encore une fois, souvent dans le web, c'est souvent ça qui me fait assez rire, c'est de voir des gens qui posent des questions sur des problèmes de performance,et puis tu vas voir le site, et première chose qui l'hôte, c'est une image de 5M pour le favicon du site.
00:57:25 :Donc voilà, petite parenthèse là-dessus, mais c'est vrai qu'Instagram, me semble que c'est quand même une grosse utilisation de Django,et c'est juste qu'on n'a pas tout le détail, mais c'est pas anecdotique.
00:57:52 :Et donc tout le concept de l'unpacking. L'unpacking c'est quand même un truc, je dirais que c'est quelque chose où vous pouvez vous en passer,mais votre code sera juste moins efficace, moins beau, moins optimisé, parce que comme vous l'avez vu dans la première partie,vous allez faire des crochets 0, crochets 1, crochets 2, pour envoyer des éléments là où vous pouvez juste faire un splat et votre itérable.
00:58:13 :Donc ça va pas vous handicaper, c'est juste que le jour où vous allez redécouvrir ça, vous allez vous dire ah bah oui c'est vrai que c'est quand même plus pratique,ou quand vous allez le voir dans du code utilisé, vous comprendrez pourquoi c'est utilisé et à quoi ça sert.
00:58:36 :Donc quand on fait de la surcharge comme on a vu là, on le voit beaucoup, en tout cas dans mes formations et dans les librairies que j'utilise avec PySide ou avec Django,où il y a plein de cas de figure comme ça, où on va utiliser une fonction qui existe déjà et on va juste rajouter des choses dedans.
00:58:51 :Et donc là il faut s'assurer de récupérer ces arguments et de les passer par la suite quand on utilise Super notamment.Donc voilà, je sais pas s'il y a des dernières questions là-dessus, sur tout ça.
00:59:05 :Sinon je vais vous mettre, donc il y aura la rediffusion bien sûr du live et je vais vous mettre tous les liens comme d'habitude.Donc que ce soit le lien vers le glossaire ou le lien vers les scripts que je vous ai fait et qu'on a vu pendant la session pour que vous y ayez accès.
Aucune occurrence trouvée pour « ».
00:03:00
Introduction des args et kwargs
00:05:02
Annonce du changement de design du site
00:05:37
Introduction et explication de l'unpacking
00:11:02
Utilisation pratique de l'unpacking
00:17:54
Exemple d'utilisation de l'opérateur splat dans les fonctions
00:22:19
pause
00:26:20
Explication détaillée des args et kwargs
00:41:03
Conclusion et recommandations