 On va commencer tranquillement la soirée. Je vous remercie d'être là, de venir à notre premier workshop piton à Lutiam. C'est David, ici, qui va faire la présentation ce soir. Il va vous aider à travers son exercice avec l'ex-un bébé, le robot. J'aimerais remercier nos sponsors, avec les personnes qui n'ont plus rien vu ce soirée. Ludia, qui est représenté par Adrien, et Alexandre, qui s'en va faire Linux. J'ai été très adrien à venir vous dire un petit mot. Bonsoir. Je m'appelle Adrien. Je suis en charge de la direction publique chez Ludia, qui est une compagnie de jeux vidéo. En gros, on est très fiers de sponsoriser le commandité Morale Piton pour ce genre d'activité. À Morale Piton, il a un peu demandé, il m'a dit 20 euros gens que le piton s'est utilisé professionnellement. C'est un vrai langage. On n'est pas juste un petit langage de script. Je peux vous assurer que je vis grâce à Piton. C'est très bien. Je vous invite à bien écouter ce soir et à continuer le piton. C'est un langage qui est très versatile, qui vous permet d'aborder la programmation sur un aspect très pudique et très intéressant, qui vous permet de faire plein de choses. J'espère que, si je pense, que vous m'avez persuadé que ce soir, vous allez le voir avec le comment pipper son chat de bottes. Je l'en profite aussi pour vous dire que parmi à Montréal, Ludia est en train de devenir, grâce aussi aux efforts de Morale Piton, un joueur majeur dans le piton à l'échelle locale. On va essayer aussi à l'échelle internationale avec la participation de Ludia à la conférence attentionnelle à Paris-Cône. Du monde va essayer. Je vais laisser des cartes d'affaires traînées pour ceux qui s'intéresseraient après vos études. On m'offre des salaires relativement compétitifs. J'espère que vous allez passer une belle soirée. Merci. Merci, Adrien. Merci. J'aime très le temps, Alexandre, de chez en France à Linus. Bonsoir, je m'appelle Alexandre Boilly. Je suis consultant et développeur chez en France à Linus. Mon rôle principal, c'est de développer en piton. Nous autres, on couvre presque tous les langages et on prend le plus en plus de place au sein de la compagnie parce que c'est le plus convial, le plus simple et surtout le plus efficace. C'est très amusant à programmer. Donc, des employés heureux, c'est d'en faire travailler. On est une entreprise en pleine croissance en ce moment. Vous vous embauches si ça vous intéresse pour vos stages, pour vos emplois. On en couvre tout ce qui est là, ce célébre. Donc, dans notre nom à Linus, ça ne va pas bien. Autant, d'embarquer du développement, les relations d'affaires ou de la formation. Et on est très content de se sponsoriser ici à Montréal-Piton parce que c'est un langage qui nous c'est encore. On aime bien développer avec l'objet du Tartot. Heureusement, on est peut-être pas aussi compétitifs que chez Ludia, mais les conditions de travail sont très, très intéressantes chez nous aussi. On travaille, Ludia et Céronthalix travaillent. On se tombe. On va commencer de remercier le développement. Je pense que c'est quand même important de remercier Lucam. Lucam nous offre les locaux gracieusement. Et aussi, l'association générale des étudiants, je crois en informatique. On se connaît bien, mais je ne retiens pas le signe. Il y a de la nourriture aussi qui est justement offerte par l'association. Donc, si vous n'avez jamais une petite réégale, je vous invite à y aller. Au niveau du programme, ce qu'on va essayer de faire, c'est d'avancer avec une heure directe. Ça ne sera plus un peu plus tutoriel au début, je dirais, un peu plus théorique. La deuxième partie se veut un peu plus libre où elle est là. On va jouer avec un robot de Jabber en espérant que tous les réseaux fonctionnent bien. Je tiens à vous dire que l'idée a germé avec nos collègues l'année dernière. On s'est dit, comment ça se fait que les gens ne connaissent pas Python à Lucam? Il faut aller montrer ça. Notamment aux étudiants en informatique. Ce que je disais à mon ami Jean-Philippe, j'ai dit, il y aurait 5 personnes, on fait l'atelier, il n'y a pas de problème. On est un peu victimes de notre succès et c'est tant mieux. La seule chose, c'est qu'il sera moins convivial que si on était 5 à l'entour d'une table. J'espère que tout va pouvoir bien fonctionner au niveau technique et que ça sera assez fluide comme si on était 5 ensemble. J'en profite pour rappeler qu'il y a plusieurs membres de l'équipe Montréal Python peut-être se signaler. Yannick, Mathieu, Cyril, il y a des règles qui ne se manifestent pas. Il y a Pierre-Récy, Jean-Philippe, qui connaissent très bien Python, certainement mieux que moi. En fait, moi, je ne suis pas un développeur du tout. Je suis un gestionnaire de projet. Je faisais du PHP avant. J'ai découvert la capacité de scripter mes pages HTML. J'étais tout fasciné. Et à un moment donné, je suis par la faute de collègues qui m'ont poussé vers Python en disant que ça serait vraiment intéressant qu'on aille vers ça. Je suis tombé dans Python et j'ai découvert l'univers Python que je souhaite vous montrer aujourd'hui. Ce qui est génial, à la grande différence, peut-être de PHP. Je parle de mon histoire personnelle. Peut-être même de Java que je connais moins dans ces utilisations, je dirais professionnelles. C'est la versatilité de Python. C'est-à-dire que vous pouvez faire des applications web. Vous pouvez gérer. Toutes les admins de système peuvent monter un paquet de scripts d'administration de leur serveur. Vous pouvez mettre du Python dans votre téléphone Android. Vous pouvez l'utiliser pour faire des bottes dans les salons. C'est extrêmement versatil. Ce soir, vous comprendrez qu'en deux heures, on n'a pas la prétention de monter toute la puissance du langage et toutes les librairies. L'intérêt, l'objectif, et je vous garantis qu'on va y arriver, c'est de vous donner le goût au langage, de vous montrer sa simplicité et surtout que vous donnez tout ce qu'il faut pour que vous puissiez continuer et qu'on continue ensemble dans des ateliers plus spécifiques après. Vous montrez comment faire pour explorer vous-même Python et puis monter vos scripts, vos modules. On a pris un tout petit peu de retard. Je propose qu'on essaie de prendre une pause dans une quarantaine de minutes, peut-être une pause assez longue dans la mesure où il y a des paquets installés pour la suite et puis je sais qu'il y a des personnes qui sont arrivées à l'heure ou peut-être juste un peu en retard aussi. À ce moment-là, on profitera de cette longue pause-là pour s'assurer que tout le monde en environnement technique. Si ça fonctionne plus ou moins bien, parce que pour toutes sortes de raisons, peut-être travailler en équipe aussi Ok, alors, sur le site de Montréal-Piton, on a un petit R ici qui est important de ne pas oublier. On a un outil RedMind de gestion de projet et j'ai créé une page wiki pour le projet Workshop Ucam, donc sur wiki, où il y a le plan de match aujourd'hui. On peut peut-être regarder ça rapidement. Je vais parler dans une première partie d'abord, je vais vous dire où est la documentation puis s'assurer que les environnements sont corrects, on devrait être bon. Ensuite, dans les bases-là, c'est la partie un peu plus théorique sur les types essentiellement la syntaxe, le langage lui-même, puis de l'explorer dans l'interprétaire, de façon interactive. Ensuite, c'est là qu'on va se faire du fun avec un robot de Jabber qu'on va essayer, comme disait mon ami, de pimper, c'est-à-dire de l'améliorer vous-même avec certaines fonctions, parce que vous serez capable de coder dans quelques minutes. Aussi, un sandage de satisfaction que j'espère va fonctionner. On va essayer de régler ça pendant la pause aussi. Voilà. Ça, c'est le plan de match. Je vais laisser ici en haut un certain nombre de points de détails et puis tout va se passer après dans l'interprétaire. Alors, oui, cet atelier-là, je l'ai présenté à des collègues dans le cadre d'une semaine de tech qu'on a organisé. Je vous ai laissé l'URL ici juste pour vous dire que l'ensemble de la formation ou de l'atelier a été présenté dans un atelier Jabber, justement, c'est-à-dire. J'écrivais « Link Parling ». Une chance, j'avais préparé mon texte, je faisais du copier collé. Mais vous pouvez voir toutes les archives de discussion. Donc, s'il y a des bouts, après que vous voulez revoir, parce que là, ça serait nettement plus orale, finalement, que écrit. Alors, c'est objectif. Aujourd'hui, on va coder dans l'interprétaire. Et on va explorer donc avec ça les bases du langage Python. Mais ce qui est un peu embêtant de coder dans l'interprétaire, c'est que, bon, c'est sûr, on pourrait sauvegarder notre session, sauf qu'à un moment donné, c'est pas intuitif. On veut faire des scripts. Donc, on va voir comment faire un script Python. C'est vraiment pas compliqué. Et on va l'exécuter, on va faire exécuter par l'interprétaire. Ensuite de ça, ici, je ne l'ai pas marqué dans les objectifs, mais je vous montrerai comment faire un module. D'ailleurs, le robot, ça sera un vrai module, qu'on va exécuter, étudier, puis modifier. Les documentations. Je ne sais pas si vous voyez bien. Par ailleurs, c'est clair. Tout le monde, surtout au fond, vous voyez bien. Excellent. Alors, la documentation Python. Alors, ce n'est pas très compliqué à retenir comme URL. Voilà. Python.org. Ça, c'est la page à retenir, quand on cas dans Python. Là-dedans, vous voyez, on va travailler en Python 2.x, donc 2.7 ou 2.6. Moi aussi, je suis en 2.6, je ne me trompe pas. La différence avec 3, il y a certaines différences fondamentales. Comme je vous dis, moi-même, je ne suis pas développeur. Je peux vous en donner une que je sais. C'est notamment de la gestion des chaînes de caractère qui est différente. On va y revenir. Mais il y a certainement plus d'amélioration. Vous pourrez en parler avec nos grands geeks ici qui vont pouvoir vous expliquer avec bonheur les différences en Python 2.7, 2.3. D'ailleurs, si vous êtes vous-même intéressé sur la page d'accueil, il y a une page d'accueil de Python. Il y a un petit topo là-dessus. Comment choisir entre 2 et 3? Voilà. Donc, on ne fera pas l'atelier là-dessus. Ok. Déjà, ce qu'on peut voir, et d'ailleurs, c'est là où je clique le plus souvent, il y a un tutoriel. C'est le tutoriel officiel. Donc, à défaut d'avoir des ateliers à Lucam, vous pourriez vous asseoir tranquillement chez vous, vous lire ça. Et vous avez le tutoriel officiel Python qui est là. Qui couvre... Bon, qui va aller plus en détail, évidemment, que ce qu'on va voir là, mais on va avoir couvert une bonne partie. Et puis, la page de documentation de la librairie built-in de Python. Donc avec ça, même si on arrêtait là, vous avez déjà de la matière pour continuer. Ok. Ensuite, pour coder, qu'est-ce qu'il vous faut? Ben, un éditeur texte. Puis, déjà, je me demande toute généralité. Moi, je suis plutôt rédimentaire. On ne va pas faire la guerre en IMAX, VIM ou tout ce truc-là. Moi, je travaille un petit éditeur texte G-édite qui vient par défaut sur les systèmes Linux. C'est comme l'exécutant de blocknotes sur Windows. Alors, je suis très heureux avec ça. La seule chose qui est intéressant dans l'éditeur texte, un truc qui est intéressant aussi, c'est l'indentation. En Python, l'indentation, c'est important. En fait, c'est tellement important que le langage plante si vous faites une faute d'indentation. Donc, ça vous aide à structurer le langage. En fait, on verra un peu plus loin justement qu'on abordera la syntaxe, qu'il n'y a pas toutes sortes de brackets pour structurer les blocs de code. C'est l'indentation qui fait foi. Donc, de pouvoir indenter un certain nombre de blocs de code comme ça ici d'un coup avec en sélectionnant le table, voilà. Aussi, l'indentation, comme je vous disais, par convention, puis je vais revenir, je vous donnerai une page qui fixe un peu les conventions syntaxiques Python. Par convention, on met quatre espaces pour faire l'indentation. N'utilisez pas de tables. On n'en veut pas de tables dans le code source. Donc, prenez le temps d'aller dans votre éditeur. Et quand vous utilisez table, remplacer ça par quatre espaces. Ça n'avait certainement pas mon éditeur. Les interprétaires. Python, c'est un langage interprété. Ça veut dire que, bon, une finie est compilée quelque part, mais ça, ça ne nous intéresse pas. Concrètement, pour nous qui développons, on n'a pas besoin de compiler notre code source pour voir si il marche. On peut l'exécuter, le faire exécuter par l'interprétaire. Donc ça, c'est cool. Les interprétaires par défaut, c'est Python. C'est donc le logiciel qu'on vous a demandé d'installer qui vient par défaut sur les systèmes Linux. Et Mac aussi, je crois. Il existe aussi iPython qui est vraiment tripant. Je vais utiliser ça, moi. C'est pour interactive Python. Ça nous permet d'explorer le langage beaucoup plus facilement. Je vous montrerai ou pour être juste aussi les astuces dans Python aussi. Dans l'interprétaire Python, je dirais nature, originale, comment explorer les champs. Bon, pour les sources, je vous ai mis les URL ici. Ça sera plus pour la deuxième partie, c'est le robot qui est là. Puis l'ensemble des documents, le plan détaillé qui est ici, qu'on va passer ensemble, se trouve aussi dans les sources sur le projet sur notre RedMind, Montréal Python. Alors, c'est parti. On commence. Alors, comme première chose qu'on fait, on va lancer l'interprétaire. Je lance iPython. Alors, il m'explique que moi, je travaille en Python 2.6.5. Ça, c'est pas des choses super intéressantes. Là, j'ai un problème parce que je vois pas tout. Fait que je vais replacer. Voilà. Ça devrait être bon. OK. Alors, l'interprétaire fonctionne par une poutte en poutte. Alors, vous lui donnez des choses, puis vous répondez aux choses. Tout simple. Alors, par exemple, si je lui dis le chiffre 5, il me retourne 5. C'est super génial. Mais, on verra qu'en faisant des traits un peu plus complexes, il va nous retourner la valeur, par exemple des variables. Le but de l'interprétaire aussi, c'est de développer et interactivement, on explore avec le code. Puis, quand on a des trucs qui nous intéressent, on va les mettre dans notre script final. Plutôt que d'aller coder dans le script, le réexécuter, coder. Donc, c'est vraiment un outil, c'est le réflexe pour explorer. Notamment des nouveaux modules. On va en découvrir plein aujourd'hui. Si vous ne savez pas comment faire, vous l'importez dans l'interprétaire puis vous explorer. On va faire donc d'introspection ensemble. Là, c'est un taxe. Et dans l'interprétaire, en Python, c'est avec diesel. Si je marque ceci est un commentaire, il n'y a rien que ça fiche. C'est un commentaire. On le verra un peu mieux dans l'exécution de code. Mais ça, ce n'est pas une chaîne de commentaire, c'est un commentaire. Il n'y en a pas d'autres cibles. Des fois, dans d'autres langues, on va des slashes étoiles puis ça fait des blocs. Donc, nous, ce qu'on utilise, c'est de mettre des dies partout. Donc, ça, peut-être un petit plus dans votre éditeur aussi qui soit capable d'utiliser des visiaises. Moi, je suis un peu primitif. J'y vais à la main, par exemple. Tout le monde se moque de moi. Mais ça marche! Ok. Déjà, les variables. Vous n'avez pas besoin de mettre de dollars ou d'autres fiéritures. Vous voulez créer une variable qui s'appelle VAR, puis lui donner, par exemple, la chaîne de caractère des vines, qui est mon prénom par ailleurs. Et voilà, c'est stocké. Et si j'ai pris et me donne comme une poudre VAR, il va me donner la valeur de la variable. Bon. C'est tout. Donc, déjà, c'est agréable en niveau syntaxique. On n'a pas besoin de point vergule. Vous avez vu que j'ai fait une affectation à ma variable. J'ai pas mis de point vergule après. Pourquoi un point vergule? Pas besoin. En Python. Et les blocs de code. On va y revenir. Mais si, par exemple, je vous fais une liste rapidement avec les valeurs 1, 2, 3, puis je dis pour chaque item dans ma liste, je dis tout simplement d'imprimer l'item. C'est un peu ridicule comme code. Mais vous voyez que, ici, j'ai pas utilisé d'accolades pour structurer une boucle. Pareil pour le conditionnel ifL, printL. Bon, c'est un peu ridicule. Mais ça marche. Puis ifFalse. Donc, là, c'est une constante. On va revenir. Pas une constante, mais c'est un... Oui, c'est un... un mot-clé du langage qui veut dire ifFalse. PrintFalse. Là, la condition devrait échouer. Évidemment, je n'ai rien imprimé du tout. Ok? Donc, je veux juste vous montrer ici tout de suite que j'ai pas d'accolade qui vient structurer ni mon if, ni mon for qui me faisait boucler. Ok? Ben, ça, c'est intéressant. Par contre, qu'est-ce que j'ai? J'ai de l'indentation. J'ai mon print qui est indenté et avec quatre caractères, s'il vous plaît, pas de table. On continue. Alors, la syntaxe, ça se résume... Bon, évidemment pas juste à ça. Il y a un paquet de mots clés qu'il faut connaître, tout ça. Mais, je veux vous montrer... Il y a un lien ici qui s'appelle le PEP8, ça. Quand vous verrez, quand vous allez commencer à parler de PEP8 avec des pitonneux, là, vous allez commencer à avoir leur respect. D'ailleurs, tout ce que je vais vous montrer n'est pas nécessairement PEP8. PEP8, c'est des conventions de style pour coder un fichier Python qui a de la l'ur, je dirais. Pas nécessairement qui... j'allais dire qui compile, mais je veux dire. On parle plus de syntaxe, on parle de style. Mais le style, c'est important. Les PEP, ça veut dire Python Enhancement Proposal, voyez ça comme les RFC. Un peu... Donc, c'est des propositions, il faudrait voir leur statut, mais considérer le PEP8 comme déjà plus que validé, ok? Je vous montre rapidement à quoi ressemble le PEP8, le fameux. Évidemment, c'est en anglais. M'en tiendrait pas rigueur. Et en gros, comme c'est ici le Style Guide for Python Code. Alors, dans le PEP8, ce qu'ils vont vous expliquer, souvent, ce qui revient, dans votre ligne de code, il ne faut pas que ça dépasse 80 caractères. Ah, ça te fait un peu audu-cool. Mais c'est quand même agréable. Comme ça, on peut travailler avec deux fenêtres, une à côté de l'autre. Donc ça, c'est pas mal. Ils vont expliquer quand laisser des lignes espacées. Je vous dirais, c'est peut-être pas la première chose à étudier. C'est sûr, si vous ne savez pas coder rien à Python, le style est peut-être secondaire. C'est peut-être devenu important, surtout que d'autres personnes vont lire votre code. Puis c'est tout l'intérêt d'avoir un style qui est cohérent, qui se tient. Alors, on continue. Les types. Alors ça, ça va aller vite. Mais c'était quasiment le coeur de la première partie. Je vous montre en rafale les types. Il y a un type built-in qui s'appelle None. Un peu comme dans les bases de données, on n'a nulle. Je le stocke dans une variable. Puis, ça va l'heure, ça va l'heure, c'est rien. Donc voilà, c'est... Ça peut être utile pour initialiser une variable quand vous ne savez peut-être pas quel type on souhaite avoir. Bon. Vous retournez une fonction qui va retourner rien dans certaines circonstances. Ça ne retourne pas, par exemple, plus de lise vide. Il va retourner rien, par exemple. Puis on peut tester le type None. Les bouléins, assez simples. Alors, les mots-clés, noter les majuscules. Est-ce que c'est mon cas d'être en bas? On me voit bien quand même les lignes en bas. Oui, super. B égale troupes. Alors, ça me retourne troupes et B égale false. Alors, il y a juste troupes false, juste retenir qu'il y a des majuscules. C'est bouléin, tout simplement. Ensuite de ça, les entiers. Ça, c'est la partie, je dirais, un peu plus honteuse de Python. En tout cas, les opérations avec les entiers. Alors, si je prends l'entier 15, mettons, on va dire, l'entier est égal à 30. Évidemment, on peut faire des sommes. On peut faire des subtractions. A moins B. On va envoyer un nouveau du style. Ça aurait été bien, je laisse un espace après le moins. Par contre, au niveau des divisions, si on fait, je sens les stockings dans les variables, je cas directement les entiers. Si je divise un par deux, on s'attendrait à avoir 0.5, par exemple. Sauf que ça retourne 0. Bon, je vous assure que le type qui suit les floats, les décimales, fonctionne bien. Donc, si vous avez des opérations à faire, à coder, allez-y avec des floats. Peut-être que ça ne choque pas certaines personnes. Si vous voulez en savoir davantage là-dessus, je vous prie de lire. Mais si vous commencez à lire sur le web, sur le sujet, par ailleurs, ça ne veut pas dire que Python est incapable de faire des maths, je vous rassure. Il existe un superbe librairie que je ne connais pas moi-même, qui s'appelle Matplotlib, qui est en fait l'équivalent de Matlab en Python. On avait eu, dans le cadre de Montréal Python, des collègues, je ne sais plus s'ils étaient de Lucam ou de McGill, qui avaient présenté Sage, si je me trompe pas, qui est de Lucam. Un super tout le kit de mathématiques qui vous permet de faire virtuellement tout et n'importe quoi. Je ne suis pas mathématicien, je ne peux pas vraiment juger, non-py, sci-py, donc les matrices, tout ce que vous voulez, ça se trouve là-dedans. C'est un peu loin de mon monde. On va continuer avec nos petits types. Donc on a vu les float, on a vu les entiers. Faites juste gaffe quand vous faites des opérations avec les entiers, notamment au niveau de la division. Bon, les chaînes de caractère. En fait, il y en a trois types, je pense que je l'ai juste mis deux. La chaîne de caractère se déclare avec des simple quotes ou des double quotes. Et par exemple, on peut mettre le string de vin, voilà. Il existe un autre c'est une autre type de chaîne de caractère, là je parle comme un humain, mais au niveau Python, c'est carrément un autre type qui s'appelle unicode. À ce moment-là, la différence entre le string et l'unicode, le string c'est de la ski, puis l'unicode, bien c'est de l'unicode. Encodé a été fuite. Pour ceux qui sont peut-être plus débutants informatiques, comme moi. Toutes les nuances, justement, dans l'encodage de caractère, tout ça, c'est un univers en soi. Sachez que si vous devez utiliser des caractères dans une chaîne, ça, ça fonctionne. En fait, j'ai mis S, mais je n'aurais peut-être pu mettre unicode, là. Ça, c'est Python n'est pas très bon pour la représentation des trucs dans le sens où je pense même que c'est René, ça, j'en parlais avec un collègue qui connaît ça mieux que moi. Bref, string, unicode sont des choses différentes. Si vous essayez, par exemple, de déclarer faite avec l'accent, sans mettre le U devant. Ça marche. Ça donne le même truc. Print S. Ouais. OK, le print est le correct. Non, mais je pensais qu'il allait m'insulter, que je mettais un accent sans mettre de U. Dans le script de vrai m'insulter, si je dégrape un truc. Bon. Si, bon, je saute un peu du coque à l'âne, là, mais à la fin, si vous avez aimé l'atelier, on se propose d'en présenter un autre sur le développement web, notamment avec le framework Django qui est relativement très, très simple. Et le lien avec ce que je viens de vous présenter, c'est que Django gère ça automatiquement pour vous que vous mettez des U ou pas. En 3.0, les strings normaux devraient être des strings unicodes. Parce que la planète, c'est pas juste de la ski, vous en parlerez à mes amis vietnamien, bon, voilà. Maintenant, ça, c'est les types de base. Avec ça, on fait un certain nombre de choses, mais ce qui vient intéressant, c'est disons des types que je pourrais remplir et appeler de structure. Par exemple, les listes. Je vous en ai montré un rapidement. Avec les crochets, les brackets en anglais, vous pouvez lister des trucs. Bon, c'est génial. On imprime la liste, c'est une liste d'éléments qui sont ordonnées. Sauf faire un mapur. Si la liste est ordonnée. Le tuple, tout de suite après, on va jouer avec les types. Allez voir ce qu'il y a derrière, parce qu'on se dit c'est un peu léger comme langage, mais c'est ce qui se passe derrière qui est intéressant. Les tuples, considérez ça juste comme une liste immuable d'objets. Je vous en parle parce que vous allez le voir dans le code. Vous allez voir m'emmener des parenthèses avec un certain nombre de choses séparées par des virgules. C'est des tuples. C'est une liste immuable. Donc vous ne pouvez pas rajouter d'éléments supprimés. Si vous n'avez pas d'imagination pour savoir qu'est-ce que ça peut faire, utilisez-le pas. Utilisez des listes. Les dictionnaires c'est avec les accolades. Les tuples, je disais juste pour vous montrer que je suis capable de faire un tuple. Je peux faire un tuple de A, de B, des lettres A, B et C. Souvent, ce qu'on va faire aussi, on va laisser la dernière virgule traînée, ce qui est syntaxiquement correct. Mais quand on met les trucs sur plusieurs links, ça permet de rajouter des éléments sans se soucier si on avait mis un tuple. Tout simplement. Le dictionnaire, c'est ce que on va appeler dans d'autres langages des arrays. C'est une association de clés de valeur. Ce qui est intéressant en Python, c'est que la clé peut être plusieurs types de choses. Je crois que formellement c'est un objet serialisable. Quand je parle d'objet, Python est un langage où tout est un des objets. Ça veut dire le chiffre 1 que je viens de taper là, le chiffre 1 que je mets là, c'est un objet aussi. C'est une instance d'un entier. Donc si je fais un dictionnaire, par exemple, je pourrais très bien faire un dictionnaire avec comme clé 1 qui porte la valeur. Je suis un peu égocentrique, mais la clé B qui pourrait avoir mon nom de famille resté dans le même ok. Et je pourrais avoir à ce moment-là une liste, ça marche pas parce que c'est ça marche pas. Mais bon, ce que je veux vous montrer déjà, avec un entier puis un string ça fonctionne. On peut accéder aux valeurs en utilisant en appelant la clé, je pense c'est une façon d'appeler ça, directement en passant la clé de voilà, ou en passant la clé, par exemple ici qui est un string. Évidemment, si vous aviez une variable, par exemple, c est égal à B, ma variable c, je peux passer une variable c, c va me retourner le truc, ok. Tous ceux qui sont à l'aise un peu à programmation, on va voir que c'est des choses assez simples. Mais justement c'est intéressant. Alors je suis toujours au plan de match, je continue je veux vous parler un peu des objets des namespace comme prélude à l'introspection. Alors je ne prends pas pour acquis que tout le monde connaît le rienté objet, donc je vais présenter rapidement quelques notions de rienté objet. Ça va être très dur. Vous m'excuserez, il y a peut-être des cours de 45 heures là-dessus, vous aurez dit ouah, j'ai oublié des grands bouts mais on va y aller rapidement. Alors, le rienté objet, supposons que vous avez dans un monde, le monde dans lequel on vit, un certain nombre de personnes on va mettre un devine quand même là-dedans. Alors j'ai des vines, j'ai mon ami Mathieu, puis j'ai mon copain Cyril aussi donc on est les trois là. On est trois individus qui existent pour vrai. Sauf que, on peut répondre en quelque part à une certaine définition de personne. Donc on peut inventer une espèce de notion qu'on va appeler des personnes. Vous pouvez voir ça comme des personnes et ça c'est l'idée philosophique même de personnes. Donc là ici la notion de personnes, ça si c'est des personnes. Ce qu'on va appeler au niveau informatique tout simplement on va appeler ça ici des instances de la classe personne. Ok? Et on va appeler ça aussi des objets. Souvent on va appeler ça des objets. Mais la classe va être aussi un objet mais là on rentre dans des trucs où attention comment c'est possible mais c'est parce qu'il va être l'objet d'une classe, classe par exemple qui est un peu plus encore abstrait au-dessus. Ce qui est important de savoir c'est que ça c'est différent de ça. L'idée, la définition de personnes est différente des personnes des physiques réelles qui existent. Ceci dit, un coup qu'on est d'accord sur le fait qu'il y a des personnes et la notion de personnes, on va pouvoir commencer à coder ce genre de choses-là. On va pouvoir créer une classe personne et là on pourrait se dire je peux faire de la pseudo modélisation là on va, on va dire c'est drôle hein, toutes les personnes, ils vont avoir un nom, puis ils vont avoir un prénom. Ça c'est du pseudo UML là parce qu'on s'en fout un peu de la convention l'idée c'est de se comprendre. Là on va dire wow c'est génial, c'est vrai que toutes les personnes ont des noms, des prénoms ça on va appeler ça des attributs des attributs des objets ou de la classe, dépendamment si je parle du nom en général ou du nom de quelqu'un. Mais plus que ça on pourrait dire par exemple si on continue à modéliser pour le plaisir on a d'autres choses à faire là mais on par exemple on va dire c'est intéressant j'ai la date de naissance, je vais marquer la date de naissance à quelqu'un. Peut-être dans une application vous seriez intéressant à intéresser à avoir l'âge de quelqu'un par exemple il peut accéder à des sites quelconques dépendamment de son âge. Alors pour avoir l'âge de quelqu'un, on va quand même pas stocker ça sur la personne en mesure où ça change dans le temps. Là on va, je parle d'informatique là, je parle moins de la modélisation conceptuelle. Ce qu'on va faire en informatique, on va donc coder sur une classe les traitements qu'on veut faire sur le certain nombre d'informations qu'on veut stocker. Ces traitements là c'est rien d'autre que des fonctions là j'ai créé du Python, on le verra tout à l'heure par exemple on pourrait donner âge, ou si vous voulez guêpe âge. Bon puis conceptuellement ça il va exploiter la notion de date de naissance, il va comparer avec la date d'aujourd'hui puis il devrait pouvoir nous computer l'âge. Ça, on appelle ça des méthodes des méthodes, là je reparle Python, sont des fonctions qui sont définies dans le contexte d'une classe, ok? Donc quand je dis fonctions méthodes, c'est la même chose mécaniquement sauf que la méthode à flotte pas dans l'univers est attachée à une classe. Ceci dit dans la documentation Python, quand vous allez explorer faire l'être expression puis je vais le faire dans un instant les attributs ont un nom et les méthodes ont des noms. En l'occurrence le nom de la méthode ici c'est âge. C'est le nom de la méthode et l'attribut, j'ai avoir le nom prénom, le nom non, le nom date de naissance, ou Ddn. Ce qui est le petit truc, c'est que si on veut exécuter un moment donné les méthodes il faut pas oublier de mettre les parenthèses dans l'exécution. Et là ce qu'on va faire je vais vous montrer, on peut t'amuser à coder ça pour le fun tu fais woop, je suis pas dans un bon endroit. Je peux m'amuser à coder tout de suite une classe personne ok, comme ça ou ou je vais définir par exemple je pense que je vais le mettre direct comme ça, prénom est égal à un string vide non c'est un string vide mais c'est légal ça, généralement on code ça dans d'autres contextes je vais un peu tout nu un type de naissance qui va être je le mets un string mais généralement on mettra un type un peu plus évolué comme une date à tout hasard et là je vais définir ici ma fonction, ma méthode age qui va me retourner qui va me retourner rien du tout juste pour avoir une structure ça devrait être syntaxement correct, parfait je peux créer une variable que j'appelle devine qui va être une instance de personne je vais rapidement mais c'est des choses qu'on voit dans d'autres langages, pas besoin de new on voit dans d'autres langages c'est très clair la classe ici est accessible dans mon interprétape j'ai juste de la déclarer avant je peux l'utiliser, c'est normal je crée une variable qui est devine on peut aller voir maintenant et là, s'il vous plaît, prenez un petit moment pour apprécier toute la puissance de l'introspection en tout cas au moins dans High Python on verra qu'est-ce qu'on peut faire avec Python tout à l'heure je fais un point ici et je vois tous les noms qui sont accessibles dans le contexte de devine quand je dis non c'est soit des noms d'attributs soit des noms de méthode c'est pour ça que vous faisiez un peu mon petit blabla alors on voit que j'ai devine pointage cool si je fais devine pointage je peux même mettre un petit point d'interrogation derrière pour aller voir de quoi on parle avec devine pointage et là on sort la documentation de la méthode ce qui est génial c'est qu'avec ces deux petites approches le point vous pouvez voir tous les noms derrière donc tous les attributs et les méthodes d'un objet et comme je vous dis tout est objet vous pouvez tout explorer dans votre interprétaire et avec ça en mettant le point d'interrogation vous pouvez appeler la documentation direct pas besoin d'aller se promener sur le web c'est là, c'est apporter de main dans votre interprétaire pour aller voir de quoi on parle déjà là on peut voir que c'est une instance d'une méthode base class, je lis les trucs on ne s'amuse pas à lire ça tout le temps juste de même on dit ok c'est la classe de base de hage ok, ça va être une instance méthode, ça ressemble à son type l'idée de type class le namespace interactif je suis dans le contexte de ma console interactive le fichier qui est exécuté je suis dans le contexte ça, docstring, no docstring c'est mal généralement quand on code justement vu qu'on sait que tout le monde veut être respecté nos choses on va s'amuser à faire des docstrings les docstrings on les code tout simplement mettant triple quote la documentation triple quote, bien sûr ça peut être multiligne ok, et le P8 va vous donner des conventions expliquant que la première ligne devrait être un résumé le contenu reste du contenu devrait être comme ça ça pour dire que si je fais par exemple une fonction, je déclare une fonction que j'appelle fonction tout bêtement et là j'enchaîne avec le docstring je vais marquer super documentation j'aime python, whatever voilà et je ferme les quotes ici là la fonction existe, elle flotte dans mon interprétaire je viens de la déclarer maintenant je pourrais l'utiliser à faire rien bon c'est un peu nul comme ça je vais vous montrer c'est que je peux interroger le nom fonction et on voit ici que j'ai mon docstring qui apparaît donc documenter ce que vous faites c'est vraiment pas compliqué vous mettez les docstrings sous classe pour la classe et sous les fonctions pour vos fonctions alors des fois on fait des trucs, des fois on est pas tout le temps fiers vous pouvez l'expliquer là en plus des commentaires que vous allez mettre mais même quand vous êtes fiers vous pouvez le dire, voyez vous pouvez expliquer évidemment comme dans n'importe quelle documentation qu'est-ce que vous attendez à avoir comme paramètre quel genre de traitement doit faire la fonction ok donc quand je vous parlais d'objet et namespace l'idée de namespace vous compreniez que les noms dont je vous ai parlé ils vivent dans un contexte le nom Hage était dans le contexte de ma variable divine ça sera la même chose qu'en front nos importe de modules on va apporter des modules vous avez, je sais pas, moi quelqu'un qui a défini une classe date d'un bar quelqu'un qui a défini une classe date dans un autre module vous les importez en théorie ils devraient pas avoir de clash de noms parce qu'ils sont importés dans un certain contexte puis si il y a un clash de noms on va s'arranger pour les des ambiguïsés voilà ouah autre chose qui est intéressant ça c'est comme dans d'autres langages c'est que vous pouvez chainer les namespace par exemple si je reprends mon petit bonhomme des vines tout à l'heure qui n'est rien d'autre qu'une instance, je sais pas quoi si je vais dans Hage qui est une méthode comme je vous dis tout est objet fait que l'âge c'est une instance d'une méthode il y a peut-être des choses à faire avec une méthode sans général puis là on voit qu'il y a un paquet d'autres choses derrière fait que je pourrais appeler ici doc le doc de Hage on voit qu'il n'y a rien mais on le veut tout à l'heure donc doc ici c'est l'endroit où est stocké c'est un attribut où on stock le docstring de manière générale quand on voit les double underscores partout c'est des attributs ou des noms en tout cas ça peut être soit des méthodes ou soit des attributs des noms systèmes ça veut dire que Python va offrir des services par-dessus ça amusez-vous pas à tout par exemple si on veut tester c'est quoi ta classe ça devrait être stocké c'est quoi ta documentation ça devrait être là-dedans qu'est-ce qu'il y a d'autres il n'est on en reparlera tout à l'heure voilà bon alors on continue j'ai essayé de le remettre l'introspection je viens de vous montrer rapidement dans le contexte de iPython ce qu'on peut faire pour être juste parce que vous ne l'avez pas tous nécessairement sur votre poste on va lancer tout simplement dans je retourne en fait je lance Python si je crée une variable je vais créer une liste on va aller voir un peu qu'est-ce qu'on peut faire avec une liste, ma liste 1, 2, 3 ici j'aurais fait pointable dans mon iPython mais là je l'ai pas je peux voir c'est qu'est-ce que ça fait mais bon il me fait un table si je fais pointer il va me dire c'est pas correct la syntaxe c'est comme si j'appelais quelque chose derrière mais j'y donne pas par contre il y a des fonctions built-in qui me permettent d'aller voir les noms qui sont derrière vous voyez que c'est un petit peu moins sexy que dans mon iPython il y a peut-être moyen de passer des paramètres à dire pour formater ça de façon un peu plus sexy je vous laisse explorer ça ou sinon installer iPython mais ce qu'on peut voir ici on a un certain nombre de noms j'insiste hein je reviens tout le temps là-dessus mais c'est soit des attributs mais on peut peut-être exécuter un certain nombre de choses là-dedans de noms sur une liste fait que là déjà on va peut remouver quelque chose dans une liste ah c'est cool on peut poper quelque chose on peut insérer quelque chose on peut étendre une liste fait que déjà juste à lire les noms ça nous donne des idées vous voulez savoir exactement de quoi on parle si on fait reverse la liste par exemple mettons qu'on est un petit peu j'allais dire check-in mais je sais pas comment traduire ça de façon correct mais disons qu'on est un peu frileux on veut pas faire un reverse tout de suite ou on veut pas l'exécuter on est pas sûr de qu'est-ce qu'il va se passer alors ce qu'on peut faire c'est passer la commande help à l'entôpe et dire de quoi on parle là je lui passe le nom je veux de l'aide sur reverse qui est un nom qui vit dans le contexte de L on suit tous sur l'idée là-dedans alors ils vont me dire reverse tu vois c'est un aide un peu plus synthétique je pense que divers façon ou l'aide est stockée on sait pas exactement mais je pense qu'on verra dans high python mais en gros ils voient comment l'appeler ça reverse in place ça doit avoir un sens c'est une genre de chose que vous pouvez explorer on peut le faire ensemble pour le fun on appuie sur Q pour sortir de l'aide puis là on va faire reverse je sais que si je mets mes parenthèses j'exécute le truc input bon là je n'ai pas d'output je vais le stocker dans un truc L reverse comment je vais changer je vais changer une place d'abord je devrais avoir la fonction globale reverse que tu peux à laquelle je peux passer le mis ok reverse parenthèses mais ça c'est une built-in function là j'appelle une fonction qui elle flotte dans l'agage python et je reverse une liste reverse tu vois ok et là j'aurais pu stocker l'output pour faire un print du truc ou carrément faire un print puis d'avoir quelque chose de ok whatever ce que je veux vous dire c'est que d'une part je préfère high python mais mais vous parlez déjà le documentation est plus complète mais au moins on voit déjà les noms et on est capable de faire help donc c'est l'équivalent de ce que j'avais écrit ici avec le tab pour voir les noms ici puis le point d'interrogation pour voir l'aide ok bon justement je vous l'enchaînais avec un certain nombre de fonctions built-in si vous vous dites mais qu'est-ce que je peux appeler directement un peu comme on vient de le faire avec reverse que je ne connaissais pas comme vous pouvez le voir vous avez ça ici dans la documentation python dans library reference et dans les premiers trucs ici on a built-in de fonctions puis vous voyez un certain nombre de fonctions qui sont là bon il n'y en a pas 150 000 on a déjà vu dire ensemble on a vu help help puis il faudrait voir tout le reste et on vient de voir reverse et puis voilà ce que je veux juste attirer votre attention il y a un certain nombre de ces fonctions qui sont en fait des générateurs de type je ne sais pas vraiment qui permettent d'initialiser par exemple quand je vous ai fait des bouleins tout à l'heure bon je retourne dans la python mais mettons j'ai dit boule égale trou là j'ai assigné une des valeurs possible de bouleins mais je pourrais l'initialiser en faisant je ne sais pas moi B2 est égal à boule ok puis là il y a une autre fonction qui peut vérifier le type c'est quel est le type de B2 elle va dire B2 est le type boule ok donc ça c'est les types de base ce que je veux juste vous montrer c'est qu'il existe donc des fonctions qui permettent de générer des types pour les variants ça peut être intéressant quand vous faites un type par exemple quand vous voulez comparer un type et aussi pour du trans-tipage on a vu que nos anti et nos float si vous avez des anti et vous avez besoin de mettre des float vous pouvez utiliser ces fonctions pour faire du trans-tipage ok alors c'est dans built-in function c'est deux clics dans la documentation ok on continue avec notre plan on a parlé type ça retourne le type de l'objet dire elle on a parlé callable ça c'est pour voir si effectivement le nom dont on parle c'est un executable si je mets des parenthèses il va se passer quelque chose et instant vous pouvez passer un objet vérifier son type ou sa classe si effectivement il appartient bien cette classe-là et comme je vous disais ici etc les boules, les strings etc c'est pour initialiser des variables si vous voulez pas mettre par exemple 0 pour initialiser un entier vous pouvez faire int et pour faire le trans-tipage aussi voilà des petites structures d'iterration il existe dans le langage des while aussi tout ça mais bon généralement le for fait très bien l'affaire je vous laisse explorer toutes les structures plus loin mais si vous voulez tout de suite boucler à travers des listes vous faites for vous mettez un autre variable et quand on y tire vous pouvez faire des choses là dessus par exemple si on essaie de faire des trucs un peu plus j'ai plus je dois bien avoir un devine qui traîne quelque part oui mais là c'est un instant de ok mais donc je prends le nom est égal à barrageotant et j'ai le prénom le prénom qui est égal à devine là je travaille avec deux strings ce que je peux faire avec des noms je t'applète là dessus je vois tout ce que je peux faire c'est tout ce que je peux faire sur des strings il y en a tellement en fait que je peux faire même moi on peut splitter les strings on peut faire des left strips donc enlever un certain nombre de caractères on peut fusionner des strings ensemble on peut tester si le string se termine avec un caractère ou débute avec un caractère son petit frère c'est StarTweet qui on voit pas là parce qu'il est plus loin si je fais une tue je devrais finir par le voir etc donc vous voulez savoir quoi faire vous regardez ce qu'il y a dans la ce qui existe en fait comme nom derrière accéder évidemment si ça vous plaît pas vous pouvez chercher sur le web mais bon déjà on voit un hopper ça pourrait ressembler à convertir une chaîne de caractère en magicule on va aller tester notre hypothèse hopper si je fais je mets pas les parenthèses qu'est ce qui se passe je vais me dire voici je t'imprime le nom un certain nombre d'informations sur ce nom là tu as dit c'est nul ça fonctionne quoi ben non mais c'est parce que c'est un callable d'ailleurs on pourrait tester est-ce que c'est callable callable nom hopper oui ah bon ben d'abord je vais le caller nom hopper parenthèse parenthèse puis là il me retourne la chaîne mais si on regarde la variable elle-même est restée tel quel fait que ça c'est le genre de chose de une place ou non c'est à dire est-ce que j'affect le contenu de la variable où je te retourne une transformation de cette variable là il est expérimenté mieux que moi je l'ai fait avec la liste tout à l'heure avec les reverse mais ça devrait être assez limpide donc là qu'est ce que je viens de vous montrer que je suis capable de faire un peu sur une chaîne maintenant si je toque par exemple dans une liste mon nom et mon prénom puis je veux itérer dessus alors je fais pour i ou n'importe quel nom de variable i dans ma liste l pour être plus pédagogique j'aurais marqué pas item in liste au complet bon on se comprend et là qu'est ce que je fais avec je peux dire print i point hopper ok pour chacun des items ma liste c'est à dire les deux variables j'ai mis me retourne ça hopper pour le underfly ok ça va super bien on va continuer conditionnel la structure juste vous montrer la syntaxe if elle if else c'est bon des questions ce qui est à noter encore une fois il n'y a pas de brackets on sauve des lignes comme ça avec des trucs de rien et des parenthèses dans les conditions de ce qui est des brackets je me semble c'est un peu trop tout nu mais il y a les and aussi vous voyez que dans l'exemple j'ai marqué ici if 5 est dans la liste print tel truc bon je ne l'exécuterai pas mais qu'est ce que je voulais dire vous voyez que j'utilise le in ici un peu comme dans la structure 4 fait que là c'est carrément testé si 5 est inclus dans la liste ok je le teste si je crée une liste avec les valeurs 1, 2, 3, 4, 5 faisons-le correctement je dis if 5 in liste print je ne suis pas au aura parce qu'on va être content ben ça va être prémura mais c'est cool ça de tester l'inclusion de même je ne peux pas appeler un truc méthode is member ou de truc complexe je teste comme ça c'est ce que 5 est dedans ça c'est le fun en syntaxement c'est agréable qu'est ce que je voulais dire aussi par rapport à ça oui les and et les or comme vous l'imaginez on peut s'amuser à mettre des if true ou false qu'est ce qui se passe on print au aura ou on ne print pas au aura la belle petite logique oui ça ne se passe rien si on met un or ça ne passe pas ça ne passe pas bon fait que tout le monde se frotte un peu à ça le seul truc c'est que voilà la syntaxe est toute simple ok avec les trous, les or évidemment quand vous avez toutes sortes d'enchaînement de and or c'est comme dans tous les langages après c'est quelques précédences puis tout ça là effectivement vous pouvez vous aider de parenthèses pour se structurer un peu le tout pour savoir faire des groupes dedans ok ben c'est ce que je voulais vous dire au niveau du langage lui-même on est pas si mal je pense dans les temps là c'est un peu embêtant parce qu'on est toujours juste dans l'interprétaire là on se dit ouais mais tiens moi dans vie je peux pas juste mettre des a égale trou je veux coder des vraies choses pas de problème on va faire des scripts alors je vous montre la structure d'un script là je tombe dans les sources les sources sont accessibles l'url qui est là vous avez un fichier qui s'appelle atelier.zip qui ressemble furieusement à celui qui est ici devant vous là dedans il y a un truc qui s'appelle code et dans code il y a un truc qui s'appelle script voilà alors on va regarder ensemble en détail à quoi peut ressembler un script python ça ici c'est ce qu'on appelle je crois même les deux des shebangs on s'en fout du nom la première ligne ça ça veut dire que quand vous lancez vous vous appelez mettons en ligne de commande python avec le script c'est pour désambiguiser c'est deux fois ce soir désambiguiser au niveau du système c'est quel est le programme qui doit exécuter ce script là vous pourriez même spécifier la version de python si vous utilisez plusieurs versions python sur votre système ça dit bon ben ça ici c'est du python 3.truc donc vous vous attendez effectivement vu que c'est pas la même chose que les unicodes soient gérés par défaut etc donc là vous pouvez le spécifier si vous avez juste une version de python sur votre truc c'est généralement facultatif ça ça l'est un peu moins pour nous francophones parce que souvent on va pouvoir commenter des trucs je sais plus j'essaie de trouver quelque chose des des accents mais on veut pouvoir mettre des accents dans des puristes vous direz non non faut pas faire ça mais pour pouvoir mettre des accents dans le script lui-même faut spécifier l'encodage ici il y a un autre pep qui parle de ça il y a une façon plus simple que j'ai découvert il y a quelques semaines de l'écrire c'est juste coding 2.utf8 par exemple ça c'est le imac style voilà donc vous mettez ça ça marche fait que si vous avez rien c'est correct vous avez un script python il y a un facteur dedans puis quand vous lancez l'exécution ça devrait bien aller le système devrait comprendre qu'est ce qui se passe mais si vous voulez spécifier vous utilisez chez bank qu'est ce qu'il y a d'autre dans ce fichier pas grand chose ça c'est mon commentaire il y a ici vous voyez que c'est pas très pepuitre mon affaire dans le sens où j'ai un retour à la ligne j'avais mis des longs longs trucs si je supprime ça un peu c'est pas du pepuitre là peu importe pour tout de suite en gros qu'est ce qui se passe j'ai défini une fonction bon je vous ai montré rapidement comment faire fonction c'est pas compliqué def pour définir vous mettez le nom de la fonction parenthèse les paramètres qui peuvent être plusieurs et ensuite de ça le traitement ici j'en ai pas beaucoup je vais juste retourner la ligne une certaine ligne concatenée on a déjà vu ça vous voyez ça dans d'autres trucs et voilà je sais pas je l'ai pas mis dans mon plan mais il y a des façons de faire pour plus élégante pour substituir les trucs que j'aurais pu marquer par exemple coucou avec un espèce de playsolder ici j'y donne le type puis coucou comme ça je vais le faire quand même parce que ça je trouve ça très lait et là je mets pourcentage je passe un tuple on a vu à quoi ça sert alors le langage s'attend assez avant un tuple je sais pas si ça marcherait avec une liste puis je lui donne le nom vu qu'il y a juste un élément du tuple je pourrais pas mettre de tuple du tout généralement vu qu'un jour ça va changer et ça coûte pas grand chose de préparer déjà un tuple pour si un jour on décide de mettre par exemple le prénom de la personne tout de suite après on captera le prénom on le mettra ici derrière c'est une façon correcte une façon élégante qu'on voit souvent en python donc c'est substitué donc le playsolder il peut avoir un petit dé ici pour djit si on s'attend à avoir un numéro ça refait des contraintes là-dessus attention des fois au transitipage si tu dis un djit puis tu y passes un string tu vas dire je m'attends à avoir un string les messages général sont assez explicites je pourrais le faire on va le faire capoter je vais peut-être montrer un cas qui marche avant vous comprenez que ma fonction coucou fait rien d'autre que prendre un nom et substitue à la chaîne de caractère unicode ici à l'emplacement prévu pour il substitue le nom d'ailleurs on voit que le pourcentage veut dire si substitué dans les trucs c'est à peu près clair cette substitution si c'est un peu du route chinois pour vous utiliser les plus puis concaténer ça va marcher là ça c'est la partie un petit peu plus extra-terrestre généralement on se le fait expliquer une fois c'est clair ici on va utiliser cette structure ça c'est une constante en quelque sorte ou un nom système qui s'appelle name ça ici la danse c'est le nom du contexte d'exécution en quelque sorte si vous lancez un script dans un interprétaire la valeur c'est main donc tout ce qui suit si jamais ce script est exécuté dans le contexte d'un interprétaire en gros tu lances ton script en deflage et dis à ce moment-là exécute-moi ces lignes là tout ce qui est en haut bien sûr va être exécuté aussi parce que l'interprétaire part dans haut s'en va en bas il exécute tout ce qu'il voit c'est une définition, il définit la fonction il la met accessible dans le contexte et puis là dépendamment parce que évidemment on fait pas toujours exécuter nos scripts dans un interprétaire des fois on le verra tout à l'heure on load l'information coucou si vous faites un importe de coucou un moment de nez ça sera jamais exécuté ça n'a rien à voir ça c'est juste si on l'exécute dans le contexte de l'interprétaire généralement vous allez voir ça on va mettre des des gens de petit test ou des rapports justement en console pour voir si tous les trucs fonctionnent comme il faut quand on lance le script bon alors c'est tout ce qu'il y avait à dire sur les scripts donc ça c'est facultatif ça c'est facultatif puis après il faut juste mettre du code dedans ça s'exécute du haut en bas alors on y va donc ce que vous avez codé ici vous avez juste à le mettre dans un fichier pour l'exécuter dans le contexte de High Python chez Puchou High Python aussi vous donne des petits raccourcis c'est agréable qui sont proches du shell PWD pour print working directeurier je vois que je suis je dis parfait ça marche, je fais run script puis là il exécute début du script, coucou, fin du script parce que ici dans ma fonction coucou ben je dis rien, je dis ah j'ai stocké des vines dans une variable j'ai fait un certain nombre de print à la console j'ai passé la variable moi à la fonction coucou qui a été définie plus haut donc c'est parfaitement légal de l'exécuter ça affichait coucou avec la substitution de chaine on est tous convaincus de ça substitution de chaine d'ailleurs là maintenant je peux faire capoter le truc puis là on va voir que le message est quand même plutôt explicite failure j'ai pas réussi des formats, un nombre est requiert pas unicode qu'est-ce que je vous fais c'est pas dur à déboguer c'est tout si simple que ça on recommence c'est bingo voilà comment on cas dans python on cas de trucs plus intelligents évidemment mais c'est solidé donc vous savez maintenant comment faire un script en python c'est pas magnifique ça vous connaissez les types de base vous savez comment mettre les trucs dans un fichier vous savez faire donc des fonctions il y a des trucs évidemment qui sont à prendre un peu plus il y a des beaux petits shortcuts qui sont donnés avec le langage par exemple vous pouvez accepter ici n'importe quel type d'argument puis que ça ça va être stocké dans une espèce de variable que vous pouvez quitter un espèce de dictionnaire que vous pouvez tester si je sais pas ma verre est dedans ça c'est des choses que vous regarderez un peu plus loin ou on pourra voir un peu plus avancé mais sinon pour ce qui est de la syntaxe voilà vous voyez un script python ok on continue avec notre plan de match on devrait bientôt se rapprocher de la pause alors si je regarde mon plan en détail ah oui ça c'est cool je vais vous montrer ça alright compréhension de list et slice là dans les types on peut faire des affaires vraiment sexy au niveau de la syntaxe je vais vous montrer je vais créer une petite liste ici on the fly la liste avec la chaine de caractère 1 la chaine de caractère 10 2 chaine de caractère 3 la chaine de caractère 10 4 ok je répète j'ai pas eu à mettre des espaces là c'est un peu ridicule bon quand je prenne ça c'est effectivement ce que j'ai on sait qu'on peut y terrer dessus far e in l ouais far e in l print e bon ok ça on l'a déjà vu mille fois non si on veut créer une liste à partir cette liste là bien sûr vous pourrez aller voir s'il existe des méthodes qui permettent de faire vos trucs mais je veux vous montrer une façon simple de créer une deuxième liste mettons ma liste va s'appeler liste 2 l2 bien sûr je pourrais créer une liste vierge je pourrais après faire un far e puis mettre des conditions puis si ça répond à la dicondition prendre mon item et de le stocker dans l'autre tout ça c'est parfait c'est légal ça marche on peut faire ça de façon bien plus sexy c'est ce qu'on appelle les compréhensions de liste en python donc là je vais marquer pour l'item qui? l'item ouais far item in l mon liste original je retranscrit en gros ce qui est là sauf que j'ai marqué item non l'item en question c'est un peu n'importe quoi là ah ouais ok dans mon exemple c'est l'item bon ok on va se concentrer si on écrit en bas start with alors c'est une méthode donc c'est à plable et là si on est pas sûr on check dans la doc mais start with ça tend à avoir un caractère ce qui est un peu logique en gros j'ai dit ce que j'ai dit pour chacun des items qui sont dans ma liste L que j'écris ici on la voit toutes je teste si l'item en question pour chaque item je teste si l'item commence avec diesel ok et si c'est le cas en gros ce que ça veut dire retourne-moi l'item dans ma liste comme ça wow ça peut fait on voit quand même on a les deux brackets qui étaient la structure quand on déclarait une liste ils sont là là sauf que c'est un peu comme en mathématique quand on définit un ensemble au lieu de l'énumérer j'y donne la définition wow c'est beau ça fait je t'entraîne te donner la définition pour construire cette liste là ma partie d'une autre liste bon ici j'utilise StarTweet parce que je suis bien confiant que chacun de mes éléments va être des strings mais si c'était pas des strings il dirait StarTweet sur mon item je sais pas ça du tout ça marche pas ok mais ce que je veux vous montrer surtout c'est cette syntaxe entre les brackets de donner la définition de construction de la liste ça fait des beaux petits one liner les gars d'ailleurs j'exécute puis j'en regarde elle deux ça les admin system qui brasse beaucoup de fichiers avec des enregistrements ou n'importe qui tu prends des données bon là je donnais des exemples ou c'est que tu dis pourquoi tu mets des entiers avec des strings des fois dans ta base de données tu as ce que tu as puis là on veut filtrer ce qu'il y a dedans ou au contraire tu voudrais justement enlever les trucs les restocker pour aller les recevoir l'accès aux bases de données c'est un autre sujet mais on voit que là on peut manipuler des données dans une liste pour créer notre liste c'était la compréhension de liste l'idée de slice une slice c'est une tranche on a vu tout à l'heure sur un dictionnaire qu'on pouvait aller chercher avec la clé trouver une valeur c'est pareil sur une liste je vous rappelle que elle c'est mes 4 strings si je fais crochet 0 on sait qu'en informatique ça commence toujours avec 0 elle reviendra avec un index 0 ça c'est pas mal évidemment si on met un il se déplace mais on peut faire des slices ou est-ce que je vous avoue vu que je suis pas programmeur des fois je me perds il faut savoir que les bornes sont quoi en gros c'est prenant un à partir de la deuxième position ou vice-versa c'est pas top comme des mots vous deriez certainement je ne suis pas plus rigoureux mais vous comprendrez que c'est facile juste en explorant de voir ce qui se passe et évidemment il y a de la doc là-dessus sachez que la première position peut être facultative comme ça donc en gros c'est donne-moi les deux positions à partir du ça c'est équivalent à mettre 0 etc on peut mettre des bornes négatives pour partir de la liste de la fin partir dans l'autre sens bon ça existe si ça vous intéresse explorez tout ça moi je n'en mange pas tous les jours mais voilà c'est quand même élégant pour accéder à un certain nombre d'enregistrements ok là je regarde je me donne 5 minutes pour vous montrer comment faire un module les fonctions on en a parlé je vais juste vous dire aussi que des fois quand vous prototypez des trucs il y a un mot clé qui s'appelle passe qui veut dire bon bah whatever par exemple vous pourriez marquer un mot négécié qui faudrait que je fasse une méthode hage dans ma classe mais je ne sais tellement pas comment coder ça là tu marques passe ok fait que tu vois que quand tu expectes les noms tu vois que hage est là tu sais mais bon il est pas là vous pourriez déjà commencer qu'un docstring et puis en disant ici je voudrais computer là passe pareil pour les classes vous pouvez faire une classe qui s'appelle classe non c'est nul classe personne encore peut-être euh chose du coquelon on va y revenir mais entre les parenthèses d'une classe en fait des classes de laquelle héritera votre classe je veux expliquer tout ça c'est pas clair les classes en orienté objets peuvent hérité de classe par exemple si vous trouvez super pertinent dans votre médalisation dire que des personnes sont des mammifères là c'est parfaitement légal de le faire et là vous dites je sais pas moi que mammifères je sais pas qu'est-ce qu'on pourrait mettre particulièrement donc on dit qu'il y a 2 jambes ridicule mais ça peut dire que toutes les personnes vont avoir 2 jambes on peut pas le mettre sur personne parce que comment ? il y a du sans chaud par exemple là on est supposons on fait une application biologique qui est pas ridicule on pourrait dire qu'est-ce qui fait que la catégorisation du vivant qu'est-ce qui est la différence entre un oiseau l'oiseau est-tu des ailes oui mais le qui oui on n'a pas ah ouais comment on fait ça c'est les problèmes de modélisation mais c'est intéressant à un moment donné d'hérité des classes quand on dit hérité ça veut dire les attributs qui existent ici sont accessibles quand on a instantiée une personne tout simplement vous mettez la classe dont vous voulez hériter entre les parenthèses là j'ai marqué object c'est quoi ça ? object c'est l'objet du bon dieu en haut qui existe dans le monde python ça veut dire qu'avec ça vient de toutes sortes de petits attributs de méthodes intéressantes pour manipuler des objets je vous fais une preuve en fait je vous montrez passe je fais une classe passe derrière ma classe personne à grand chose là on se dit c'est nul je veux une classe qui a des trucs un peu plus sexy on va marquer object puis là je fais passe pareil parce que je suis pas d'inspiration mais par contre si j'introspect dans mon interprétaire j'ai un paquet de choses qui viennent parce que j'ai l'objet suprême en python qui s'appelle object on aurait pu dire ça aurait été cool avec un haut majuscule parce que vous aurez remarqué que les classes de la convention on les met en camel case ça veut dire qu'on commence à majuscule donc mettons qu'on crée une classe personne humaine t'as pris ça ou non personne morale attention attention c'est pas la même chose personne morale on va l'écrire comme ça on va pas mettre underscore minuscule ni commencer à couper c'est une convention tandis que les méthodes elles on va les mettre tout avec cette syntaxe qui est en fait l'opposé de camel case je sais plus comment ça s'appelle doit avoir un nom dans l'utérature pour ça ok on continue donc les fonctions on en a parlé mon ami Cyril vous dirait quand vous faites une fonction mettez un return c'est parfaitement légal d'en mettre partout genre if 5 return aura sinon return tel truc ce qui est plus clean on finit votre prêtement vous retournez ce que vous avez retourné avec une belle dernière petite ligne après les classes on a parlé c'est génial on vient de sauter c'est vraiment vite les modules et ça va faire une belle transition avec ce qui va suivre après la pause parce qu'après notre beau job ça va être un module on va commencer à les jouer dedans on va aller regarder ce qu'il y a dans le vent je veux juste vous dire supposons que notre classe personne ici mais je risque de tellement d'avoir besoin dans plein de projets je vais la mettre dans un module et j'aimerais ça l'importer dans plusieurs circonstances pas de problème vite tout de suite on va se faire un beau module python je suis dans mon répertoire peu importe c'est là où j'exécute le code on va se créer un truc qu'on va appeler on peut faire des trucs un peu plus sexy on va lâcher nos personnes de secondes on va appeler ça renommé LNH l'ignationale d'hockey là dedans on va se dire là je voudrais mettre un packet de classe qui pourrait représenter je ne sais pas moi des équipes avec des joueurs je pourrais mettre des matchs je pourrais me faire une super application ou comme notre ami j'ai parlé au début je dis moi c'est pareil dans ma ligue de tennis on veut gérer on se fait du fun généralement tout ça c'est le résultat d'une modélisation fait qu'on va mettre ça dans un fichier qu'on va appeler models pour le fun on s'en fout complètement du nom mais je me semble que c'est du bon sens bingo, j'ai un fichier vierge je suis dans mon editor texte on commence brute force, classe, égal là on va avoir un joueur mais là on va quand même mettre object on va dire ça va être cool par contre on n'a pas vraiment on n'a pas parlé encore avec les gars qu'est ce qu'on va modéliser mais je sais que je vais avoir des joueurs je pense que je vais avoir une équipe aussi ça c'est cool c'est quoi l'équipe aussi à la rite on va faire passe on va commencer à jouer avec les trucs créer des joueurs et faire des choses la structure d'information est plutôt faible voire inexistante mais on va le faire pareil ici je suis dans mon interprétaire je vous montre encore print working directory ça serait la même chose dans python tu n'as peut-être pas le shortcut tu dis comment je fais pour accéder à ma classe joueur ça j'ai pas envie de le retaper et c'est tout le but du jeu je vais accéder au module là, la twist la façon de faire et là je retourne dans le plan et c'est écrit c'est de créer un fichier qui s'appelle initpy dans le répertoire que vous avez fait avec rien dedans c'est pas beau ça on va juste se rappeler qu'il y a une petite convention nos underscores on se rappelle que c'est des trucs qui sont systèmes donc là on suit carrément la petite doc on se dit que ça devrait marcher le fichier est vite, j'ai des roues octèges ou ça j'ai rien là dedans parfait, là ce que je veux faire je vais dire une fois mais ça va être très clair je veux importer équipe qui vit dans le fichier models qui vit dans le répertoire lnh on est d'accord, c'est nos espaces de nom là donc comment je vais faire importe, commence bien lnh commence bien, models cool là on voit que c'est un nom derrière lnh puis là je peux carrément mettre équipe ici, direct c'est un peu lait, généralement on le fait autrement non on m'a dit le name équipe ah mon sale donc là ce que je veux dire à partir de lnh models, ça semblait aussi que je veux importer équipe waouah là je suis dans mon console interactive mais je n'aurais pu être dans un autre script que j'ai codé à côté tout ce que je code là dedans je peux le coder dans un script donc là vous vous rendez compte que votre lnh juste par ce que vous avez mis en deux scores il peut être tu peux importer ce qu'il y a dans le ventre dans n'importe quel script évidemment il faut que ça soit accessible dans les python path vous savez tout ce qu'il faut suivre les path l'interprétaire il veut bien mais donner lui une chance c'est ou ça avec le init il sait que c'est importable il faut que ça soit accessible dans les python path généralement si tu codes parce que là mon interprétaire est carrément en train de s'exécuter ici tout ce que j'ai dit en gros c'est va dans le répertoire lnh globalement qui est en dessous de mon interprétaire fait que par défaut c'est dans mes python path il dit va voir là dedans d'abord si c'est un module parce que la preuve c'est si je verse ça ça ici c'est pice c'est des trucs compilés c'est compilé en defly on s'en fout nous on développe on aime l'ignorance un peu si vous voulez vous intéresser à ça après parlez avec mes amis un peu plus moi je m'en fous là vous voyez que j'ai mon code source mardold qui est dans lnh tu dis c'est génial ce qu'on a vu lors de la formation bingo j'y vais ah ça peut on va sortir juste pour être sûr parce que peut-être qu'il se souvient d'affaire et j'aime pas ça tu veux sortir mais oui certain là je relance python puis là je dis porte-moi l'équipe il dit minute minute je dis j'ai pas de module moi qui s'appelle lnh c'est juste parce que j'ai supprimé le fichier init là on suit tous là-dedans fait que faire des modules python là c'est pas vraiment très compliqué si vous voulez bien organiser votre code pour pouvoir réutiliser certaines autres choses alors je rappelle donc tout simplement créer un fichier qui s'appelle init.py là il va comprendre ces trucs bon dans les nits.py je vous dis il y a rien mais s'il y a besoin d'initialiser des trucs pour votre module des variables des trucs c'est là que vous m'interriez ça c'est un autre sujet ok on suit notre plan on s'arrête ici à init.py on va prendre une pause après ça on va regarder un peu ce que python est capable de faire je veux juste vous donner une petite conclusion quand même vous savez maintenant où est la documentation vous savez comment explorer interactivement avec l'interprétaire vous faîtes faire de l'introspection c'est quoi que les noms sur chacun des objets vous allez être capable d'utiliser l'aide d'utiliser les doc strings qui sont dedans vous êtes capable d'écrire des scripts vous êtes capable de les exécuter je ne l'ai peut-être pas montré mais ça c'est une grande erreur quand vous êtes dans l'interprétaire normal vous n'avez pas besoin vous écrivez pas run script comme j'avais fait dans high python vous faites simplement je crois le nom du script script.py bon ça marche pas si vous faites exit en ligne de commande c'est parce que là je n'étais pas dans le bon truc je m'en vais dans atelier atelier ici je m'en vais dans mon truc code c'est là qu'il vit mon code si je vous montre ce que j'ai dans le ventre je vais exécuter le script script là tout ce que j'ai à faire c'est python script.py ok fait que ça ça n'a rien à voir avec high python même si vous ne l'avez pas vous êtes capable maintenant d'exécuter vous marquer python avec le nom du script vous savez faire des modules vous êtes quand même pas mal armé pour vous faire du fun et c'est ce qu'on va faire après la pause on s'en revoit dans une vingtaine de minutes ceux qui n'ont pas sur leur machine d'installer jabber bot xmpp on a les clés ici pour windows et mac s'il vous plaît restez là on va vous donner un coup de main ça sera avec yannick ici alors j'espère que tout le monde a un environnement si jamais vous avez des problèmes techniques essayez de vous pérez peut-être avec des gens avec qui ils ont tout ce qu'il faut alors on va re-suivre notre plan et on est ici joué avec un bot jabber bon l'idée déjà vous connaitre c'est tous les principes un peu de messagerie cette année on s'achange des messages entre users il existe des salons il y a plusieurs users à échanger faire des discussions c'est super intéressant pour tout ce qui est réunion de travail c'est vraiment autre chose que le courriel mais c'est un sujet en soi il existe des robots qui peuvent vivre comme user dans les salons alors c'est quoi l'intérêt il peut faire un paquet de tâches administratives par exemple si vous donnez un lien il peut vous donner raccourci d'un lien si vous appelez un dictionnaire finalement tout ce qu'on peut faire en python on peut le faire dans notre robot il faut juste comprendre ça on s'en fout un peu ça on s'en fout aussi là je suis allé dans un salon on est deux, ça c'est mon ami au Vietnam qui est toujours connecté il nous fera peut-être coucou tout à l'heure là on est deux dans le salon le but du jeu c'est qu'on a un code python il y a un user en chair et en os comme on est là qui va répondre sur un clavier parce qu'il y a un humain qui tape derrière au lieu que ça soit ça, c'est du code qu'est-ce qu'il reçoit en input on va penser un peu en mécanique en input il reçoit ce qui se passe dans le salon il reçoit les messages comme nous on reçoit en input les messages puis on réagit en codant qu'est-ce qu'il va faire en input ça va dépendre de qu'est-ce qu'on a codé dans le bot donc le but c'est qu'il y a un nouveau user qui apparaissent ici qui va être notre robot puis écoute, puis c'est faire des choses alors on pourrait s'amuser à faire des trucs d'intelligence artificielle à capter les chaînes de caractère à répondre puis c'est des choses qui sont déjà faites c'est les cas classiques en intelligence artificielle ou est-ce que le but le test de Turing on se rend pas compte que ça soit un bot qui a été réagis presque comme un humain donc c'est ce qu'on va faire aujourd'hui il fera des commandes toutes simples mais on va essayer de coder déjà je vais commencer par faire une démo le code que je vais lancer le code de mon robot est dans code que vous pouvez télécharger dans Atelier Zip ok et le code vit dans bot si on regarde ce qu'il y a là-dedans il y a un fichier bot pie je l'ouvre avec mon éditeur et voilà le code source du robot tout est là j'ai créé une classe qui s'appelle mon bot muc jabberbot muc pour multi user channel jabberbot qui est importé ici à partir d'un module muc et voilà on va regarder le code ensemble mais ce que je veux d'abord c'est vous faire une démo le code source est là-dedans donc je vais y aller je vais sortir d'ici je vais peut-être faire un peu de ménage pendant ma pause ça c'est mon ok donc là je suis dans mon terminal normal je ne suis pas dans aucun interprétaire ce que je vais faire je vais lancer mon bot ça c'est dans mon terminal puis il me dit ok moi je viens d'exécuter un script puis c'est beau t'es connecté on va aller voir s'il est connecté pour vrai il devrait être connecté dans ce salon alright là ce que je vais lui faire je vais vous montrer un détour que je lui appris donc une fonction que j'ai codé je lui demande la date me retourne la date d'aujourd'hui pas super utile mais ça va nous aider nous à voir comment c'est codé les commandes derrière qu'est-ce qu'il sait faire d'autre quand j'ai dit sieste il répond hell yeah moi je suis un amateur de bière comme plusieurs à Montréal Python et ma bière préférée c'est Saint-Amboise donc quand j'ai dit bière il me répond Saint-Amboise et là plus que ça tu pourrais dire ouais mais c'est un peu simple par exemple j'aime faire la sieste il répond pas ça vous comprenez que peut-être étutivement c'est qu'il s'attendait que les premiers caractères étaient sieste bon ça c'est nul on veut faire des trucs plus puissants par exemple dire quelque chose comme j'aime la bière ouah ça on va vouloir faire ce genre de truc là on est en train de parler de manipulation de chaînes de caractère on va y revenir tout à l'heure et on veut aussi que ça soit un petit peu sensible du type j'aime la bière pas d'accent et que ça répond pareille par contre si je fais sieste bon ça s'écrit pas comme ça de toute façon on veut qu'il soit assez robuste tout ça c'est des trucs qui se cadent c'est clair et d'être on va aller voir comment c'est codé alors on va aller sous le capot premièrement par quelle magie le robot a plus connecté première des choses si vous avez le code et vous pouvez le faire tout de suite il y a un fichier que j'ai créé qui s'appelle conf.py edit ça ça veut dire c'est pas le vrai il faut l'éditer si vous l'ouvrez en gros ce que je m'attends c'est que vous ayez créé des constantes en fait c'est des variables qu'on met par convention majuscule dans lequel vous allez mettre le username de votre robot son password, un nickname et le chatroom vous gardez celui-là ça ici c'est un salon de réunion jabbeur dans mon entreprise et vous allez me dire oui mais comment je fais pour avoir un username et un mot de passe mais c'est tout simple vous allez sur registerjabbeur.org et vous remplissez ce formulaire oh ma foi tellement compliqué et vous allez avoir un compte ce compte là peut être le vôtre vous pourrez vous vous connecter avec ces paramètres de connexion là si vous configurez votre client moi ici j'ai un client qui s'appelle game qui est capable de gérer tout ça c'est dans un contexte Linux tout client il va vous demander ok c'est quoi ton username c'est quoi ton mot de passe là ce qu'on fait nous c'est juste que ces paramètres au lieu de les utiliser pour se créer un compte personnel ou nous on va se connecter on les plante dans un fichier qui va s'appeler connexion vous enlevez le dit vous renommez vous mettez les paramètres comme il faut vous créez le fichier juste à côté ici donc je vous invite à le faire si ça vous tente que votre bot soit dans le salon puis faire des démo live avec votre bot en attendant c'est tout ce qu'il fallait savoir je dirais non c'est pas vrai vous voyez que en ligne de commande tout ce que j'ai fait comme commande c'est d'appeler le script bot qui vit dans le répertoire bot donc bot bot est ici on va analyser le code je l'ai lancé dans mon interprétaire et là on va les voir en bot de fichier wow ça nous dit quelque chose on en a parlé tout à l'heure en gros qu'est ce que je dis quand c'est lancé dans le contexte d'un interprétaire c'est bizarre mais il y a juste copier que les là à chaque fois il dit va me chercher dans mon fichier conf importe moi à partir de nos fichiers conf moi mon username password nickname chatroom ici pour que je puisse faire ça il faut à quelque part que je choine un module si je regarde mon arborescence j'ai un nid de paix tout est cohéreur c'est exactement ce qu'on a dit j'ai un reportoir bot où j'ai un nid de paix donc je suis capable d'importer le contenu des fichiers qui sont là j'étais ici j'ai dit importe moi le contenu c'est des noms je vous l'ai montré ici dans mon conf le nom username le nom password le nom nickname le nom chatroom ce que j'aurais pu faire ce qui marche aussi c'est un petit peu moins explicite si j'aurais pu dire importe à ce moment-là si il y a d'autres choses à déclarer c'est comme l'OD dans mon environnement pis ils sont là tel quel donc là c'est très explicite j'ai besoin de ces 4 choses là c'est juste ça que j'importe dans le contexte et je les utilise c'est une instance donc je déclare une variable B qui va être en fait une instance de la classe mon bot, ça tombe bien la classe est déclarée juste en haut remarquez la beauté de l'indentation et cherchez pas la braquette finale faites juste suivre l'indentation pis quand vous voyez que l'indentation est finie vous êtes sorti de la classe bon ça ça compte pas c'est juste ma ligne est trop longue vous voyez que c'est le même numéro de ligne mais voilà et ma classe arrête ici donc dans ce fichier là que vous avez devant vous celui que j'ai exécuté, bot.py j'ai rien d'autre que mes chebangs que en fait c'est juste ça qui est intéressant parce moi j'écris en français dans mes trucs j'ai un certain nombre d'import qu'on va regarder tout à l'heure ensemble j'ai la définition de mon bot qui lui-même mérite de mugjabberbot qui vit ailleurs et puis on va regarder ensemble les trucs et j'ai en bas le truc qui est exécuté quand je lance mon bot.py tout le monde me suit un peu dans la structure du fichier pis qu'est-ce qui s'est passé pour que mon bot arrive finalement dans le salon ça vient de compliquer finalement il faut juste comprendre cette twist on comprend les import on comprend la différence entre une instance une classe et là, ici ça je l'ai commenté parce que ça dépend des versions des fois et bon il prenait pas le nickname avant je pense que j'ai changé d'environnement mais le script est pas bon les messages d'erreurs sont explicites je lui ai dit, ben, à mon instance je lui ai dit, rejoins le room ça c'est une méthode qui est appelée vous voyez je l'exécute en lui donnant la valeur du room que je veux que j'ai importé ici c'est assez simple, ça reste lisible et après, qu'est-ce que je lui ai dit un coup que tu es dans le room serve forever il se comporte comme un serveur il écoute, puis il va répondre tout le temps jusqu'à quand, jusqu'à temps que j'arrête mon script je brise dans mon terminal l'exécution du truc et là, qu'est-ce que c'est passé alright, piebot, c'est cool ça salut piebot, salut test excellent, là il est là, ça prend un petit délai et là, il y a quitté le salon ok, donc pour le ramener je lance le truc ici s'il y en a d'autres qui veulent venir ça fera du fun dans le salon vous pouvez venir, ce que vous pouvez voir ici Barabota, qui est mon bot il vient de rentrer dans le salon puis il dit trois fois saint-embroise en fait, ce qui vient de se passer c'est qu'en rentrant, là c'est de la pure mécanique il n'y a aucune magie là-dedans en rentrant, lui, il a reçu tous ces messages-là comme nous, on voit un peu l'historique il y a tout reçu l'historique puis là, il lit tous les messages et il réagit donc là, bien, il était là une couple de fois donc là, il dit, c'est ta broise, c'est ta broise c'est genre de chose peut-être dire, ouais c'est nul je vais coder un comportement différent les bravoux ça a été légère mon bot pour faire ça encore alors maintenant, je pense que ce qui nous reste à voir, c'est qu'est-ce qui se passe avec ces commandes-là il y a deux grands types de commandes le but évidemment, c'est pas que vous compreniez parfaitement les bots, là on s'en fout c'est un prétexte pour se faire du fun avec du Python donc, je vais vous expliquer rapidement ce qui se passe pour vous comprenir mais c'est pas à prendre par coeur il y a... c'est vraiment pas cet écran gros, là si vous regardez la classe elle a une première méthode qu'il y a d'autres qu'une fonction déclarée dans le contexte d'une classe qui s'appelle init avec underscore, underscore unique donc il y a quelque chose de magique là-dedans c'est pour un pseudo-constructeur je dis un pseudo parce qu'il y a des nuances c'est l'objet pas créé et créé avant finalement, on s'en fout considérez ça comme un constructeur c'est ça qui est appelé quand on fait ça ici donc je passe des paramètres de la classe mon bot puis je crée mon instance c'est en quelque ça, c'est le init qui est appelé qu'est-ce qui se passe vous voyez ça c'est particulier, on avait pas vu ça self ici, par convention on l'appelle self et c'est le premier argument des méthodes qui vont être accessible sur les instances donc ça c'est l'équivalent du dis en java pour ceux qui connaissent un peu de java vous pourriez marquer dis puis mettre dis partout et dire moi je fais ce que je veux ça va marcher mais par convention en python on met self ça ici c'est ce que je vous disais des comportements spéciaux de python je pourrais vous en parler mais je voudrais qu'on s'amuse plus sur le truc globalement ici c'est ramasse-moi tous les autres arguments qui vont passer puis ça c'est des keyword arguments ça veut dire qu'ils vont être pré fixés de leur nom de variable je vous le dis rapidement donc ici ça c'est un argument on va travailler avec la position mon premier argument, mon deuxième argument en fait non self il est ici mais on le voit pas il est comme là par défaut ça c'est mon premier argument, ça c'est mon deuxième argument ça c'est un keyword argument parce que c'est un argument qui a un mot clé qui vient avec et lui pareil et il y a un ordre on va mettre un keyword argument avant tout le truc c'est des choses ça va vous péter dans le visage si vous le faites je vous laisse explorer ça, je vous laisse voir la doc c'est juste pour faire des méthodes qui sont génériques ici je prends l'argument avec son position 0 puis je déclare que je stock ça dans l'instance je le stock dans un attribut username donc les attributs je ne les déclare pas en haut ici ça serait des attributs de la classe si vous avez un keyword accessible sur l'instance on les déclare ici dans l'init avec un self ok donc le username c'est l'argument 0 comme vous voyez ça tombe bien parce que si le username j'ai passé c'est mon premier donc la position le deuxième ça serait le password donc voilà ça ici tiens tant qu'à arrêter on a la gestion d'erreur je ne voulais pas parler mais bon on peut essayer des blocs d'instruction et si jamais une erreur est soulevée je capte l'exception et faire un traitement particulier ici c'est facultatif de dire je capte ce type d'erreur je ne pourrais rien mettre ou mettre un E le stocker la variable dans l'oeuvre je vous laisse vérifier la syntaxe exact mais les structures c'est try accept ici en gros c'est un peu crétin j'ai dit ici ça plante ben fait rien mais ce que je veux juste c'est que ça ne fasse pas capoter tout mon script d'ailleurs on pourrait dire on essaie de supprimer le nickname on voit des keyword arguments le delt c'est un mot clé réservé qui veut dire supprimer c'est de le supprimer ben si tu n'arrives pas parce qu'il n'y a pas le key le key nickname dans mon keyword args ben à ce moment là fait rien c'est ça que ça veut dire on ne va pas lire ligne par ligne parce que ça serait franchement pas intéressant mais ce qu'il faut voir c'est qu'il y a deux grandes approches dans le contexte de cette classe moi mon botte réagisse dans le salon première approche c'est avec des botte commons ça c'est cette structure là c'est un petit truc magnifique en python qui s'appelle des décorateurs je rentrerai pas dans toute la syntaxe d'ailleurs si vous voulez voir vraiment la syntaxe du truc le botte commons pour que je puisse l'utiliser il faut bien qu'il vienne de quelque part ben il doit venir d'un importe oho ben allez dans jabber botte puis lisé comment c'est codé botte commons vous verrez comment c'est codé décorateur le concept de décorateur c'est une fonction qui vient râper une autre fonction envelopper avant son exécution donc on peut le faire exécuter ou on peut le faire capoter en bref il faut faire ce qu'on veut donc ce qui ça veut dire que botte commons est exécuté avant date dans le contexte actuel conceptuellement ça veut juste dire j'enregistre ma date comme étant une commande de mon botte dans le contexte qui est là ici si je retourne mon botte barabota est là dans le contexte si je fais sieste il me répond ailleurs puis il y a même atelier ucam je sais plus c'est qui c'est test test test ou autre truc qui répond oh non non il s'appelle atelier ucam c'est là il y a ces deux personnes là qui répondent parce qu'on a le même code source mais sieste est ici une méthode donc c'est le nom de ma classe qui est décoré par botte commande alors dans le contexte ici ça veut dire si j'ai enregisté une commande du botte bon qu'est-ce qui se passe vous voyez que c'est assez simple j'ai trois lignes donc quand je vais vous dire tout à l'heure essayez de me faire une commande ben vous copiez et collez ça puis vous changez le comportement vous changez le nom de la commande c'est à peu près tout si je vous fais la preuve en gros qu'est-ce qui se passe il y a un self parce que c'est une méthode ou des arguments ça moi même quand j'ai codé au début je ne savais pas fait que j'ai vu comment ça se faisait ailleurs j'ai copié collé et puis voilà et j'ai vu que pour envoyer un message parce que c'est quand même le but du jeu pour envoyer un message je prends mon botte et je lui dis simple reply à lui passant les arguments que j'ai trouves et vous voyez le reply je les construis ici c'est donc une constante cherchez pas de logique à chaque fois ça va être écrit sieste il va répondre il y a un truc ici c'est pas très intelligent la preuve c'est que je peux créer tout de suite une commande qui va s'appeler super on va l'appeler génial parce que super c'est un nom réservé génial et puis faire rien d'autre que répondre génial sauf que là je vais mettre un petit u devant parce que j'ai suivi un atelier python et il m'a dit je vais mettre un u quand il y avait des accents alors là par contre j'ai même modifié le code source si je veux que ça se passe dans mon I am leaving si je veux que ça se passe il faudrait peut-être que je le load avec le nouveau code source ce que je vais faire j'interrompre le truc je vais peut-être vérifier qu'il soit bien parti et je relance mon botte cool, il revient génial, devrait fonctionner j'ai copié collé c'est pas de la grande magie c'est de la grande python pour pouvoir comprendre que c'est une méthode, que c'est à plable puis que je l'ai enregistré parce qu'il y avait un décorateur et je pourrais aller voir le truc donc après ça vous devrez être là ça c'est une approche pour que mon botte interagisse l'autre approche c'est un peu plus compliqué vous voulez appeler que bière je pouvais le mettre un peu n'importe où à montrer pour ça j'ai utilisé ce qu'on appelle des regex pour ceux qui sont, commencent en informatique les regex ça veut dire regular expression c'est un petit monde en soi au niveau de la syntaxe ok c'est avé, en python vous voyez que j'ai utilisé ici un module qui s'appelle erreur la preuve je l'ai importé et ça fait partie du standard library on va aller voir rapidement sur le web de quoi il retourne deux approches pour explorer des nouvelles choses en python première approche on lance un terminal on fait high python ou python import erreur déjà ça veut dire que c'est installé sur mon système sinon je dirais de quoi tu parles erreur ok et là on pourrait dire qu'est-ce que j'ai dans le vente de erreur erreur pointable puis l'amusez-vous à faire de l'étrospection ça peut être un peu rébarbative des fois une bonne documentation au web surtout quand on veut commencer à voir ces coins de libraries ça peut être juste super alors on y va au lieu d'être sur register je m'en vais dans ma doc python je m'en vais dans la librairie de référence et j'ai quelque part un erreur regular expression operation toute la syntaxe que je vous disais qui disait qu'il était un monde en soi est définie dans cette page-là c'est quand même pas si pire avec des exemples et tout ça donc le but d'un regex c'est de regarder si une chaîne de caractère répond à une certaine structure un certain pattern qui nous intéresse puis si oui d'aller capter des sous-boutes chaînes puis pouvoir faire des choses avec c'est typiquement ce qu'on veut faire les gens en répondent dans le baisseur avec des chaînes de caractère moi je veux voir si ça répond à certains trucs le mot bière, ce qu'il y est avant, après l'après ce que je veux dire ok puis si il y a le mot bière je veux le capter on pourrait transformer les mots, on pourrait s'amuser avec ça donc c'est vraiment ça dont j'ai besoin si je regarde le code source ici en fait à l'initialisation sur mon bot, j'ai créé des variables, des attributs sur mon bot même qui s'appelle regex bière, regex aura regex redmine, peu importe et j'ai compilé des patterns tout ça là c'est le bout ici qui est un peu ésotérique ça ça veut dire bah ça se lit n'importe quel caractère n'importe quand on n'a rien de foie si j'aurais pu mettre au moins une fois tout ça on aurait pu choisir les caractères ça veut dire je cherche ce groupe le groupe de caractère qui est ici et si je le lis ça ça veut dire crée-moi un paramètre qui s'appelle bière on n'a peut-être pas besoin de toute cette poutine mais si vous voulez vraiment devenir expert là-dedans, allez voir la doc puis prenez le temps de le lire allez dans votre interprétaire amusez-vous avec ça compilé des patterns créez une chaîne de caractère, testez si ça marche déjà ce que je fais quand je crée mon bot je stock ça dans une variable donc là je suis prêt à capter ça quelque part ici bon ça j'ai regardé comment qu'il faisait, quelque part ici il s'attend, il écoute tous les messages et il réagit en gros toute ma logique de dispatch est ici, bon c'est comme ça que c'est codé ce que j'ai fait ici, je reçois un message je prends le body du message le stock dans le message, si j'ai pas de message bah il retourne rien, bon moi j'aurais peut-être mis passe là ou je sais pas ça c'était déjà là dans le code le bot quand même là je pense qu'il doit arriver quelque part par ici en gros tu vois ce que je fais c'est si je réponds à ton truc mais je suis l'ordre d'exécution si le message actuellement capté match, le pattern que j'ai stocké dans l'attribut c'est quasiment du français, c'est plus de l'anglais mais si le message match le pattern que j'ai stocké sur mon bot à ce moment-là j'ai dit exécute-moi la méthode, bah je vois j'exécute ici quelque chose en lui passant le message, le message qui est plus large que le message ici j'ai plus que juste le get body j'ai pas qu'il y a d'autres trucs et ça bière, on va aller voir le code bière, bière bière ici n'est pas décoré fait que c'est pas une botte command il est appelé si mon pattern match on l'a vu, if match puis là j'exécute ce que j'ai envie de faire on verra, bah c'est pas grand chose fait que si je vous dis maintenant codez-moi un pattern tel truc ce qu'il faut faire, bêtement et méchamment puis on gardera le reste de l'atelier pour faire ce genre de choses-là vous allez vous enregistrer dans l'init un pattern à y mettre un nom explicite généralement le nom de la méthode qui va s'exécuter dans le callback, vous testez si le message fait que vous copiez deux lignes il n'y a pas de pattern de voir si le message encore match vous aurez pu mettre des leaf c'est des if, if, if fait que c'est exécuté comme ça et ma foi un coup, et là c'est là arrive ta réponse comment par exemple si est qu'il n'y a pas de pattern regex associé, on sait que c'est un botte command je l'ai enregistré comme botte command quand est-ce qu'il est exécuté je te dirais que quelque part là-dedans il me semble au pif et si t'es pas certain là je vous montre un petit truc en bonus après j'ai arrêté de parler je voudrais quand même vous puissiez coder un peu on peut apporter un le python debugger python db python debugger là on peut mettre un point virgule pour chainer des commandes sur une ligne puis vous dites python debugger settrace ok et puis là mettre un break point ça veut dire là-dedans quand tu vas exécuter il arrive là ça arrête puis là dans le terminal au lieu de me dire serve for ever il va me dire tu peux interagir avec le contexte les variables et aller étape par étape dans l'exécution du code ok donc ça c'est peut-être pas le endroit stratégique pour le faire mais sinon tu peux suivre toi même l'exécution en disant super ici c'est une c'est une fonction built-in vous voyez qu'il est appelé pour aucune classe super ça va appeler la super classe en fait de la super classe de la classe bot elle lui passe à mon instance la super classe de la classe bot c'est mcjabber bot parce que j'ai l'hérité de ça et là là dessus, sur la super classe je reviens, je m'excuse sur la super classe je vais appeler le callback message fait qu'il doit avoir une définition callback message ou aussi l'autre bar fait que ça ça veut dire quoi il y en a un mot c'est de l'overwrite dans mon bot ici la méthode callback message de mon super fait que je dis je fais ça parce que moi c'est ça que je veux qui se passe puis à la fin exécute ce que lui a dit aussi bon c'est pas très grave là pour tout de suite si on est capable de modifier nos bottes en rajoutant une commande ou en changeant le regex juste en faisant du python qui n'a pas trop d'erreur dedans puis qui s'exécute dans le salon ben on aurait atteint notre objectif fait que c'est un peu ça l'idée donc vous ajoutez ça c'est les exercices pour ceux qui n'ont pas suivi vous ajoutez soit une commande ou soit un pattern en copie en collant le pattern c'est le plus compliqué parce qu'il y a plusieurs endroits faut d'abord enregistrer le pattern dans un attribut et dans le callback message faut juste tester si le message match le pattern si oui appeler la méthode ben faut la coder la méthode et la méthode bon la code par exemple en copie en collant bière sauf que le pattern ne sera pas le même mais c'est ce code là qui va être exécuté si on lit finalement la dernière étape de tout ce traitement là quand on passe avec le regex quand j'exécute bière qu'est ce qui se passe ici tout ce code là c'est juste pour qu'il réponde pas à lui-même ben sinon ma réponse vous l'avez vu c'est cette angoisse je me demande juste de faire une réponse ok simple reply ça j'ai rajouté ça puis ça se lit relativement bien mon bot je veux savoir qui est le username qui a envoyé le message je le stocke dans username si le username qui a envoyé le message est différent du propre username de mon bot fait que ça c'est la différence et que le username qui a envoyé le message est différent du nickname bon ça c'est un petit ajout à ce moment là réponse est en droit sinon si c'est moi qui a écrit bière ça veut dire si c'est le bot qui a écrit bière ben je veux pas répondre à moi-même parce que pis c'est ça si je réponds des bières je pourrais m'amuser à faire des boucles en fin fait que là disons que ça c'est de la petite logique je l'ai blindé après avoir fait une erreur ou est-ce qu'il y avait des boucles en fin puis on se dit ah mon dieu tous les rebots se répondaient aux autres bière bière bière j'avais connu un truc ou ra ben c'est comme ça au cas d'ouci hein c'est en testant des prototypes et c'est là que Python est le fun parce que vous voulez coder pour vrai au lieu de passer une demi-heure à dire comment je ferai à modéliser vous le coder, vous le tester puis vous les interagissez après vous laisse, mais ne partez pas parce que l'atelier n'est pas terminé mais je vous dirais essayez de pimper votre botte parce que vous avez déjà un code source on voit qu'il réagit à bière, on voit qu'il réagit à merci on peut le faire réagir à un certain nombre de trucs et là c'est là que ça dépend de votre imagination j'avais fait un moment donné il y a un petit exercice qui est un peu plus complexe si vous voulez y aller avec ça dans le code toujours dans atelier.zip mais il faut peut-être avoir le module vous savez que j'ai codé ça moi c'est pas dans le code, l'énoncé de l'exercice c'est dans exercice ici ou est-ce que je dis bien ce qui serait cool c'est d'aller prendre le RSS du site de Montréal Python puis que le botte il l'affiche wow je vous laisse réfléchir à ça je vous expliquais dans l'énoncé que ça serait une bonne idée d'utiliser le module feed parser moi je suis dans un contexte Linux donc ici je fais juste sudo apetitget install python feed parser puis c'est un module feed parser qui ne vient pas avec la librairie standard fait que c'est un module qui existe ailleurs et à ce moment là un coup je l'ai installé je peux l'utiliser en faisant import feed parser alors que la solution ça va être ça puis là il faut coder les trucs en même temps je vous montre rapidement la solution juste pour vous donner le goût c'est à dire que ma solution réside d'ailleurs je rajoute juste cette méthode là ou est-ce que j'ai créé une commande qui est enregistre là évidemment il faut le mettre dans le bot c'est une méthode qui vit tout seul tu rajoutes ça dans le bot import feed parser ça aurait peut-être été plus élégant de l'importer en haut mais bon là c'était juste pour mettre ça bien contené je donne une URL je parse une URL avec le feed parser je capte le flux et là on voit ici que je vais utiliser des slices les cinq dernières je ne veux pas tout ce qui s'est passé je capte ça dans mes items mon replay ça va commencer avec le string les cinq derniers blocs de montréal python après jeterre et je construis en concatenant des trucs en HTML je suis un peu déçu parce que ça ne marche pas bien je vais vous montrer la commande est implementée sur mon bot puis je fais replay puis c'est un replay c'est magique donc je crois que mon bot actuellement c'est de répondre à ça montréal python à le sale comment ça qu'il n'y a pas ça je vais aller voir le code de mon bot a pas ça regarde on va régler ça vite fait bien fait bot comment bot bot je me sens en dessous de mes communs je vais être quand même clean ici là on est d'accord que je ne laisse pas ça comme ça parce que l'indentation c'est important python je mets ça comme ça je sauvegarde je vais couper mon truc qui devrait sortir de l'atelier il est parti ça c'est nice je relance un bot là j'ai pimpé mon bot avec un truc montréal python qui va aller me chercher son rss là c'est un peu lait parce que je pense que j'ai comme rétrogradé en version avec mon jab bot et il ne forme pas battre pas bien l'HTML c'est des soucis que vous réglez dans le code vous voulez faire un agrégateur de flux appeler autant de flux que vous voulez me le gêler ensemble vous omissez le truc bon voilà amusez-vous avec les reg-ex si vous voulez faire une commande un peu plus complexe comme mon truc bière sinon juste copier coller un bot commun vous assurez que votre bot hey dans son conf.pair c'est paramètres de connexion venez faire le party sur testreunion.org puis montrez-nous ce que votre bot est capable de faire si vous avez besoin d'un coup de main pour quoi que ce soit pour enregistrer un bot pour modifier les commandes bah allez-y je sais pas s'il y a des questions je parle beaucoup mais je ne pose pas êtes-vous j'ai remarqué que la liblanerie jab robot certaines versions ça ne s'appelle pas jab robot mais puis jab robot puis l'informe ne marche pas avec ton code j'ai vu une nouvelle version j'ai appris à atelier 2.zip ok si jamais ça ne marche pas de votre côté sur le wiki je fais un refresh de la page j'ai un atelier 2.zip si jamais ça ne fonctionne pas l'url est au tableau dans version raccourcie aussi alright ton code un peu en fait c'est du copier coller oui certains on va venir c'est possible t'es sûr que t'es un fichier connexion avec les paramètres comme du monde sûr ok je te reviens juste parce que je vois qu'il y en a plusieurs qui souhaitent partir je voudrais peut-être d'abord à ce moment-là dire un petit mot de conclusion juste en conclusion je voudrais juste vous dire pour continuer il y a le tutoriel dans la doc officielle il y a un paquet de bons guides qui sont en ligne facilement accessible dive into python learn python the hard way think python les url tout ça c'est accessible dans les sources que je vous ai mis ateliers et si vous voulez en savoir plus parce que moi j'ai découvert python globalement avec mon real python avant que je sois dedans