Session du 08 août 2022 à 21h00
Pratique & Live Coding
Bases du Langage
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
Correction d'exercices
Résolution de 2 exercices de code de Docstring en "live coding" avec Lionel.
00:00:00 :Pour plus d'informations, visitez www.docstring.comMerciMerci à tousMerci à tousMerci à tousBonjour tout le monde, vous m'entendez?Oui, vous m'entendez?Oui, on t'entend aussiOn va attendre un peu, pour voir s'il y a un peu plus de mondeEt après on va lancer tranquillou la session
00:03:21 :On a essayé avec Thibault de changer un peu l'horaire, mettre un peu plus tard, voir si ça ramène plus de monde ou arrange plus de mondeLà on est 15 juillet 15 août, les trois quarts de la France et en vacancesOui, clairement en août il y a beaucoup moins de monde
00:03:50 :C'est vrai, c'est des ordinateurs, on est à 4 codés, c'est consacré à ça, il y a un permis de connexion, garantie, je me pointe, permis jusqu'au 15 aoûtEnfin, la France est morte, c'est là où il faut faire des hot-dotsOk, on va attendre 2-3 minutes, voir s'il y a du monde en plus qui vient et après on va se faire la petite session mentora, exercice
00:04:27 :Je ne sais pas s'il y avait du monde la dernière fois qu'on avait essayé de faire ça, c'était pas mal je penseOn avait récupéré ou repris des exercices sur docstring et essayé de voir des implémentations, des solutions et expliquer les différentes techniques ou différentes solutions possiblessur des problèmes relativement simples, donc c'est soit de l'algorithmie, enfin du Python tout le temps, mais de s'orienter à l'algorithmie
00:04:58 :qui met en avant des techniques du langage souvent, c'est un exercice pédagogique pour montrer comment utiliser des lises, des dictionnaires, des ensembles, etc.Super, on parle aussi des design patterns?
00:05:18 :Ouais, design patterns, là c'est vraiment des exercices algorithmiques, donc un peu plus compliqué de développer un design pattern dans ces cadresAprès il y aura un peu d'algo et de méthode algo, enfin des patterns d'algorithmique, il y en aura peut-être un ou deuxMais des design patterns, ouais, que que, non, si on pourrait, mais ouais
00:05:45 :Après là je crois les exos là, comme on va essayer de faire, ils sont pas assez complexes pour vraiment avoir besoin d'utiliser ces outilsJe suis tombé sur un site qui est pas mal, qui est fait par des Ukrainiens, je suis un politique, mais il est pas mal et il montre, comme il y en a 22 des design patterns
00:06:17 :Il montre en Python, en C Sharp, en TypeScript, il montre dans chacun des exemples des design patternsOuais c'est intéressant, parce que en plus chaque langage porte une sorte de philosophie ou de pensée des paradigmes, c'est à dire des façons de résoudre des problèmesEt du coup chaque langage a des parties prises sur une certaine résolution, une certaine vision d'un problème
00:07:01 :Donc forcément ça se transcrit quand on utilise le langage de manière, comment dire, en Python on dit çaLe Python way, ou je sais plus c'est quoi le terme, Pythonistique, en gros c'est à dire qu'on pense le problème comme un développeur, un vrai développeur entre guillemets à PythonOn essaye pas de faire du C avec du Python ou des trucs comme ça, on pense vraiment avec le paradigme de Python
00:07:27 :Et du coup chaque langage porte ses méthodes de résolution et son élégance pour résoudre des problèmesSi tu veux je vais mettre dans le commun, je vais mettre le lienDépendance, Junction, RefractorIl est intéressant parce que tu vois, il montre, d'abord il explique que dans les 22 dizaines faciales malgré son sens de pratique
00:08:00 :Et quand tu cliques, tu vas en bas, tu as les exemples, bon il y en a en plus de code, mais surtout après tu vas en basLes exemples de code en Java, en C Sharp, en C++, en PHP, en Python, en Ruby, et je sais pas combien de langages
00:08:23 :Ouais il refait des dizaines de patterns du Game of Thrones, les trucs classiquesOuais tu vois, je trouve que c'est intéressantEn plus là en ressources françaises, c'est un bon lien, ils ont travaillé sur la traductionOui parce qu'il parle de Python etc, mais au moins c'est en français
00:08:47 :Et je trouve que le reste qui est en bas, il est toujours en anglais, la refractorisationMais déjà par rapport au design pattern, le temps que ça rentre dans la tête, c'est combien de temps qu'il y a d'optionsC'est une bonne ressource, en termes de design de code et de façon de faire du développement logiciel, c'est clairement un must-have
00:09:19 :Surtout quand on fait de l'industrie ou du développement professionnel, c'est important d'avoir au moins une idée des patterns communsEt pas de refaire la roue quand tu retombes dessusOui c'est ça, de ne pas réinventer longtemps, et puis même le fait de les lire, de les regarder, ça imprègne
00:09:45 :Ah oui j'ai vu que ça quelque partYes, j'ai envie de lire, ça a l'air intéressantEtant du cran, nonCoolBonsoir, bonsoir, bonsoirLa dépendance d'injection, le projet de l'été, je ne sais pas c'est quoi le projet de l'étéC'est un sujet avancé, pareil aussi, c'est un design pattern, et plutôt très avancé, l'injection de dépendance
00:10:20 :Ça peut aider à résoudre des gros problèmes de projet, ou de design de projet, après ça a des avantages et des inconvénientsIl faut bien peser le pour et le contre quand on fait des projets où on utilise ce patternÇa résout des problèmes, mais ça peut en créer d'autres si on utilise mal, ou si on sur-design, ou même on est à côté du design
00:10:44 :Par rapport à la problématique, par exemple le produit ou le service que tu veux faireOui, mais déjà le fait de les lire, de les voir, de nourrir son imaginaireAh ouais, il passe par là, ah ouais, je ne savais pas faire plusEt après, c'est comme beaucoup de choses, le truc c'est expérimenter, essayer de faire des applications et de travailler les concepts
00:11:10 :C'est bien de les lire, de faire une navigation sur le site extraMais là, vous devrez apprendre ça au moment de l'utilisationOui, mais complètement d'accord, et c'est pour ça que ce qui est intéressant, c'est qu'il y a des exemples de code en PythonDonc ça donne, c'est pas que du baratin, pour le tester, pour l'essayer, en changeant les variables
00:11:35 :On peut aller un peu plus vite, un peu plus loinEt l'approche, la planche multilingue, ça peut être super intéressant, surtout si on a une culture d'avant d'autres langagesÇa peut aider à se remettre dans des contextes où on est plus familierOui, oui, complètementNe serait-ce que par curiosité, même un langage qui nous intéresse, on se demande qu'est-ce que ça donne
00:12:00 :Sur un pattern qu'on connaît, on voit les différentes implémentationsOui, c'est ça, j'ai trouvé ça très intéressant, parce qu'en fin de compte, on est dans un métier dans une voie de fou, de passionnéAttends, comment il s'appelle la... ah je suis fatigué
00:12:35 :Le sondage, le dernier sondage de... ah je change de motTu sais où il y avait 70 000 développeursAh oui, un pack coding game, un équivalentUn stack overflowUn stack overflow, ouiEt en fin de compte, je crois que 80% codent en plus, enfin en dehors du boulot
00:13:00 :Mais ça c'est un trait assez commun dans le métier de développeur, tu as souvent des gens qui font çaIl y a le côté professionnel, de toute façon ils font un métier, il faut vivre et tout çaMais il y a aussi un côté où il y a une curiosité, une envie d'apprendre, d'explorer
00:13:21 :Et c'est vrai que ça a un moteur fort sur l'apprentissage et sur le développement professionnel, personnel ou même de connaissance et compétenceLe fait d'être motivé par des projets internes ou des passions, et ou des projets en dehors du boulot ou même dans le boulot, ça dépend comment on fait son travail
00:13:42 :C'est quelque chose de très générateur et très puissant en termes de force d'apprentissageAprès il faut faire attention de ne pas se laisser non plus étouffé par tout ça, il faut trouver un bon équilibreEt c'est vrai que moi des fois pour me détendre, je regarde des trucs de C++, c'est un autre langage
00:14:10 :Et ne sois ce que de lire, de divulguer ou d'autres trucs, même du RPG, je ne sais pas si tu vois ce que c'estPour moi c'est un jeu, mais non c'est un jeu, oui tu parles d'autre chosePas du tout, le RPG c'est le langage de la S400, tu vois ce que c'est?
00:14:29 :NonLa S400 c'est les IBM, c'est les gros trucsLes calculateurs, les superordinateurs, les trucs comme ça?Oui, en fait c'est les banques, les assurances et les différents marchés qui les ontEt c'est hyper stable parce qu'on prend en compte que c'est un système IBM etcMais par contre d'ailleurs, la programmation, ah ah, ah ouais, tu te dis, mais c'est intéressant
00:15:02 :Et ça peut être rafraîchissant, c'est juste changer sa tête, tu te dis, je suis pas l'idolatreOuais, bon je suis pas un mazo à ce point j'imagine, mais après c'est du jeu, il faut chercher le plaisir et l'amusementAprès chacun le trouve où il peut, où il veutNon mais c'est intéressant par rapport à la S400, c'est pour ça que t'as les banques, les assurances, machin qui ont la S400
00:15:36 :Parce que c'est, d'abord, tous les trucs qui viennent pour brancher en réseau au niveau mondialEt dès qu'il y a une modif ou un truc, tous les autres l'ont encoreMais comme c'est un langage natif et propre, on peut pas le casser, on peut pas le hâterMais par contre, ouais c'est une religion
00:16:03 :Avec ses adeptes et ses prêtresAh ouais ouais ouais, complètementMoi le prof qui m'avait enseigné, qui m'enseignait, son surnom c'était Grandal, parce qu'il s'en dait à GrandalCheveux longs, barbe, tout en blanc, etcOuais, c'est un autre monde quoi, c'est un autre mondeYesBon, on va démarrer, on va revenir à des choses plus simples
00:16:34 :Je t'annule!Ok, donc bonsoir tout le mondeOn va reprendre l'idée qu'on avait faite l'autre fois d'exercice et d'essayer de voir des exercices de docstringNiveau plutôt, soit simple, soit intermédiaireSur des contenus pédagogiques que propose Thibault sur le siteDonc avec des petits problèmesSouvent c'est des algos assez simples ou des programmes assez petits
00:17:05 :Et ça met quasiment tout le temps en avant une fonctionnalité de Python, enfin une ou plusieursEt du coup ça essaie de forcer l'étudiant à s'intéresser à un trait du langageEt de l'utiliser, de résoudre le problème avecDonc l'idée, ça va être de regarder, là j'en ai deux écrits, enfin j'en ai quatre
00:17:32 :Mais on va essayer, la dernière fois on en avait fait deux et ça avait fait à peu près l'heureDonc on va voir où on va et ça dépend après si vous voulez essayer de réfléchir sur les problèmes ou pasEn fait c'est ça qui conditionne la vitesseOk, on va commencer par...
00:17:51 :Ah du coup, ouais il y a le lien, ok coolTac, donc c'est l'exercice trouver les éléments communs de listeDonc c'est celui-làDu coup là j'ai fait des Jupyter Notebook, vous pouvez essayer là cette fois pour voir comment ça marcheJe vais mettre comme la dernière session, je mettrai sur un repo les sources
00:18:13 :Donc vous pouvez les récupérer, relire et même reutiliser le code qu'il y a dans les cellulesIl n'y aura pas de soucis, on vous transmettra un lien avec tout ça versionnéDu coup ok, l'énoncé assez simple, dans cet exercice vous allez devoir récupérer les éléments communs aux deux listes dans une variable résultat
00:18:34 :Dans ce cas-ci, votre liste commune devra contenir les nombres...Ok après il donne un exemple que là...Ah oui dans ce cas-ci, parce qu'il y a l'exemple juste à côtéParce que là je disais l'énoncé ça n'avait pas trop de sensLà du coup, en fait là à gauche, dans la pagination de la page à gauche il y a l'énoncé
00:18:50 :Et à droite il y a l'exemple, le code iciD'ailleurs je vais virer du cas...Comme pour faire un exercice, c'est un béni ou un béni?
00:19:01 :Et ok, et du coup en indication il dit pour cet exercice vous pouvez utiliser les 7Bon enfin quand il dit vous pouvez, souvent c'est vous devez, mais bon après libre à faire comme vous voulezMais en fait là, ce type de phrase c'est vraiment en gros pour donner une indication sur la notion Python à utiliser
00:19:22 :Donc là en l'occurrence il veut faire utiliser les 7, donc les ensemblesAprès je crois qu'il y a une des solutions où je dis moi je n'utilise pas les 7Mais au final ça revient au même qu'utiliser les 7, en fait je réécris partiellement les 7Bref, on va voir
00:19:37 :En aide, vous pouvez utiliser les 7, donc hop ça revient sur le pouvait, hop il revient sur le dessusPour récupérer l'intersection des deux listes, donc là il donne une indicationA priori dans le type 7, il y a la possibilité de faire l'intersection et d'avoir le résultat qu'il nous demande
00:19:53 :Donc là en analysant l'énoncé, en fait ce qu'on veut c'est juste une intersection entre deux listesPédagogie, bon ça après c'est les indications qu'il m'avait donnéFaire à gauche sur papier à rendre causé, bon ça ça peut être un bon truc si on n'a pas d'idée sur comment résoudre le problème
00:20:10 :C'est à dire on a l'énoncé et on n'a aucune idée de comment démarrerÇa peut être bien avant de se jeter sur le clavier, de prendre un bout de papier et essayer de comprendre de quoi ça parleEn général le truc qui est bien c'est de reprendre l'énoncé, les données d'énoncé, essayer de jouer avec, de voir à la main comment on résoudrait en fait le problème
00:20:28 :Pour moi, par exemple faire l'algo à la main, c'est vraiment prendre un exemple et le développer à la main et voir comment on le résoutEt après on fait la mise en écriture informatique, c'est faire l'algoSurtout sur les problèmes de type de taille en général on peut le faire, c'est humain, c'est assez facile et c'est assez facilement accessible de résoudre à la main
00:20:49 :Un exemple en particulierÇa peut être intéressant aussi pour aller plus loin d'aborder la notion d'objet muableOk, bon ah ouais, ça du coup, on pourra peut-être en parler mais ça dépend de comment t'implémenteNormalement dans mes implémentations je ne prends pas du tout en compte ce conseil parce que je fais de la programmation fonctionnelle
00:21:11 :Donc en gros je ne modifie pas mes entrées, donc ces notions de muables ou immuables, en fait ça peut être intéressant si on fait du code un peu, comment direUn peu, genre on ne fait pas attention qui écrit dans quoi et qui lit dans quoiMais du coup je ne suis même pas sûr dans les solutions, je vais vous montrer que
00:21:35 :Ouais mais quand tu fais çaTac, analyse de l'énoncé, l'énoncé est assez simpleDonc l'énoncé est assez explicite avec des indications en gras, couleur pour les éléments importants, on va relire vite faitMais grosso modo, les mots clés c'est récupérer les éléments communs, donc en gros là c'est les éléments communs qui nous intéressent
00:22:01 :Dans deux listes, dans une variable résultat, donc on doit mettre une indique où on doit stocker le résultatDonc là en l'occurrence je crois que ça se trouve que ça doit être comme ça au départ, c'est possibleDans ce cas là, votre liste devrait contenir, donc là il nous donne le résultat, c'est à dire qu'avec ces deux entrées
00:22:19 :Si notre algo est bon sur cet exemple, on devrait avoir ça en résultat 5, 7, 10Donc là en fait avec cet exemple plus le résultat attendu, on peut écrire un test unitaireGenre là à la fin ce qu'il va faire Thibault pour vérifier notre résultat, il va faire résultat égal égal 5, 7, 10
00:22:39 :Et c'est ça qu'il va exécuter, une phrase comme çaD'ailleurs on peut le tester, on peut l'essayer sur le site, et là on le voit c'est à peu près çaGenre même il s'assure qu'il remet dans l'ordre le résultat pour que la comparaison soit vraieTypiquement si en résultat on mettait 10, 5, 7 ça marcherait parce qu'il fait un short, enfin il fait un tri ici avant
00:23:06 :Mais là en l'occurrence ce que je viens de faire là c'est tricher parce que je connais le résultat, je l'ai rentré à la mainMais c'est pas ce qu'on veut faire, c'est pas ce qu'il faut faireÇa ne marche que pour un jeu de test, mais comme on écrit un algo, c'est pas que pour un cas, enfin souvent c'est pas que pour un cas unique
00:23:23 :C'est pour des séries de cas avec des paramètres d'entrée, donc là c'est juste pour vérifier que ce que je disais était vraiEt du coup, ok, donc là l'aide nous incite à utiliser les sets, donc les ensemblesMince, j'aurais pas dû cliquer, qu'est-ce qu'il m'a fait?
00:23:41 :Ah tiens je sais pas où je suis, nonBizarreLes ensembles pour résoudre cet exercice, mais ça reste une indication, donc je vais faire une autre implémentation, c'est pour ça que je fais le petit smileyEst-ce que de base vous pensez avoir une idée de la solution, de comment résoudre ce problème?
00:24:04 :Assez simpleDonc on a deux listes, liste 1 et liste 2, et on veut dans le résultat l'intersection des deux listesEst-ce qu'il y en a qui ont une idée de comment ils le feraient instinctivement disons?
00:24:30 :Il n'y a pas de mauvaise réponse, faut pas complexer ou avoir peurAprès si vous n'avez pas d'idée, vous n'avez pas d'idée, c'est pas graveListe 1 et liste 2 c'est un merge, ouais ça peut, pourquoi pas, après merge je crois que ça existe pas en Python, mais c'est dans l'esprit
00:24:51 :Non ça existe pasAprès merge ça peut être le synonyme d'union, mais du coup en l'occurrence c'est pas l'union qu'on va faireOui ça fait du SPLIl y a plein de méthodes justement, Flavien c'est exactement ça, c'est ce qu'il veut vous faire utiliserOuais ouais c'est ça, ok, du coup c'est Flavien, c'est à peu près ça qu'on...
00:25:23 :La résolution simple niveau 1 c'est ce que Flavien indique, c'est à dire une méthode qui permet à partir de cette de récupérer les éléments communs de cetteDonc du coup la solution ça ressemble à ça, avec les sets et intersection, c'est le mot clé des setsDonc là j'ai indoc sur l'objet ou la case d'objet set, donc renvoie un nouveau set ou frozen set, donc en gros c'est des sets qui sont figés
00:25:52 :Frozen c'est glace ou figé, donc en gros ils sont juste en lecture seule, les frozen sets c'est des sets qui bougent pasEt les sets on peut rajouter des éléments dedans, dont les éléments viennent d'itérable, donc en gros on transforme un itérable, ça peut être une listeEnfin tout ce qu'on peut itérer dessus, et les transforme en sets, donc des éléments immuables et qui ont des propriétés supplémentaires
00:26:34 :Donc type d'ensemble set et frozen set, donc on peut avoir leur longueur, savoir si un élément appartient au set, si un élément appartient au setSavoir si ils sont disjoints, si c'est des seins sous ensemble, comparer deux sets selon un ordonnancement, etc.
00:26:49 :Donc il y a en opération boolean sur les sets, enfin qui pourrait nous intéresser c'est union, donc on voit un nouvel ensemble dont les éléments viennent de l'ensemble et de tous les autresEn gros si on fait, par exemple si A c'est un set, B c'est un set, si on fait A union B, tous les éléments résultants de cette opération seront dans A ou B ou dans A et B
00:27:13 :Après il y a l'intersection, donc on voit un nouvel ensemble dont les éléments sont communs à l'ensemble et tous les autres, donc pareil si on a un set A et un set B, si on fait A intersection Bd'après la définition d'intersection, ça enverra que les éléments qui sont dans A et dans B. Différences symétriques, etc.
00:28:28 :Si on fait set de liste 1, c'est à dire si on prend la liste et on le met au constructeur du type set, en fait ça va transformer les, donc là la différence, là ici on a des parenthèses dans leà ou, et si on est en set, en fait ça met des crochets autour et en fait normalement, une des caractéristiques c'est que les ensembles, tous les éléments internes à l'ensemble sont uniques, donc par exemple si on avait une liste
00:29:38 :Et pareil, là on peut faire l'inverse, c'est à dire que si on part de liste 2, donc on transforme en ensemble liste 2, on a une intersection et on peut faire après l'intersection avec liste 1,donc c'est commutatif en fait, on peut faire liste 1 intersection liste 2, ou liste 2 intersection liste 1, c'est le même résultat.
00:29:57 :Donc là c'est ce que je fais ici, je fais en une ligne, après on peut le faire en plusieurs lignes, par exemple là on pourrait dire set de liste 1 égal set de liste 1,et set de liste 2 égal liste 2, et après on pourrait faire résultat égal set de liste 1, bon après c'est un peu vers le même lien.
00:30:22 :On peut le faire en plusieurs étapes si on est plus à l'aise.Et après ici résultat, et en fait le résultat d'une intersection entre deux ensembles de sets fait un set, et là dans l'énoncé il disait, résultat attendu, il s'attendait à une liste,et après on peut faire une conversion explicite, donc là sur une autre ligne on pourrait dire liste de résultat pour avoir,
00:30:54 :voilà, pas liste comme ça, liste le mot clé, et donc tout ça là en fait, toutes ces lignes, donc là normalement ça marche,et toutes ces lignes en fait on peut les résumer en une ligne, donc si on fait en une ligne on peut faire toutes les opérations,donc on fait une liste, enfin à partir de la liste 1 on fait un set, on fait l'intersection avec le set de la liste 2, et après on reconvertit en liste,
00:31:20 :et le résultat contient le résultat qu'on s'attend. Donc ces lignes sont équivalentes, la ligne 4, 7 avec la ligne 8.Donc ça c'est la solution 1, assez simple, d'ailleurs je crois que c'est la réponse de l'exo, ouais c'est ça, du coup c'est la réponse de l'exo.
00:31:43 :Après il y a, comme les sets, enfin le type set c'est une classe, comme tous les types Python, il y a aussi, certains types et certaines classesdéfinissent des opérateurs, c'est à dire des mots clés comme ici par exemple le E, et ils l'associent à une méthode,typiquement en bouléen ou en ageb bouléen, le E ou le pipe comme ça, qui est le OU, correspondent en fait aux opérations intersection ou union,
00:32:14 :en fait il y a une équivalence entre le E, ou l'uperluette, et l'intersection, il y a une équivalence entre le pipe, donc le 6 comme ça,le pipe, et le OR, le OU bouléen. Donc une autre façon d'écrire, c'est à dire au lieu d'écrire explicitement.intersection pour invoquer
00:32:31 :la méthode de la classe set, on peut utiliser l'opérateur E qui implémente l'intersection entre eux, et donc ça c'est équivalent à ça.Petite question, ça sert à quoi, qu'est ce que ça fait exactement le assert?
00:32:54 :Ah oui, le assert en fait c'est une méthode de vérification en Python, en gros ça demande à Python assert espace une expression bouléenne,et si l'expression bouléenne est vraie, ça fait rien, ça passe, si l'expression bouléenne est fausse, ça lève une exception, ça fait un raise assertion error.
00:33:17 :Donc je peux vous montrer, par exemple ici, par exemple là si tu fais assert true, ça fait rien, si tu fais assert false, ça fera un raise error,et ça te fera une trace back sur ce qui s'est passé. Et pareil si tu fais bound 1, c'est une expression bouléenne, c'est vrai,
00:33:41 :si tu fais 0,1, forcément c'est faux, là il va te dire ça va pas, il dit assertion error, ce que tu as essayé de faire c'est faux,donc je lève une exception et il y a un truc qui va pas.
00:34:06 :Et en fin de compte tu exploites l'erreur, en bouléen.En fait les tests unitaires ou les tests quel que soit le langage en général, ça s'appuie sur un vrai faux, sur un pass ou fail,et après si ça réussit tu dis ça passe, et si ça réussit pas tu peux spécialiser l'erreur, là en l'occurrence quand tu fais des asserts,
00:34:44 :tu anonymises, ça fait toujours une assertion error, par contre tu peux lever d'autres types d'erreurs, il y a plein d'exceptions en Python,d'ailleurs on peut regarder si vous voulez, je sais pas vous connaissez tous les concepts d'exception en Python, ça vous parle ce que je dis?
00:35:00 :Try except par exemple. Là typiquement c'est une structure classique en Python pour faire du code et lever une exception s'il y a une erreur.Mais du coup on peut avec asserts, je sais pas si ils en parlent dans cette page, on peut aller faire un tour sur asserts.
00:35:23 :Ah ouais mais là on est dans unit test, c'est pas forcément le fait.Ok, assert statement, on va le mettre en français, de base il se met en anglais. Tac, l'instruction assert.
00:35:53 :L'instruction assert est une manière pratique d'insérer des tests de débugage au sein d'un programme.En gros tu veux vérifier une propriété, quelque chose qui fonctionne ou qui ne fonctionne pas, donc tu mets un assert.
00:36:02 :L'idée de l'assert c'est soit tu le fais à la main, la version simple, c'est à dire que tu fais ton if condition,et si il y a un truc qui est faux ou un truc qui est vrai, ça dépend comment tu écris ton expression, tu fais un rise,donc tu fais une levée, le rise c'est une levée de quelque chose, assertion erreur.
00:36:20 :Mais là tu peux mettre d'autres exceptions, il y en a d'autres en Python, mais en l'occurrence là c'est l'écriture comme ça.Et en fait cette forme c'est équivalent à cette forme simplifiée, on appelle ça en Python des suggers syntaxiques,donc des syntaxes plus agréables entre guillemets.
00:36:38 :Donc au lieu d'écrire ces deux lignes à la main, tu écris juste cette ligne, et ça revient au même.Ok d'accord, merci.Et c'est le niveau zéro du test unitaire.
00:36:51 :C'est à dire que quand tu veux faire des tests et que tu ne veux pas trop te prendre la tête à construire des vrais tests,tu fais des asserts et des rise sur des conditions, des vérifications de conditions.
00:37:01 :C'est vraiment utilisé que pour les tests unitaires c'est ça?Pas forcément que, en production ou en code de production tu peux l'utiliser pour avoir des conditions au niveau de tes constructeurs,ou tu peux utiliser par exemple sur une méthode un getter qui a besoin d'une connexion à une DB ou qui a besoin d'une condition particulière.
00:37:23 :Si tu as un contexte général et tu veux vérifier avant de lancer ta méthode ou ta propriété,tu peux te poser la question avant de lancer tout ton code, est-ce que j'ai mes conditions initiales qui sont prêtes?
00:37:33 :Et tu peux utiliser un assert ou un rise en début de programme pour dire ouais mais en fait là je ne peux pas faire ce que tu me demandes,il me manque des choses.
00:37:40 :Par exemple c'est un cas d'utilisation où tu peux utiliser l'assert.Mais là encore c'est niveau zéro entre guillemets, c'est-à-dire que l'assert est anonyme, ça te fera toujours des assertions erreur,c'est pas très spécifique.
00:38:01 :Donc c'est une première étape avant de faire du code plus propre,tu peux utiliser les asserts pour vérifier des conditions fortes avant de démarrer l'exécution de ton code.
00:38:14 :Ça répond à ta question?Oui, complètement merci.Cool.Ok.Après du coup, je n'insiste pas mais ces formes elles sont intéressantes aussi,c'est des trucs qui peuvent être intéressants à regarder.
00:38:30 :Des fois il y a des opérateurs, donc là c'est directement inscrit dans le langage Python,l'opérateur et, donc opérateur et parluette, fait l'implémentation d'intersection.Après les deux formes sont équivalentes mais c'est vrai qu'il y a une esthétique qui est quand même plus sympa ici,en plus quand tu le sais ça fait plaisir de l'utiliser.
00:38:49 :Mais du coup, je sais, ah j'ai peut-être pas mis de... c'est peut-être dans la doc de set,attends on regarde juste... oui voilà ici regarde, dans intersection and other,
00:38:59 :tu as aussi l'équivalent set et other, enfin les deux là sont équivalents.Pareil dans l'union et other, donc d'autres, tu as set et le pipe 6 other,pareil sur le isOperSet c'est implémenté avec le supérieur ou l'égal ou le supérieuret le isSubSet c'est implémenté avec l'opérateur inférieur ou égal ou inférieur.
00:39:20 :Une question?Oui?Le nou négatif tu le fais comment?Le XOR tu parles?Tu sais en booléen le ou négatif on le fait comment?Je suis pas sûr de... c'est quoi la table de vérité pour ton ou négatif?
00:39:38 :Ma table de vérité c'est l'inverse, c'est du ou positif et du ou normal,c'est à dire le ou négatif quoi.Ouais ok c'est notre ou.
00:39:50 :Je sais le faire à la main mais...Sur les sets je sais pas c'est une bonne question, je pense pas qu'il y a un NOR ou un XOR là.
00:40:02 :Est-ce que ça a du sens? Ouais si ça pourrait avoir du sens mais je crois pas que ça existe l'implémentation.Il est en piton sur les booléens?
00:40:15 :Non je crois que je me trompe.Par exemple si on a un booléen 0,1 true et un booléen...Ouais bon faut se prendre la tête avec cette notation.
00:40:26 :Non disons on a true, il me semble que c'est ça en fait.Ça existe? Non ça existe pas alors c'est pas ça.Comment on fait le XOR? Ah non c'est peut-être ça le XOR.
00:40:35 :Ouais c'est ça.Donc par exemple vrai XOR faux c'est vrai, pareil sur faux XOR vrai c'est vrai,et tous les autres cas je crois que c'est faux.
00:40:45 :Par exemple le vrai vrai c'est faux, et le faux faux c'est faux.Ouais c'est ça du coup là c'est le chapeau.Sur les booléens c'est ça qu'il implémente, sur les 7 je sais pas si ça a du sens.
00:41:01 :Faudrait que j'y réfléchisse là tout de suite je pourrais pas te dire si ça a du sens de faire un...Non mais c'est juste pour voir.
00:41:08 :Sur les booléens... Ah c'est basique, symétrique différence,en fait il appelle ça la différence symétrique, donc il l'a implémentée avec cet opérateur qui est le...
00:41:17 :le ou négatif ou le ou je sais pas comment tu l'appelais en français.Ouais le ou négatif ouais.Donc en l'occurrence c'est la définition de différence symétrique.
00:41:26 :Donc renvoie à nouvelle élément dont les éléments sont soit dans l'ensemble, soit dans les autres,mais pas dans les deux.Ouais bah en fait c'est vrai c'est le XOR.
00:41:36 :Ok, bah ok, du coup c'est ça ta réponse.Merci.De rien.Mais ça je crois pas l'avoir déjà utilisé, la symétrique différence, je suis pas sûr d'avoir déjà utilisé vraiment.
00:41:52 :Bon bref, c'est un détail.Donc ouais, on peut faire avec les opérateurs, donc ça peut être intéressant quand on veut faire une opérationvoir s'il y a un équivalent, bon c'est juste une alternative, les deux sont équivalents donc c'est un des deux.
00:42:05 :Du coup il y a une seconde implémentation avec des compréhensions.Ok, est-ce que tout le monde connaît la notion de compréhension, de liste compréhension par exemple, ou de sette compréhension?
00:42:20 :Ça vous parle?Ou pas?...Compréhension de liste, oui, mais la deuxième chose que tu as dit c'était?Bah c'est la même chose, tu remplaces liste par n'importe quel conteneur en fait.
00:42:41 :Tu peux faire des dictionnaires compréhension, tu peux faire des ensembles compréhension, tu peux faire des listes compréhension,tu peux faire des strings compréhension.En fait c'est juste le fait de construire à la déclaration de quelque chose le conteneur.
00:42:54 :Genre les listes compréhension c'est tu initialises une liste et à l'initialisation tu la construis.Les settes compréhension c'est tu construis un ensemble et à l'initialisation de l'ensemble tu le construis, etc.
00:43:06 :D'accord, alors personne, moi en tout cas ça ne me parle pas.Bah a priori liste compréhension ça te parle.Ouais, après ce que j'ai vu c'était dans les cours de Thibault, la compréhension de liste, que je ne m'y souviens pas bien.
00:43:21 :Ouais, mais du coup c'est la même chose, c'est ce qu'on va faire, mais on va le faire pour résoudre le problème.Mais c'est le même concept.
00:43:27 :Ok d'accord.Bon on va voir l'implémentation, c'est pas très compliqué, faut pas s'alarmer.Donc par exemple en restant sur le conteneur liste, donc le conteneur de nos données initiales,on va construire le conteneur résultat qui est une liste, par définition de l'énoncé, on veut construire une liste de résultats.
00:43:47 :Donc là ici c'est la syntaxe pour construire une liste compréhension et résoudre notre problème.Donc qu'est-ce qu'on fait? Dans la liste compréhension résultat, on met des éléments, et ces éléments sont dans liste 1.
00:44:01 :Donc on iter sur liste 1, chaque élément de liste 1, et pour chacun des éléments de liste 1,on demande est-ce que l'élément de liste 1 est dans liste 2.
00:44:11 :Donc en fait on répond à, dans l'énoncé, à l'indication, il faut que ça soit commun entre les deux listes.En fait c'est décrit par cette phrase, donc pour tous les éléments de liste 1, on regarde si l'élément est dans liste 2.
00:44:24 :Et ça en fait ça nous donne notre résultat.Par exemple là si on a liste 1,ça s'en sert aussi pour faire des tests.Si par exemple là on fait for élément in liste 1, et qu'on dit mets-moi les éléments dans une liste, ça nous refera à liste 1.
00:44:43 :Par exemple si on dit tu mets les éléments dans liste 1, que si élément est multiple de 2 par exemple,ou soit c'est l'inverse, il y a impaire, donc là on aura tous les impaires.
00:44:55 :Si on dit que c'est l'inverse de ça, donc on aura que les impaires.Et si par exemple on dit on résout notre problème qui est de savoir si élément est dans liste 2, on résout notre problème.
00:45:07 :Ça va ou je vais un peu trop vite?C'est aussi une méthode pour les tris. Il y a trois méthodes pour faire des tris.Je ne comprends pas ton mot clé.
00:45:23 :Les tris, quand tu as des tris.Ah du tri, oui, oui.Le mot tri.Short, enfin tri.Non les arbres, tu parles?Oui.Les tris, est-ce que tu peux faire les tris avec ça?
00:45:39 :Oui c'est ça.Je ne suis pas sûr de comprendre ce que tu dis.Là, c'est un problème d'accent, je ne sais pas si tu parles de trier ou de tri l'arbre en anglais.
00:45:58 :Non, non, pas l'arbre.D'accord, pour le tri, en Python tu as des méthodes pour trier, tu as des méthodes déjà implémentées, short, enfin S-O-R-T.Mais tu n'as pas besoin de faire de liste de compréhension pour trier.
00:46:16 :Il y a peut-être des algos que tu pourrais écrire en liste de compréhension, mais ça serait purement pédagogique.Tu as déjà écrit en Python et optimisé.
00:46:26 :Ok, donc là c'est les listes de compréhension.Est-ce que déjà pour les listes de compréhension, c'est bon ce que j'ai montré là?Est-ce que c'est bon pour tout le monde ou pas?
00:46:36 :Oui, ok.J'ai eu deux, trois oui je crois.Ok cool.Ok, et on va faire la même chose avec les sets de compréhension.Donc on peut créer un set à partir de la liste 2 par exemple.
00:46:49 :Et on peut faire ici, pour faire les sets de compréhension, bon on va le faire.Par exemple, pour tous les éléments de liste 1, on fait un set avec ces éléments, donc on écrit avec les crochets comme ça.
00:47:05 :Et au lieu d'avoir une liste en résultat ici out, on aura un set de résultat.Et ce qu'on peut faire en fait, c'est pour tous les éléments de liste 1, on fait un set.
00:47:17 :Donc là du coup ce que j'ai fait, c'est que j'ai dit que liste 1 en fait c'est le set liste 1 qui m'intéresse.Donc liste 1, on transforme directement en set, et on dit pour un élément dans littérateur ensemble sur liste 1,tu demandes si liste 1 est dans liste 2, mets l'ensemble liste 2, et si c'est le cas, tu mets l'élément.
00:47:47 :Donc tu renvoies un ensemble avec ça, et à la rigueur même, tu pourrais même juste dire que c'est une liste,t'as même pas vu de casse-té, je pense que là ça renvoie avec ton résultat.
00:48:00 :Donc là en gros, au lieu de dire que c'est un ensemble en résultat, tu dis que c'est une liste de résultat,et tu regardes dans les ensembles liste 1 et dans l'ensemble liste 2.
00:48:10 :Et après ce que tu peux faire pour éviter à chaque boucle que ça reconstruise l'ensemble liste 2,on peut le pré-calculer entre guillemets, c'est à dire là on met liste 1, après là on essaie de l'optimiser,je sais même pas si c'est un effet, parce que le compilateur est peut-être assez intelligent,
00:48:27 :le compilateur Python est sûrement assez intelligent pour faire ce que je suis en train d'écrire là en fait,de le faire automatiquement pour nous.Mais si on a un doute et qu'on a pas envie d'avoir une complexité qui explose,on peut le faire ça à la main et là pareil ça revient au même.
00:48:42 :Donc là en gros, l'avantage quand on fait comme ça, c'est qu'on est sûr de pas faire des répétitions.Par exemple si liste 1 possédait plusieurs fois la même valeur, avec la transformation en set,on sait qu'on récupérerait que les éléments uniques de liste 1.
00:48:57 :Et pareil, quand on fait le si élément est dans liste 2 ou dans set 2,du coup en utilisant un set dans cette requête d'appartenance, au lieu de regarder dans toute la liste,on peut en regarder dans l'ensemble de la liste, c'est beaucoup plus rapide.
00:49:14 :Parce que l'ensemble sait que les éléments sont uniques, et en plus lui il les trie,il les met, quand on demande à Python de faire un ensemble,il le met de manière plus intelligente en fait, en mémoire et en organisation,et les requêtes comme c'est dedans, c'est pas dedans, ou enfin toutes les interrogations en union,
00:49:31 :c'est vachement plus optimisé qu'une liste généraliste où on sait pas ce qu'il y a dedans.Donc ça, c'est plus optimisé.Est-ce qu'il y a une contrainte de volume de traitement d'items?
00:49:54 :Ouais, de toute façon on est toujours limité par notre RAM,si on veut faire ce type de traitement comme je l'ai écrit là actuellement,il faut autant de RAM que de données, et énormément,et ton résultat il faut pouvoir le stocker en RAM, donc il faut un espace en plus pour le résultat,
00:50:16 :mais tu ne consommeras pas plus que ça.Après il y a des méthodes, non pour le problème, je pense qu'on peut même pas optimiser l'espace mémoire,c'est pas possible, parce que répondre à la question est-ce que ça appartient,tu dois avoir conscience de l'ensemble des données en fait,tu peux répondre à peu près du cas que si tu as connaissance de toutes les données en fait.
00:50:40 :Donc je pense qu'il y a même pas moyen de gratter en mémoire, je pense qu'il y a pas moyen de gratter.Après tu pourrais gratter si tu redéfinis ton espace,enfin si tu redéfinis une géométrie sur tes données,c'est à dire que là on stocke des chiffres,peut-être qu'il y a une autre représentation qui pourrait répondre à la question de manière plus efficace en mémoire.
00:51:02 :Par exemple si on calculait les intervalles ou des zones,genre là c'est un segment 1D en fait, genre les chiffres, les entiers,tu peux les voir comme une ligne et tu mets des points sur la ligne.
00:51:13 :Et il y a peut-être une autre façon de voir géométriquement comment regrouper ces points sur la ligne,il y a peut-être une façon plus optimisée en mémoire pour résoudre ce problème.
00:51:23 :Mais par contre là c'est vraiment de l'exchange, c'est du trade-off,c'est à dire que si tu économises en mémoire, tu vas consommer plus de CPU.
00:51:31 :C'est sûr en fait.Tu pourras pas avoir les deux en fait, tu pourras pas avoir la mémoire et le processor.On peut pas avoir de barils d'argent du tout.
00:51:41 :Des fois ça arrive, mais là dans ce cas là je pense que c'est pas possible.Je suis pas un expert après, je fais pas de la recherche et développement en informatique.
00:51:51 :Ouais ouais, mais j'ai déjà dit à Samuel que Pascal il a des petits soucis avec son micro.Je pense que c'est lié à sa connexion là, participant à un niveau faible.
00:52:02 :Je pense que c'est son internet qui est peut-être pas assez bon.Peut-être, peut-être que c'est le niveau.Après en se concentrant un peu, on arrive à comprendre ce qu'il dit.
00:52:16 :Faut s'habituer un peu.Ok, donc ça c'est les solutions avec les sets ou le liste compréhension.C'est des réécritures, ça change pas la face du monde.
00:52:29 :Cette méthode, ces méthodes sont plus élégantes avec l'opérateur intersection ou directement la méthode intersection.Ok, et après on va voir une troisième méthode que j'appelle l'algo des doubles pointeurs ou doubles itérateurs.
00:52:47 :Du coup j'aurais dû faire un schéma, c'est dommage, je vais vous le faire à l'oral.Mais avec un schéma ça aurait été plus sympa, mais j'ai oublié de le faire.
00:52:56 :Pascal coupe la caméra? Ah oui ouais, c'est vrai que tu peux aussi couper la caméra pour limiter ton band screen, ta bande passante.Donc l'idée ça va être quoi?
00:53:11 :En fait on va imaginer visuellement, genre on prend liste 1 et on l'écrit comme des séries, enfin les numéros, les chiffres que contient liste 1,et on les met dans des cases. On prend liste 2 et on fait la même chose.
00:53:26 :La technique que je vais vous montrer, la double pointeur ou la double avancée sur des itérateurs, ça marche parce que liste 1 et liste 2,dans cet exemple et dans les non-slits sont triés. Et si on veut que cette méthode marche sur le temps, il faut trier les entrées.
00:53:42 :Donc trier les entrées c'est en nlog2n, et après la résolution de l'algorithme c'est en n, donc grosso modo l'algo serait nlog2n.Ce qui est à peu près... Ah ça pourrait être intéressant de regarder... Ah ouais mais là je vous parle de complexité, peut-être que vous connaissez pas trop la notion.
00:53:57 :En gros c'est par rapport à la taille de l'entrée, on estime combien ça prend de temps pour résoudre le problème.Donc il y a une gamme de familles, les programmes dits linéaires, ça prend autant de temps que lire les données d'entrée.
00:54:11 :Après il y a un peu au-dessus de linéaire, donc c'est les logarithmes, donc les nlog de quelque chose.Et après on a les trucs qui coûtent cher en n2 et plus, donc là c'est des algos qui explosent en complexité.
00:54:23 :Et inversement on a les sublinéaires ou les sous-linéaires qui peuvent aller plus vite que les linéaires.Est-ce que ça arrive? Oui ça arrive, des fois on peut résoudre un problème sans lire toutes les données
00:54:34 :parce que le flux de données en entrée et hors données a des caractéristiques qu'on peut exploiter.Donc là l'idée ça va être... On a les entrées triées, donc c'est ce que je mets ici.
00:54:50 :Les données d'entrée liste 1 et liste 2 sont triées, hors de croissance dans les non-c.Dans le cas contraire, d'ailleurs si on avait n'importe quel type de données, il faudrait s'assurer de leur ordre.
00:55:02 :Donc ce qu'on ferait c'est qu'on utiliserait shorted sur liste 2 et sur liste 1 aussi d'ailleurs.Est-ce qu'on a besoin? Non, quelque chose n'a... Oui, non, il faudrait le faire sur les deux.
00:55:14 :Putain c'est bizarre, je ne sais pas pourquoi je ne l'ai pas mis... Ah oui, non, c'est ici, c'est dans la loupe,après je le ferai avec shorted. Donc il faudrait utiliser l'opérateur de tri pour s'assurer que nos entrées sont triées.
00:55:25 :Donc l'idée ça va être quoi? L'idée c'est qu'on a deux listes, nos entrées, liste 1 et liste 2.On va avancer sur liste 1, donc élément après élément, et on va avancer...
00:55:38 :Et pendant qu'on avance dans liste 1, on avance dans liste 2 tant qu'un prédicat ou une condition n'est pas vraie.En l'occurrence la condition ça va être que l'élément dans liste 2 est strictement inférieur à l'élément qu'on est en train de visiter dans liste 1.
00:55:57 :Et tant que cette condition est vraie, on avance le pointeur de liste 2, on le fait avancer.Dès que cette condition n'est pas vraie, donc il y a deux cas, l'élément de liste 1 est égal à l'élément de liste 2.
00:56:10 :Donc là cette condition voudra dire qu'on a deux éléments en commun dans les listes qui ont le même nombre, donc c'est égal.Et dans l'autre cas, l'élément dans liste 2 est strictement supérieur à l'élément dans liste 1.
00:56:42 :Donc quand on est à ce moment là, on avance dans liste 1 le curseur pour que cette condition redevienne vraie.Donc concrètement ça fait quoi?
00:57:03 :On crée un itérateur sur liste 2.Donc là l'algo fonctionne avec des itérateurs, donc on avance élément après élément, comme si on avait un pointeur sur la listeet au lieu de regarder toute la liste, on regarde juste un élément à la fois, ordonné dans la liste.
00:57:18 :Donc là c'est ce que j'appelle hit pour itérateur et le mot clé, c'est hitter.Donc là il y a la documentation, vous pourrez aller voir, c'est comment transformer un ensemble de taille constante en itérateur,c'est-à-dire la possibilité de regarder élément après élément dans l'itérable.
00:57:37 :Donc on initialise i, la valeur dans liste 2, un non au début, on verra pourquoi.Donc là ce qu'on fait c'est que i, c'est le curseur dans liste 1, on le fait avancer dans liste 1, donc on fait un fort dans liste 1.
00:57:53 :Donc là i va prendre 1, 1, 1 élément dans liste 1 et à la fin de la boucle il repasse à l'élément suivant, etc.jusqu'à la fin où il n'y a plus d'éléments à visiter dans liste 1.
00:58:06 :Donc première étape, on se pose la question, est-ce que le j courant est égal au i courant?Est-ce que l'élément dans liste 2, j, est égal à l'élément courant dans liste 1, i?
00:58:18 :Si c'est vrai, on a intersection, donc il y a deux éléments dans liste 1 et liste 2 qui ont la même valeur,donc on le rajoute à résultat parce que par définition notre résultat c'est les éléments communs entre les deux.
00:58:30 :Au début, à première itération, j égale non, donc quelle que soit la valeur de i, normalement ce ne sera pas non,donc cette condition sera fausse et donc ici, à la première itération, ça ne rentrera jamais.
00:58:42 :Cette condition est faite pour les autres itérations dans les listes ou dans les itérables.Donc là on fait parcourir j dans l'itérateur de liste 2,donc là ici en fait on consomme, j prendra forcément le suivant dans liste 2,dans le cas de la première boucle, il prendra le premier élément, et dans les autres cas, il prendra les n éléments qui suivent.
00:59:11 :Donc là on regarde notre condition, c'est à dire qu'on fait parcourir le curseur de j dans liste 2,tant que cette condition est fausse, c'est à dire que j est strictement inférieur à i.
00:59:25 :Dans le cas contraire, donc j supérieur ou égal à i, donc un des deux cas, égal ou strictement supérieur,on sort de la boucle sur liste 2. Dans le cas contraire, j inférieur à i, on continue d'avancer
00:59:39 :et on cherche ce moment où cette condition devient vrai.Donc à la fin de ce fort sur liste 2, on a deux cas, soit c'est égal, soit c'est supérieur à égal,donc on a atteint la condition de sortie élément j de liste 2 supérieur ou égal à élément i dans liste 1.
00:59:58 :Et l'autre cas, c'est on est au bout de l'itérateur de liste 2, c'est à dire qu'on a parcouru tous les éléments dans liste 2.Donc là le fort il sort aussi, c'est à dire que indépendamment que ça soit vrai ou pas, quand il n'y a plus d'éléments dans liste 2,
01:00:11 :donc à la fin de la boucle fort j sur liste 2, on sort de la boucle.Donc là on se repose à la sortie de la boucle sur liste 2, on se repose la question, est-ce que l'élément j est égal à l'élément i?
01:00:27 :C'est un cas sur trois, donc c'est le cas où c'est égal ici, mais ce n'est pas le cas quand c'est strictement supérieuret ce n'est pas le cas quand on a fini d'itérer sur liste 2.
01:00:36 :Si c'est le cas, on rajoute j dans le résultat, parce qu'on a vérifié que c'est des éléments communs entre j et i.Et dans le cas contraire, on ne fait rien.
01:00:53 :Cette condition on est obligé de la rajouter, en fait ces deux codes là c'est les mêmes,on est obligé de la rajouter parce que les forts en fait consomment, dès qu'on commence un fort ça consomme un élémentet quand on sort du fort ça ne revient pas pour faire la condition, pour faire la vérification.
01:01:10 :Donc en gros là si on sort, en fait si on ne les met pas au début et à la fin, il y a des cas qu'on n'aura pas,par exemple si le dernier élément de j répond à la condition, si on ne le met pas ici, le j égal i, en fait on ne reviendra pas ici pour l'ajouter.
01:01:28 :Donc dans certains cas on est obligé de refaire cette vérification avant de sortir,parce qu'on n'est pas sûr de remonter à la prochaine itération pour faire le test.
01:01:37 :Et du coup, normalement si on fait ce simple algo, c'est à dire d'avancer un par un dans liste 1 et d'avancer dans liste 2tant qu'une condition n'est pas vraie, et qu'on rajoute, et dès qu'on a un j égal i, donc élément dans liste 1 est égal à élément dans liste 2,
01:01:58 :on rajoute dans résultat, normalement en faisant cet algo, on a le résultat qu'on cherche,c'est à dire on a parcouru tous les éléments dans liste 1, on a parcouru tous les éléments dans liste 2,et on a vérifié au fur et à mesure que j égal i, et si c'est le cas, on le rajoute dans résultat.
01:02:14 :Du coup là, je me rends compte, l'oral c'est pas super clair, avec un schéma c'est vachement plus explicite,c'est à dire on écrit nos listes dans des petites cases et on fait avancer un curseur à la main,et on voit que cet algo en fait répond au problème, parce que le problème est simple, l'algo est aussi assez simple,
01:02:37 :c'est juste qu'il faut s'assurer qu'on fait bien toutes les itérations et toutes les bonnes sorties pour ne pas oublier des éléments.Laurent demande s'il faut que les listes soient ordonnées de manière croissante, on pourrait les faire,en fait il faut qu'elles soient ordonnées, si on les fait de manière croissante, on fait l'algo que j'ai écrit,
01:03:02 :si on les fait de manière décroissante, il faut faire le parcours des listes dans l'autre sens en fait.Donc on pourrait avoir des listes décroissantes, et il faudrait juste inverser les curseurs,qu'ils aillent dans l'autre sens en fait, qu'ils aillent de droite à gauche entre guillemets, si on lit de gauche à droite,
01:03:19 :de haut en bas, ça dépend comment on représente les listes d'entrée.Donc là quand on exécute avec le assert à la fin, ça marche.Un truc qui peut être intéressant, je pensais que je l'avais écrit par rapport au truc...
01:03:38 :Comment je l'avais testé? Ah oui, du coup, par exemple là, si on voulait tester l'histoire que je vous racontais sur l'ordre,par exemple là si on inverse 6, enfin si on déplace 6, on le met là, et si on déplace 8 par exemple, et on le met là.
01:03:58 :Donc là, tac, si on relance cet algo, c'est à dire sans faire le tri, là en fait on a déjà inversé 2 éléments,donc les listes sont plus triées, on peut le voir, je peux vous le montrer.
01:04:11 :Donc liste 1, et liste 2, on va les afficher les deux.Là ici en fait il y a 1, 5, 7, 9, 10, 6, donc là ici c'est plus ordonné, et 2, 3, 5, 7, 10, 12, 8, c'est plus ordonné.
01:04:31 :Donc là si on relance cet algo, normalement ça ne va pas marcher, parce qu'on ne fait pas de tri, et ça a marché.Pourquoi ça marche? Ah l'effet démo...
01:04:42 :Attends c'est marrant, normalement ça n'aurait pas dû marcher. Ah oui mais en fait ça dépend...En fait non, ok d'accord, si on veut que ça ne marche pas, il faut que l'inversion, il faut que je le fasse sur un des éléments du résultat.
01:05:00 :Ok bon on refait, par exemple là on déplace 5, on met à la fin, et on déplace 7, et on met à la fin.Là ça va marcher, enfin justement ça ne va pas marcher, c'est ça que je veux voir.
01:05:19 :Donc là ça a déplacé 5 et 7, et normalement ça ne devrait pas marcher.Ah là, donc là ça ne marche pas, parce qu'il dit que le résultat n'est pas celui qu'on attend.
01:05:30 :Par contre, normalement si on remet, j'espère que ça va marcher, mais si on remet les encrées dans l'ordre,donc c'est ça et c'est ça, normalement ça devrait remarcher.
01:05:47 :Ouais, normalement ça devrait remarcher. Et là ça remarche.Voilà, du coup ça n'est pas d'erreur, donc ça marche.Je ne vous ai pas perdu, vous avez compris là ce que j'ai essayé de vous montrer.
01:06:03 :En gros l'algo des double cursors, ça fonctionne, la condition pour que ça fonctionne c'est qu'il faut qu'il y ait un ordonnancement entre les listes d'entrée,et si par ordonnancement, et en particulier si on déplace le résultat d'intersection, il y a de fortes chances que ça marche,c'est pas obligatoire, ça dépend comment on désorganise les listes, mais normalement la condition pour que ça fonctionne c'est qu'il y ait un ordonnancement sur les listes d'entrée.
01:06:32 :Ce que fait CEP d'ailleurs, d'ailleurs ouais c'est intéressant de voir, normalement il me semble que CEP c'est ce qu'il fait.Par exemple si on a une liste 1, 2, 3, 0, normalement si on fait un CEP de ça il devrait refaire 0, 1, 2, 3.
01:06:51 :Donc là ici il y a un short, ou il y a un tri implicite à la création de l'ensemble.Donc quand on transforme nos listes en CEP, on a un tri qui se fait de manière implicite.
01:07:08 :Donc ce tri là qu'on fait là explicitement, il est fait à la création des CEP.Cool. Du coup on a fait qu'un exercice, comme on a eu la petite conversation au début qui était fort intéressante,
01:07:34 :d'ailleurs avec Pascal on a un peu utilisé un peu plus de temps.Mais après c'est aussi intéressant, c'est de la culture générale et de la communication entre développeurs.
01:07:47 :Je pense qu'il est plus expérimenté, il a dû avoir de l'expérience dans de l'industrie ou dans des informaticienspour des années 70-80 j'imagine, vu les types de langages qu'il parle et des technos qu'il parle.
01:08:00 :Mais du coup c'est aussi intéressant, bon peut-être plus de l'année 90,et c'est intéressant d'avoir ce type d'expérience ou de retour d'expérience sur comment c'était fait avantvoire même comment c'était fait encore. Comme il disait dans assurance banque et certains secteurs,
01:08:15 :ils utilisent encore des technos anciennes, mais qui sont robustes.Et donc c'est la principale caractéristique que cherchent ces secteurs d'activité.Du coup ça peut être intéressant d'avoir aussi une vision sur d'autres façons de faire, d'autres façons de penserce qui a été fait avant. Et en général ce qui va être fait plus tard c'est basé sur ce qui est fait avant.
01:08:44 :Désolé, on n'a pas été super loin dans les exos. Il y aura d'autres exos, je verrai avec Thibault,on pourra faire des sessions de ce type avec justement des implémentations alternatives, d'autres façons de résoudre les problèmeset d'autres façons d'utiliser d'autres types ou d'autres constructeurs Python.
01:09:10 :Moi je trouve ça assez intéressant, que ce soit la communication que je fais avec vous et le méthode d'apprentissage.Et je pense que ça peut être quelque chose d'intéressant pour vous d'avoir une vision plus large des possibilités de résolution.
01:09:24 :Ouais ouais, du coup c'est dans le titre, ici là quand on clique on a un hyperlien et on a accès à docstring,il faut être sur votre compte. Le nom que j'ai mis de l'exercice, c'est le nom de l'exercice.
01:09:43 :Donc là, trouver les éléments communs de la liste. Normalement si vous cherchez ça dans docstring, vous devez tomber dessus.Non, ça ne marche pas. Bon, pourquoi ça ne marche pas?
01:09:56 :Bon, je vais réécouter, mais normalement les titres que j'ai mis ici, des exos, c'est les titres des exercices,donc normalement ils devraient avoir une correspondance. Et sinon c'est des hyperliens, donc là ici il y a un lien associé.
01:10:12 :Si vous cliquez dessus, vous tombez sur l'exercice sur docstring.Du même? Ouais ouais.Juste te dire aussi, je ne sais pas ce que tu en penses, mais un truc que je me dis qui pourrait être intéressant,c'est un peu comme Thibaut fait avec des projets plus grands, tu sais de relecture, de refacto,
01:10:33 :carrément. Mais moi je suis chaud, moi je l'ai demandé quasiment à chaque fois à Thibaut de faire des trucspour vous faire une indication de quel sera le prochain thème ou quelle sera la prochaine session.
01:10:46 :Et à chaque fois je lui demande, moi c'est un truc que j'aimerais faire plus, et vous incitez à le faire,d'être trop actif et de me passer du matériel et qu'on travaille là-dessus.
01:10:55 :Là le truc c'est, à mon avis c'était les FAT, il y a peut-être moins de monde, ou peut-être plus de fonds au taquet,et du coup j'ai eu quasiment aucun retour, il n'y a qu'une personne qui avait joué le jeu, Romain,bon bref, mais lui il a un niveau un peu plus avancé, donc c'est pour ça qu'il était parti là-dessus.
01:11:11 :Mais là j'ai pas eu de retour de personne, donc moi j'apporte le matériel.Oui bien sûr, parce que c'est juste, ça peut être intéressant, je me dis s'il y a des petits exomèmes simples,mais où chacun donne un peu sa façon de faire.
01:11:26 :Oui, mais t'as raison.Et je pense que le prochain thème, c'est le thème de la récolte,et je pense que la prochaine session, si on en fait une avant la fin de l'été,je passerai la liste des exos, comme ça ça vous laissera en amont le temps de les regarder et de proposer une solution.
01:11:43 :Oui carrément.Comme ça on pourra partager un peu des codes et des avis en fait.Oui complètement, ça serait cool.Ok, j'en parlerai à Thibault, ça peut se faire facilement ça.
01:11:55 :Ok, ça marche nickel, merci.Si vous avez des questions, si vous voulez, pareil, faire des remarques comme ça, c'est très intéressant, donc n'hésitez pas.Yes Chris.
01:12:15 :Du coup on va mettre ce que je disais en début de séance, on va mettre les codes et le Jupyter Notebook que j'utilise,on va le mettre en versionnement sur le GitHub d'Oxtrin, donc de Thibault, et comme ça vous pourrez accéder offline à ses ressources.
Aucune occurrence trouvée pour « ».