==Déroulement de l'Atelier==

francis.ngatsi a rejoint le salon 11:57 davin.baragiotta a rejoint le salon 12:33 franck.kouyami a rejoint le salon 12:42

davin.baragiotta 27/08/2012 12:45:21 test ok ça marche 27/08/2012 12:45:24

arnaud.amelina@auf.org 27/08/2012 12:45:47 C'est bon 27/08/2012 12:45:50 darko.stanar a rejoint le salon 12:46 doan.manh.ha a rejoint le salon 12:47 shafeek.sumser a rejoint le salon 12:47 patrick.mwamba a rejoint le salon 12:49 photo-valentin.kouadio@auf.org a rejoint le salon 12:51

photo-valentin.kouadio@auf.org 27/08/2012 12:51:43 salut couz abrosine2 a rejoint le salon 12:51 Tri a rejoint le salon 12:52

arnaud.amelina@auf.org 27/08/2012 12:52:39 Salut les Couz soyez tousles bienvenues 27/08/2012 12:52:47 chanesakhone.chitsaya a rejoint le salon 12:52

Tri 27/08/2012 12:52:49 bonjour mesdames et messieurs

arnaud.amelina@auf.org 27/08/2012 12:52:59 Saluto

doan.manh.ha 27/08/2012 12:53:04

patrick.mwamba 27/08/2012 12:53:15 Bonjour

davin.baragiotta 27/08/2012 12:53:26 eheh!

abrosine2 27/08/2012 12:53:31 Bonjour à tous

arnaud.amelina@auf.org 27/08/2012 12:53:50 Ben tu vois Davin finalement on a du monde shafeek.sumser a quitté la salle 12:53 sekou.diall a rejoint le salon 12:53

arnaud.amelina@auf.org 27/08/2012 12:54:01 et ça continue

photo-valentin.kouadio@auf.org 27/08/2012 12:54:05 yep

sekou.diall 27/08/2012 12:54:24 Salut à tous

davin.baragiotta 27/08/2012 12:54:53 arnaud.amelina@auf.org: "en sale!"

chanesakhone.chitsaya 27/08/2012 12:54:58 bj à tous

davin.baragiotta 27/08/2012 12:55:09 wow, ça va être cool tout ça

arnaud.amelina@auf.org 27/08/2012 12:55:12 Ouep

davin.baragiotta 27/08/2012 12:55:24 j'espère que tout ce monde va rester pour l,atelier git qui suit après! (coup de pub) 27/08/2012 12:55:27 david.violette a rejoint le salon 12:55

david.violette 27/08/2012 12:56:16 bonjour tout le monde

doan.manh.ha 27/08/2012 12:56:52 salut david

arnaud.amelina@auf.org 27/08/2012 12:57:01 Saluto David emmanuel.tagne-tagne a rejoint le salon 12:57

arnaud.amelina@auf.org 27/08/2012 12:57:39 on aura le grand Patron parmi nous

davin.baragiotta 27/08/2012 12:58:19 ah non désolé, monsieur Cerquiglini s'est excusé 27/08/2012 12:58:21 victor.bruneau a rejoint le salon 12:58

arnaud.amelina@auf.org 27/08/2012 12:58:40

Il sera valablement représenté 27/08/2012 12:58:50 christine.legris a rejoint le salon 12:58

davin.baragiotta 27/08/2012 12:59:03 ahaha

victor.bruneau 27/08/2012 12:59:23 Salut à tous

arnaud.amelina@auf.org 27/08/2012 12:59:37 Voilà celui qui a été annoncé tran.xuan.huy a rejoint le salon 13:00

arnaud.amelina@auf.org 27/08/2012 13:00:11 Bievenue à Monsieur le représentant de Monsieur Cerquiglini

victor.bruneau 27/08/2012 13:00:18

arnaud.amelina@auf.org 27/08/2012 13:00:26

davin.baragiotta 27/08/2012 13:00:39 9h00 : coup d'envoi arnaud.amelina@auf.org, victor.bruneau : un mot d'intro? 27/08/2012 13:00:53

victor.bruneau 27/08/2012 13:01:00 oui, rapide

arnaud.amelina@auf.org 27/08/2012 13:01:13 Il est l'heure

victor.bruneau 27/08/2012 13:01:32 un petit mot pour remercier le comité d'organisation

arnaud.amelina@auf.org 27/08/2012 13:01:43

victor.bruneau 27/08/2012 13:01:49 qui a fait unbon boulit (sinon on serait pas là) merci aussi à ceux qui vont faire les ateliers 27/08/2012 13:02:20 et à tous participants 27/08/2012 13:02:33 BONNE SEMAINE TECH 2012 27/08/2012 13:02:42 C'est parti 27/08/2012 13:02:51 à toi davin.baragiotta 27/08/2012 13:02:59

arnaud.amelina@auf.org 27/08/2012 13:03:01 Merci Grand Boss

davin.baragiotta 27/08/2012 13:03:31 ok avant de commencer rappel de procédure comme arnaud disait 27/08/2012 13:03:36 dans CE salon, c,est l,atelier 27/08/2012 13:03:44 les discussions et questions, pour laisser le discours fluide : dans salon tech svp 27/08/2012 13:04:00


DÉBUT : Atelier Python


27/08/2012 13:04:07 Bonjour à tous 27/08/2012 13:04:23 vous devriez avoir 3 écrans ouverts 27/08/2012 13:04:32 1. cette fenêtre 27/08/2012 13:04:37 2. un navigateur 27/08/2012 13:04:43 3. un interpréteur 27/08/2012 13:04:47 (terminal je veux dire) 27/08/2012 13:04:53 http://wiki.auf.org/wikiteki/Projet/SemaineTech/2012 27/08/2012 13:05:02 premier atelier = Python 27/08/2012 13:05:08 voici la page présentation : 27/08/2012 13:05:13 http://wiki.auf.org/wikiteki/Projet/SemaineTech/2012/Ateliers/Python 27/08/2012 13:05:17 je prends pour acquis que vous avez tout ce qu'il faut d'installer 27/08/2012 13:05:28 si vous n'avez pas iPython : pas grave, on va faire sans 27/08/2012 13:05:38 tout le contenu est ici : 27/08/2012 13:05:54 http://wiki.auf.org/wikiteki/Ateliers/Python/Base/Support 27/08/2012 13:05:54 je vous demande donc de garder cette page ouvert... c'est le plan de match 27/08/2012 13:06:07 INTRODUCTION 27/08/2012 13:06:11 notre but dans cet atelier 27/08/2012 13:06:20 c'est de mettre les mains dans python 27/08/2012 13:06:29 on va coder 27/08/2012 13:06:33 d,abord interactivement... dans l'interpréteur 27/08/2012 13:06:43 ensuite on va mettre ce qui nous intéresse dans un script 27/08/2012 13:06:53 (un fichier) 27/08/2012 13:06:55 qu'on va exécuter 27/08/2012 13:07:00 vous avez la documentation officielle en lien 27/08/2012 13:07:13 elle a un tutoriel 27/08/2012 13:07:20 peut-être un peu long 27/08/2012 13:07:24 et aussi, la doc de la "standard library" 27/08/2012 13:07:38 c'est à dire de ce qui vient par défauit avec Python 27/08/2012 13:07:49 vous devez avoir un éditeur texte aussi 27/08/2012 13:08:01 vi, emacs... peu importe... moi j'utilise gedit 27/08/2012 13:08:12 (et je n'ai pas honte ) 27/08/2012 13:08:17 bon, c'est parti 27/08/2012 13:08:27 dans votre terminal, lancez l'interpréteur ipython 27/08/2012 13:08:43 (ou python pour ceux qui ne l'ont pas) 27/08/2012 13:08:49 s'agit juste de taper : python ou ipython 27/08/2012 13:09:01 fawaz.tairou a rejoint le salon 13:09

davin.baragiotta 27/08/2012 13:09:24 ce qui est super avec python c'est sa simplicité 27/08/2012 13:09:29 puissant... mais simple 27/08/2012 13:09:33 simplicité d'abord dans la syntaxe 27/08/2012 13:09:43 frumence.boroto a rejoint le salon 13:09

davin.baragiotta 27/08/2012 13:09:58 ah... un mot sur les interpréteurs... rapide un interpréteur écoute le code que tu saisies et retournes la valeur associé à l'exécution 27/08/2012 13:10:17 dans ipython c'est écrit "In"... pour input 27/08/2012 13:10:30 et ça retourne "Out" pour output de l'exécution 27/08/2012 13:10:40 commence par instancier une variable avec un entier 27/08/2012 13:11:01 a = 12 27/08/2012 13:11:03 ça retourne rien... 27/08/2012 13:11:13 si on saisit ensuite "a" 27/08/2012 13:11:21 ça retourne 12 27/08/2012 13:11:28 toutes nos instructions restent en mémoire dans interpréteur... 27/08/2012 13:11:44 on va tester la syntaxe d'un commentaire 27/08/2012 13:11:51 c'est 1 27/08/2012 13:11:53 oups 27/08/2012 13:11:54 # 27/08/2012 13:11:56 # ceci est un commentaire 27/08/2012 13:12:01 ça fait rien 27/08/2012 13:12:04 ça pas de

davin.baragiotta 27/08/2012 13:14:44 configurez votre éditeur pour transformer les tabs en 4 espaces pour terminer avec la syntaxe... : il existe une "stylistique" pythonesque 27/08/2012 13:15:12 pour rendre le code plus lisible 27/08/2012 13:15:17 calin.dordia a rejoint le salon 13:15

davin.baragiotta 27/08/2012 13:15:27 ce sont des recommandations (largement suivies) PEP8 27/08/2012 13:15:37 http://www.python.org/dev/peps/pep-0008/ 27/08/2012 13:15:45 vous pouvez y jeter un oeil pendant qu'on récolte les questions dans salon tech 27/08/2012 13:16:01 des questions? 27/08/2012 13:16:07 calin.dordia a quitté la salle 13:16

davin.baragiotta 27/08/2012 13:16:36 ok, pas de nouvelles... bonnes nouvelles (en même temps opn a rien fait encore) variables : 27/08/2012 13:16:43 les variables sont des "noms" qui font "référence" à une "valeur" 27/08/2012 13:17:06 ex.: 27/08/2012 13:17:08 a = 12 27/08/2012 13:17:11 b = a 27/08/2012 13:17:15 (on dit que b prend la valeur de a) 27/08/2012 13:17:31 avec la fonction "buiklt-in" id() 27/08/2012 13:17:41 on va vérifier l'emplacement mémoire des valeurs 27/08/2012 13:17:51 id(a) 27/08/2012 13:17:55 id(b) 27/08/2012 13:17:57 on voit que c'est identique... donc : 27/08/2012 13:18:04 les noms "a" et "b" pointent vers la même chose 27/08/2012 13:18:15 parlons maintenant des types 27/08/2012 13:18:26 quand on programme on manipule de l'info... et l'info est typée... car on veut pas faire la même chose avec des entiers et des chaines de caractères 27/08/2012 13:18:52 voyons les types de base en Python 27/08/2012 13:19:01 (tapez dans votre terminal en même temps) 27/08/2012 13:19:09 None est un nom réservé qui veut dire "rien"... 27/08/2012 13:19:26 comme NULL dans les bases de données 27/08/2012 13:19:35 on a aussi les booléens ; False et True 27/08/2012 13:19:45 les majuscules sont importantes ici 27/08/2012 13:19:52 none, false, true : ça n'existe pas 27/08/2012 13:19:59 dans le numérique on a les entiers : 27/08/2012 13:20:14 15 27/08/2012 13:20:16 et aussi les float... pour le décimal : 15.5 27/08/2012 13:20:27 évidemment, pas de virgule... un point 27/08/2012 13:20:35 on a les chaînes de caractères : string et unicode... 27/08/2012 13:20:47 c'est bon de savoir que c'est 2 choses différentes... 27/08/2012 13:21:04 je vous passe le détail sur les encodages 27/08/2012 13:21:19 mais pour déclarer une chaine unicode (soyons modernes) 27/08/2012 13:21:31 il faut mettre le u devant les apostrophes (quote) 27/08/2012 13:21:43 u"" 27/08/2012 13:21:46 ça peut aussi être des single quote 27/08/2012 13:21:53 u 27/08/2012 13:21:55 il existe aussi les chaînes "raw" (brutes) : r"" 27/08/2012 13:22:12 on verra ça dans django 27/08/2012 13:22:17 .... 27/08/2012 13:22:25 avec ça... on a la base... 27/08/2012 13:22:34 après ce qui est intéressant... c'est de créer des structures de données 27/08/2012 13:22:49 ex.: j'ai un prénom et un nom, moi... 27/08/2012 13:23:00 je voudrais manipuler les 2 dans un objet personne... 27/08/2012 13:23:15 premier type de structure, ou conteneur d'info : 27/08/2012 13:23:27 les listes 27/08/2012 13:23:30 l = [] 27/08/2012 13:23:34 ça c'est une liste vide 27/08/2012 13:23:39 comme en math, pour déclarer des éléments, on met des virgules 27/08/2012 13:23:51 l = [1,2,3] 27/08/2012 13:23:57 liste ayant 3 entiers comme éléments 27/08/2012 13:24:07 la liste est ordonnée... on y reviendra dans un instant 27/08/2012 13:24:28 (c,est pas un sac de valeur... y,a un ordre) 27/08/2012 13:24:38 t = tuple = () 27/08/2012 13:24:43 c'est exactement comme une liste... sauf c'est immuable 27/08/2012 13:24:54 si on peut ajouter un élément à une liste : 27/08/2012 13:25:01 l.append(4) 27/08/2012 13:25:08 on ne peut pas avec un tuple... 27/08/2012 13:25:14 ça sert à quoi? principalement pour des raisons de performance... et on le voit partout 27/08/2012 13:25:31 donc retenir que () = tuple 27/08/2012 13:25:40 exemple : 27/08/2012 13:25:42 t = (1,2,3,4) 27/08/2012 13:25:48 c'est un tuple de 4 éléments (tous entiers) 27/08/2012 13:25:57 balla.fall a rejoint le salon 13:26

davin.baragiotta 27/08/2012 13:26:14 finalement, la dernière structure c'est un "dictionnaire" c'est un peu comme un array dans d'autres langages 27/08/2012 13:26:25 syntaxe de dictionnaire vide : 27/08/2012 13:26:36 d = {} 27/08/2012 13:26:40 le dictionnaire stocke des associations clé-valeur 27/08/2012 13:26:56 la clé DOIT être unique... 27/08/2012 13:27:06 un peu comme une entrée dans un dictionnaire 27/08/2012 13:27:15 ex.: 27/08/2012 13:27:19 d = { 'prenom':'Davin', 'nom':'Baragiotta', } 27/08/2012 13:27:51 un dictionnaire avec 2 clés (prenom et nom) 27/08/2012 13:28:06 ayant respectivement les valeurs 'Davin' et 'Baragiotta' (des strings) 27/08/2012 13:28:24 finalement... les ensembles.... dernier type 27/08/2012 13:28:39 un ensemble, au sens mathématique est une collection non ordonnée d'éléments unique 27/08/2012 13:28:59 on crée un ensemble (set en anglais) en utilisant set() sur une collection (liste, tuple, dictionnaire) 27/08/2012 13:29:26 jouons. 27/08/2012 13:29:32 créer la liste : 27/08/2012 13:29:37 l = [1,2,3,3,3,4,5,5] 27/08/2012 13:29:48 shafeek.sumser a rejoint le salon 13:29

davin.baragiotta 27/08/2012 13:29:59 comptons les éléments 8 27/08/2012 13:30:05 len(l) 27/08/2012 13:30:09 eric.mcsween a rejoint le salon 13:30

davin.baragiotta 27/08/2012 13:30:24 len = length... fonction built-in (on y revient) maintenant... on en fait un ensemble : 27/08/2012 13:30:33 e = set(l) 27/08/2012 13:30:36 len(e) 27/08/2012 13:30:43 5 27/08/2012 13:31:05 en tapant seulement "e" dans l'interpréteur 27/08/2012 13:31:18 il vous retourne les valeurs de l'ensemble 27/08/2012 13:31:29 e 27/08/2012 13:31:32

In [8]: e Out[8]: set([1, 2, 3, 4, 5]) 27/08/2012 13:31:40 on vient bien qu'un ensemble est non redondant... 27/08/2012 13:31:51 questions? 27/08/2012 13:31:55

arnaud.amelina@auf.org 27/08/2012 13:32:22 n/a

davin.baragiotta 27/08/2012 13:32:29 ok on continue python offre des raccourcis sympas 27/08/2012 13:32:43 suppons que vous avez des valeurs dans un tuple : 27/08/2012 13:32:53 t = (34,56) 27/08/2012 13:33:03 disons que ce soit des coordonnées d'un piont dans l'espace... 27/08/2012 13:33:14 x et y quoi! 27/08/2012 13:33:18 et qu'on veuille manipuler x et y indépendamment 27/08/2012 13:33:32 on peut faire simple ceci : 27/08/2012 13:33:37 chamback.pierre a rejoint le salon 13:33

davin.baragiotta 27/08/2012 13:33:53 x, y = t (euh je crois que je me trompe... faut unpacker, minute) 27/08/2012 13:34:07 ah si ça marche 27/08/2012 13:34:34

In [10]: t = (34,56)

In [11]: x, y = t

In [12]: x Out[12]: 34

In [13]: y Out[13]: 56 27/08/2012 13:34:46 c'est ce qu'on appelle unpacker (ou packer, dans le sens inverse, si je ne me trompe) 27/08/2012 13:35:03 python est un langage fortement typé 27/08/2012 13:35:20 c,est à dire qu'on ne fait pas n'importe quoi avec les variables... 27/08/2012 13:35:32 si a est un entier (a = 15) 27/08/2012 13:35:40 alors c'est un entier... je peut pas, par exemple, le concaténer avec une chaine de caractère 27/08/2012 13:35:57 'davin' + 5 27/08/2012 13:36:02 ça n'a pas de sens en Python... 27/08/2012 13:36:07 il ne va pas faire comme en PHP et dire "aaaah... tu voudrais que 5 soit un string?" 27/08/2012 13:36:26 et donner : 'davin5' 27/08/2012 13:36:30 fortement typé donc... 27/08/2012 13:36:40 louis-beethoven.montrose a rejoint le salon 13:36

davin.baragiotta 27/08/2012 13:36:55 ça veut dire que si on veut changer de type, faut le faire explicitement avec des opérateurs pour ça : 27/08/2012 13:37:00 str(5) 27/08/2012 13:37:04

In [16]: cinq = str(5)

In [17]: type(cinq) Out[17]: <type 'str'> 27/08/2012 13:37:36 type() = autre fonction built-in (qui vient par défaut)... ça donne le type de la variable 27/08/2012 13:37:58 on voit que la variable nommé "cinq" est un str après la transformation de 5 par str() 27/08/2012 13:38:21 c'est ce qu'on appelle le "transtypage" 27/08/2012 13:38:34 mais vous aurez remarqué 27/08/2012 13:38:41 que python est dynamqieu 27/08/2012 13:38:56 pas besoin de déclarer les variables et leur type 27/08/2012 13:39:05

a = int() a = 5 27/08/2012 13:39:13 première ligne est inutile 27/08/2012 13:39:21 bon on n'a rien fait de rigolo... mais on a vu la base 27/08/2012 13:39:33 Built-in : les fonctions 27/08/2012 13:39:45 http://docs.python.org/library/fonctions.html 27/08/2012 13:39:50 dans la doc officielle... on voit toutes les fonctions de base 27/08/2012 13:40:01 y'en a pas beaucoup vous me direz... 27/08/2012 13:40:15 mais c'est parce que Python travaille plus avec des objets 27/08/2012 13:40:31 comme Java, par exemple 27/08/2012 13:40:36 dans les fonctions de pas 27/08/2012 13:40:43 j'en ai énuméré quelques unes d'utile 27/08/2012 13:40:57 certaines qu'on a déjà vu : 27/08/2012 13:41:07 type() 27/08/2012 13:41:10 int(), str().... 27/08/2012 13:41:19 len() 27/08/2012 13:41:21 on les apprendra pas par coeur : faut juste savoir où elles sont définies dans la doc 27/08/2012 13:41:36 dernier point de théorie et ensuite on s'amuse 27/08/2012 13:41:55 Objets et namespaces... 27/08/2012 13:42:04 en Python TOUT est un objet... 27/08/2012 13:42:13 un objet (en programmation orienté-objet) c'est rien d,autre qu'une strucutre de données 27/08/2012 13:42:30 un peu comme nos dictionnaires : d = {} 27/08/2012 13:42:45 un objet a donc "de l'information sur lui"... un peu comme on peut vous demander votre nom, vos études, vos jobs passées 27/08/2012 13:43:22 on peut interroger un objet 27/08/2012 13:43:27 on l'interroge en appelant des "attributs" 27/08/2012 13:43:47 ce sont des varaibles sur l'objet 27/08/2012 13:43:52 ou 27/08/2012 13:43:53 en appelant des "méthodes" 27/08/2012 13:43:59 se sont des fonctions sur l'objet 27/08/2012 13:44:08 les "attributs" et les "méthodes" ont tous des "noms" 27/08/2012 13:44:27 namespaces : ce sont des noms qui vivient dans "l'ESPACE" de l'objet 27/08/2012 13:44:45 on puorrait dire "derrière lui" 27/08/2012 13:44:52 exemple : 27/08/2012 13:44:58 on va prendre une chaine de caractère : 27/08/2012 13:45:09 prenom = "Davin" 27/08/2012 13:45:14 avec ipython 27/08/2012 13:45:23 on accède aux "noms derrière la chaîne de caractère" 27/08/2012 13:45:35 en utilisant le poibnt : . 27/08/2012 13:45:41 suivi d'un tab : 27/08/2012 13:45:46

In [18]: prenom = "Davin"

In [19]: prenom. prenom.add prenom.repr prenom.istitle prenom.class prenom.rmod prenom.isupper prenom.contains prenom.rmul prenom.join prenom.delattr prenom.setattr prenom.ljust prenom.doc prenom.sizeof prenom.lower prenom.eq prenom.str prenom.lstrip prenom.format prenom.subclasshook prenom.partition prenom.ge prenom._formatter_field_name_split prenom.replace prenom.getattribute prenom._formatter_parser prenom.rfind prenom.getitem prenom.capitalize prenom.rindex prenom.getnewargs prenom.center prenom.rjust prenom.getslice prenom.count prenom.rpartition prenom.gt prenom.decode prenom.rsplit prenom.hash prenom.encode prenom.rstrip prenom.init prenom.endswith prenom.split prenom.le prenom.expandtabs prenom.splitlines prenom.len prenom.find prenom.startswith In [19]: prenom. 27/08/2012 13:46:06 ahaha! 27/08/2012 13:46:12 on vient de découvrir plein de truc "sur" (ou derrière) ma chapine de caractère... 27/08/2012 13:46:30 ce sont les noms des attributs et méthodes 27/08/2012 13:46:37 notre but dans la vie 27/08/2012 13:46:50 c'est de "faire des trucs" avec notre information 27/08/2012 13:47:00 c'est ça programmer... 27/08/2012 13:47:04 là, on se rend compte que Python nous donne plein de fonction directement sur l'objet... 27/08/2012 13:47:27 startswith... hmmm 27/08/2012 13:47:36 qu'est-ce que ça peut bien faire? 27/08/2012 13:47:44 on va continuer notre "introspection" de l'objet en appelant l'aide 27/08/2012 13:48:00 ipython : prenom.startswith? 27/08/2012 13:48:18 (si vous avez trop de noms et voulez sortir de la liste : q pour quit) 27/08/2012 13:48:51

In [20]: prenom.startswith? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in method startswith of str object at 0x967d940> Namespace: Interactive Docstring: S.startswith(prefix[, start[, end]]) -> bool

Return True if S starts with the specified prefix, False otherwise. With optional start, test S beginning at that position. With optional end, stop comparing S at that position. prefix can also be a tuple of strings to try. 27/08/2012 13:49:07 ok donc on tombe direct sur la documentation de la méthode "startswith"! 27/08/2012 13:49:33 testons maitenant! 27/08/2012 13:49:45 on comprend que startswith nous dit si le string commence avec un prefix particulier : 27/08/2012 13:50:13 prenom.startswith('W') 27/08/2012 13:50:21

In [21]: prenom.startswith('W') Out[21]: False 27/08/2012 13:50:34 la méthode nous retourne False... non 'Davin' ne commence pas avec 'W' 27/08/2012 13:50:47

In [22]: prenom.startswith('D') Out[22]: True 27/08/2012 13:50:57 ça peut sembler trivial... 27/08/2012 13:51:07 mais on fait de l'introspection et ça vous permet : 27/08/2012 13:51:16 de découvrir tout ce que vous pouvez faire avec python 27/08/2012 13:51:27 dans votre interpréteur.... 27/08/2012 13:51:38 quand vous avez bien exploré ce que vous pouviez faire : coder le résultat finale du traitement que vous voulez 27/08/2012 13:52:01 dans un script! 27/08/2012 13:52:04 on y arrive 27/08/2012 13:52:07 regardons rapido ce que les listes et dictionnaires ont dans le ventre 27/08/2012 13:52:23 par exemple 27/08/2012 13:52:28

In [23]: l = [1,2,3]

In [24]: l. l.add l.ge l.iter l.repr l.append l.class l.getattribute l.le l.reversed l.count l.contains l.getitem l.len l.rmul l.extend l.delattr l.getslice l.lt l.setattr l.index l.delitem l.gt l.mul l.setitem l.insert l.delslice l.hash l.ne l.setslice l.pop l.doc l.iadd l.new l.sizeof l.remove l.eq l.imul l.reduce l.str l.reverse l.format l.init l.reduce_ex l.subclasshook l.sort 27/08/2012 13:52:48 sort... tient on peut trier une liste... normal c'est ordonné... 27/08/2012 13:53:03 remove, ok on comprend sans lire la doc que c'est pour enlever un élément 27/08/2012 13:53:18 on teste rapido voir si on est pas trop fou : 27/08/2012 13:53:25 l.remove(2) 27/08/2012 13:53:32

In [24]: l.remove(2)

In [25]: l Out[25]: [1, 3] 27/08/2012 13:53:44 ouais ok c'est ce qu'on pensait 27/08/2012 13:53:50 reverse : eh oui, retourne la liste de sens 27/08/2012 13:54:06 .insert... ah, y,a insert et append... 27/08/2012 13:54:19 c'est quoi la différence? 27/08/2012 13:54:24 solution : lire la doc 27/08/2012 13:54:31 27/08/2012 13:54:31 l.append? 27/08/2012 13:54:35 l.insert? 27/08/2012 13:54:40 pour ceux qui n'ont pas ipython 27/08/2012 13:54:48 (et pas de bonne raisons, car ipython est plus interactive que python) 27/08/2012 13:55:02 pour obtenir les noms : dir(l) 27/08/2012 13:55:15 dir = directory des noms... 27/08/2012 13:55:23 pour obtenir l'aide sur un objet ou sa méthode ou attribut) : 27/08/2012 13:55:38 help(l.append) 27/08/2012 13:55:42 dernier truc 27/08/2012 13:55:54 si vous tapez juste le NOM de la méthode... 27/08/2012 13:56:07 sans l'exécuter 27/08/2012 13:56:14 vous obtenez (ex): 27/08/2012 13:56:24

In [26]: l.remove Out[26]: <built-in method remove of list object at 0x967030c> 27/08/2012 13:56:34 l'interpréteur vous dit "remove est une méthode built-in de l'objet list... (et emplacement mémoire) 27/08/2012 13:57:07 pas intéressant 27/08/2012 13:57:10 pour exécuter la méthode 27/08/2012 13:57:16 faut mettre les parentheses 27/08/2012 13:57:23 l.remove() 27/08/2012 13:57:26

In [27]: l.remove()


TypeError Traceback (most recent call last)

/net/nfs-authnss.b.ca.auf/home/davin.baragiotta/<ipython console> in <module>()

TypeError: remove() takes exactly one argument (0 given) 27/08/2012 13:57:36 27/08/2012 13:57:39 ça, c'est une erreur... 27/08/2012 13:57:45 je vous laisse lire... c'est plutôt explicite 27/08/2012 13:57:56 ça se lit comme suit 27/08/2012 13:58:37 on a une erreur de Type 27/08/2012 13:58:48 claudine.mosozi a rejoint le salon 13:59

davin.baragiotta 27/08/2012 13:59:19 la méthode remove() s'attend à avoir un seul argument (un paramètre si on veut) et on lui a rien donné en gros... remove veut absolument la chose à enlever en paramètre sinon il retourne une erreur 27/08/2012 13:59:40 l.remove(1) 27/08/2012 13:59:46

In [28]: l.remove(1)

In [29]: l Out[29]: [3] 27/08/2012 13:59:59 c'est bien d'expérimenter dans l,interpréteur... on veut pas d'erreur dans notre script 27/08/2012 14:00:19 ok, il nous reste une heure.... je vais accéléré un peu si il n'y a pas de questions 27/08/2012 14:00:39 questions? 27/08/2012 14:00:41 photo-valentin.kouadio@auf.org a quitté la salle 14:01 photo-valentin.kouadio a rejoint le salon 14:01

davin.baragiotta 27/08/2012 14:01:32 bon... alors je continue 27/08/2012 14:01:36

arnaud.amelina@auf.org 27/08/2012 14:01:40 balla.fall 27/08/2012 13:50:41 QUESTION : signification de ....: QUESTION : signification de ....: PASS 27/08/2012 13:51:23 QUESTION : signification de ....: except

davin.baragiotta 27/08/2012 14:01:45 ah PASS? 27/08/2012 14:01:56 thierry.tsitoara a rejoint le salon 14:02

davin.baragiotta 27/08/2012 14:02:13 except fait partie des structures de gestion des erreurs... on ne l'utilise pas seul ex.: 27/08/2012 14:02:18 try: l.remove() except TypeError: pass 27/08/2012 14:02:34 (try en première ligne, désolé) 27/08/2012 14:02:47 ça se lit... essaie d'enlever un élément de ma liste même si je ne te passe pas d'argument... 27/08/2012 14:03:06 si y'a une erreur TypeError... on la capte et on fait le traitement suivant : 27/08/2012 14:03:25 pass 27/08/2012 14:03:26 pass = mot clé... pour dire on fait rien 27/08/2012 14:03:34 utiliser pass le moins possible 27/08/2012 14:04:01 on l'utilise pour commencer un truc et y revenir plus tard 27/08/2012 14:04:11 ex.: 27/08/2012 14:04:12 je définis une fonction que je ne termine pas : 27/08/2012 14:04:25

def suppression_indesirables(): pass 27/08/2012 14:04:44

arnaud.amelina@auf.org 27/08/2012 14:05:05 n/a

davin.baragiotta 27/08/2012 14:05:17 dans mon code, on voit bien que je veux créer une fonction qui supprime les indésirables... mais je ne sais pas quoi coder, donc je mets pass 27/08/2012 14:05:18 voilà 27/08/2012 14:05:20 je continue 27/08/2012 14:05:24 on est rendu à "introspection" 27/08/2012 14:05:32 je vous invite à coder un peu de données 27/08/2012 14:05:47 pour le plaisir de sentir du python dans les doigts 27/08/2012 14:05:57 nom = "Davin Baragiotta" 27/08/2012 14:06:16 prenom, nom = nom.split() 27/08/2012 14:06:27 nom.split? 27/08/2012 14:06:48 testez le résultat : 27/08/2012 14:06:58 prenom 27/08/2012 14:07:00 nom 27/08/2012 14:07:01 aaaaah... votre administration veut que tous les noms de familles soient majusucules 27/08/2012 14:07:20 car ils savent pas discerner le prénom du nom? 27/08/2012 14:07:31 (c'est du vécu, je le jure) 27/08/2012 14:07:38 nom.upper() 27/08/2012 14:07:43 vous pouvez vérifier si la valeur est altérée ou pas 27/08/2012 14:08:01

In [30]: nom = 'Baragiotta'

In [31]: nom.upper() Out[31]: 'BARAGIOTTA'

In [32]: nom Out[32]: 'Baragiotta' 27/08/2012 14:08:23 ah tiens... non 27/08/2012 14:08:27 c'est un service à la volée que de le mettre en majuscule... mais le nom original reste 27/08/2012 14:08:43 un truc pas mal à savoir c'est le .join() 27/08/2012 14:09:07 sur un string 27/08/2012 14:09:12 on peut utiliser join 27/08/2012 14:09:17 pour que ce string serve de jointure à des éléments d'une collection (une liste disons) 27/08/2012 14:09:38 exemple : 27/08/2012 14:09:43 '.'.join([1,2,3]) 27/08/2012 14:09:53 la liste d'entiers 1, 2, 3 devrait être réunies par des points 27/08/2012 14:10:10 mais 27/08/2012 14:10:13

In [33]: '.'.join([1,2,3])


TypeError Traceback (most recent call last)

/net/nfs-authnss.b.ca.auf/home/davin.baragiotta/<ipython console> in <module>()

TypeError: sequence item 0: expected string, int found 27/08/2012 14:10:29 python est fortement typé 27/08/2012 14:10:34 on relie pas des entiers avec des strings 27/08/2012 14:10:44 '.'.join(['davin','moussa','eric']) 27/08/2012 14:11:08

In [34]: '.'.join(['davin','moussa','eric']) Out[34]: 'davin.moussa.eric' 27/08/2012 14:11:24 donne effectivement une chaine 27/08/2012 14:11:31 c'est peut-être pas intuitif... le .join()... mais c,est bon à savoir 27/08/2012 14:11:49 Conteneurs 27/08/2012 14:12:09 il faut savoir que les conteneurs (liste, tuple, dictionnaires...) 27/08/2012 14:12:21 ... peuvent contenir des trucs hétérogènes 27/08/2012 14:12:34 l = ['davin', 1, False] 27/08/2012 14:12:43 c'est légal 27/08/2012 14:12:47 liste de string, entier et booléen 27/08/2012 14:13:04 aussi, pour accéder à un item d'un conteneur 27/08/2012 14:13:22 on peut utiliser son index numérique 27/08/2012 14:13:30 0 = premier item 27/08/2012 14:13:34 l[0] 27/08/2012 14:13:38

In [35]: l = ['davin', 1, False]

In [36]: l[0] Out[36]: 'davin'

In [37]: l[1] Out[37]: 1

In [38]: l[2] Out[38]: False 27/08/2012 14:14:02 il existe aussi le slicing... 27/08/2012 14:14:15 c'est une notion pour retourne une "tranche" de valeurs... 27/08/2012 14:14:27 je vous laisse explorer seul, plus tard 27/08/2012 14:14:37 l[0:1] 27/08/2012 14:14:41

In [42]: l[0:2] Out[42]: ['davin', 1] 27/08/2012 14:15:13 Itérations 27/08/2012 14:15:21 pour itérer, while existe 27/08/2012 14:15:32 mais c'est pas top 27/08/2012 14:15:38 exemple : 27/08/2012 14:15:42

In [43]: annee = 2012

In [44]: while annee <= 2015: ....: print annee ....: annee = annee + 1 ....: ....: 2012 2013 2014 2015 27/08/2012 14:16:17 rappel : pas d'accolade {} pour le bloc... indenter 27/08/2012 14:16:41 le top = for 27/08/2012 14:16:58 pour itérer 27/08/2012 14:17:01

In [47]: for i in range(2012, 2016): ....: print i ....: ....: 2012 2013 2014 2015 27/08/2012 14:17:49 remarquez la beauté du in 27/08/2012 14:18:02 "in" 27/08/2012 14:18:06 ça se lit : pour chaque élément dans le conteneur itérable... fait ceci (ici = print) 27/08/2012 14:18:29 le "in" existe aussi dans un autre contexte 27/08/2012 14:18:46 pour tester l'appartenance à un ensemble 27/08/2012 14:18:57 je veux dire... une collection (pas nécessaire un set() ) 27/08/2012 14:19:15

In [48]: l = [1,2,3]

In [49]: 2 in l Out[49]: True

In [50]: 5 in l Out[50]: False 27/08/2012 14:19:37 ahaha! 27/08/2012 14:19:39 ça commence à être génial comme syntaxe! 27/08/2012 14:19:48 ce qui nous amène au conditionnel pour tester ça 27/08/2012 14:20:05 les conditionnel... pas grand chose à dire : 27/08/2012 14:20:12 if, elif et else 27/08/2012 14:20:19 encore une fois, pas de {} 27/08/2012 14:20:25 et pas de endif non plus 27/08/2012 14:20:32

In [51]: liste = range(6)

In [52]: if 5 in liste: ....: print 'hourra 5' ....: elif 4 in liste: ....: print 'hourra 4' ....: else: ....: print 'pas hourra' ....: hourra 5 27/08/2012 14:20:57 on peut tester la valeur de range(6) tout seul... dans interpréteur : 27/08/2012 14:21:19

In [53]: range(6) Out[53]: [0, 1, 2, 3, 4, 5] 27/08/2012 14:21:32 range est utilisé notamment pour contrôler nombre itération dans des for... 27/08/2012 14:21:58 ... mais ici je l'utilise juste pour me faire une liste rapido 27/08/2012 14:22:09 on voit que 5 est dans la liste créée par range(6) 27/08/2012 14:22:25 donc le test "5 in liste" retourne vrai 27/08/2012 14:22:40 Fichiers 27/08/2012 14:23:00 c'est très facile d'ouvrir un fichier et parser son contenu en python 27/08/2012 14:23:17 créer un fichier dans le répertoire où vous avez lancé votre terminal 27/08/2012 14:23:34 (dans votre home, par exemple) 27/08/2012 14:23:44 un fichier texte qu'on va appeller 'texte.txt' 27/08/2012 14:23:57 entre des lignes de texte... 27/08/2012 14:24:04 moi j'ai ça : texte.txt J'aime Python et la communauté tech de l'AUF. 27/08/2012 14:24:44 pour parser les lignes de ce fichier : 27/08/2012 14:24:59

In [56]: for line in f.readlines(): print line, f.close() ....: ....: J'aime Python et la communauté tech de l'AUF.

27/08/2012 14:25:45 on voit que chacune des lignes a été imprimée... 27/08/2012 14:26:04 hey... vous comprenez la puissance du truc? 27/08/2012 14:26:14 si vous avez des données .csv, à tout hasard... 27/08/2012 14:26:26 et que vous faites une split sur a ligne et unpackez dans les variables 27/08/2012 14:26:48 on essaie? 27/08/2012 14:26:58 go... 27/08/2012 14:27:06 contenu de texte.txt : 'Davin', 'Baragiotta' 'Victor', 'Bruneau' 'Franck', 'Kouyami' 27/08/2012 14:27:45 pensez et explorez commencer spliter sur la virgule... et stocker le prenom et le nom dans 2 variables séparées... 27/08/2012 14:28:20 des questions? 27/08/2012 14:29:08 (pendant qu'on cherche solutionnaire ) 27/08/2012 14:29:20 ok... pas de question 27/08/2012 14:30:56 solution : In [60]: f = open('texte.txt')

In [61]: for line in f.readlines(): ....: prenom, nom = line.split() ....: ....: print prenom ....: print nom ....: ....: 'Davin', 'Baragiotta' 'Victor', 'Bruneau' 'Franck', 'Kouyami' 27/08/2012 14:31:00 au lieu de printer la ligne comme on faisait, on la split 27/08/2012 14:31:15 lisez la doc de split... mais ça fait le boulot qu'on veut (sépare sur virgule ou espace) 27/08/2012 14:31:36 ensuite j'imprime les variables 27/08/2012 14:31:50 Formattage de chaine 27/08/2012 14:31:55 on pourrait faire un truc plus joli avec les chaines 27/08/2012 14:32:06 lui dire bonjour 27/08/2012 14:32:17 voici la syntaxe : 27/08/2012 14:32:21 "Bonjour %s %s" % (prenom, nom.upper()) 27/08/2012 14:32:50 %s = un placeholder... disons une variable pour la string... "s" veut dire qu'on s'attend à ce que la valeur à insérer soit elle même une string... 27/08/2012 14:33:25 %d = entier 27/08/2012 14:33:32 on voit qu'on a 2 %s dans "Bonjour %s %s" 27/08/2012 14:33:49 ensuite on a un % seul 27/08/2012 14:33:54 ça se lit ainsi : 27/08/2012 14:34:01 prend les valeurs à droite de % 27/08/2012 14:34:10 pour les mettre dans le string de gauche 27/08/2012 14:34:16 chaque variable, dans l'ordre, va remplacer la frime dans le placeholder 27/08/2012 14:34:39 en fait, je m'attends à avoir : 27/08/2012 14:34:49 "Bonjour Davin BARAGIOTTA" 27/08/2012 14:34:56 preuve : 27/08/2012 14:34:58

In [65]: f = open('texte.txt')

In [66]: for line in f.readlines(): prenom, nom = line.split() print "Bonjour %s %s" % (prenom, nom.upper()) ....: ....: Bonjour 'Davin', 'BARAGIOTTA' Bonjour 'Victor', 'BRUNEAU' Bonjour 'Franck', 'KOUYAMI' 27/08/2012 14:35:53 bon seul truc laid dont je viens de m'apercevoir c'est qu'on garde les quote ' venant du fichier... 27/08/2012 14:36:26 on pourrait utiliser .trim() 27/08/2012 14:36:34 des questions avant d'aller plus loin? 27/08/2012 14:36:39 eddy.andriamanantena a quitté la salle 14:36 eddy.andriamanantena a rejoint le salon 14:37 moussa.nombre a rejoint le salon 14:37

arnaud.amelina@auf.org 27/08/2012 14:38:00 Oui

davin.baragiotta 27/08/2012 14:38:03 ok, on termine aevc l'écriture de script ah? 27/08/2012 14:38:04 j'écoute 27/08/2012 14:38:06

arnaud.amelina@auf.org 27/08/2012 14:38:33 C'est bon tu as répondu dans l'autre espace

davin.baragiotta 27/08/2012 14:38:37 ok

arnaud.amelina@auf.org 27/08/2012 14:38:37 Continue donc

davin.baragiotta 27/08/2012 14:38:44 un script ce n'est absolument rien d'autre que du code python dans un fichier... fichier qu'on va exécuter 27/08/2012 14:39:02 on vient de faire du code python... mais dans l'interpréteur 27/08/2012 14:39:13 s'agit de retranscrire le code intéressant qu'on vient de découvrir interactivement grace à introspection 27/08/2012 14:39:45 dans le support à l'atelier, je donne un exemple de script plus complet 27/08/2012 14:40:01 mais codons simplement ce qu'on vient de faire 27/08/2012 14:40:11 créons un fichier : script.py 27/08/2012 14:40:22 à côté de texte.txt (sur votre home, en principe) 27/08/2012 14:40:36 voici mon code : 27/08/2012 14:41:16 script.py : f = open('texte.txt')

for line in f.readlines(): prenom, nom = line.split() print "Bonjour %s %s" % (prenom, nom.upper()) 27/08/2012 14:41:23 ce script ouvre le fichier texte.txt et parse chacune de ses lignes, splite son contenu et imprime le prenom et nom dans une chaine formattée... 27/08/2012 14:41:58 ce script aurait pu faire plein de truc : stocker les noms dans une DB, par exemple 27/08/2012 14:42:14 mais essayons maintenant d'exécuter ce script 27/08/2012 14:42:25 ipython : run script 27/08/2012 14:42:34 ou 27/08/2012 14:42:36

run script.py 27/08/2012 14:42:40 python : $ python script.py 27/08/2012 14:42:53 (dépendamment de votre interpréteur) 27/08/2012 14:43:03 on y va 27/08/2012 14:43:27 voici : 27/08/2012 14:43:28

In [69]: run script Bonjour 'Davin', 'BARAGIOTTA' Bonjour 'Victor', 'BRUNEAU' Bonjour 'Franck', 'KOUYAMI' 27/08/2012 14:43:39 tadaaaaaaaaaaaaaaaam! 27/08/2012 14:43:43 voici votre premier script python 27/08/2012 14:43:50 (ou peut-être pas ) 27/08/2012 14:43:53 questions? 27/08/2012 14:44:13

doan.manh.ha 27/08/2012 14:44:17 ah oui ça marche 27/08/2012 14:44:28

davin.baragiotta 27/08/2012 14:44:34 génial! sérieusement... vous êtes maintenant très puissant 27/08/2012 14:44:44 pourquoi? 27/08/2012 14:44:47 car vous avez un langage de "haut niveau" 27/08/2012 14:45:01 qui peut donc faire des traitements plus complexes que bash mais de manière plus lisible 27/08/2012 14:45:23 attention : 27/08/2012 14:45:29 continuez d'utiliser bash partout où il fait bien le boulot 27/08/2012 14:45:41 mais pour des trucs de plus haut niveau, vous avez Python 27/08/2012 14:46:04 ce qui nous reste à voir 27/08/2012 14:46:10 en 10 minutes max : 27/08/2012 14:46:16 fonctions et import 27/08/2012 14:46:27 fonctions : je vous laisse voir à partir de la doc de l,atelier et doc officielle 27/08/2012 14:46:47 en fait, fait juste savoir c'est quoi une fonction en informatique 27/08/2012 14:46:59 ce qui est particulier, et cool en Python 27/08/2012 14:47:07 c'est les *args et **kwargs : 27/08/2012 14:47:16 des varaibles spéciales dans la déclaration de la fonction 27/08/2012 14:47:28 pour "ramasser" tous les paramètres qu'on pourrait lui passer 27/08/2012 14:47:41 ce qui donner des trucs comme : 27/08/2012 14:47:55 coucou('Paul') 27/08/2012 14:48:08 coucou('Paul', 'Lemay') 27/08/2012 14:48:16 et c'est légal... 27/08/2012 14:48:21 du polymorphisme de fonction, en quelque sorte 27/08/2012 14:48:30 import 27/08/2012 14:48:34 c'est là que ça se joue 27/08/2012 14:48:39 vous en voulez pas réinventer la roue 27/08/2012 14:48:49 vous voulez.... importer le code des autres 27/08/2012 14:48:57 voire le vôtre 27/08/2012 14:49:00 allez voir la doc de la librairie standar, pour le plaisir 27/08/2012 14:49:16 pour voir tous les modules qui s'offre à vous (sans rien à avoir à installer... ça vient avec Python) 27/08/2012 14:49:35 ça ferait l,objet d'une atelier plus avancé : 27/08/2012 14:49:51 http://wiki.auf.org/wikiteki/Ateliers/ 27/08/2012 14:50:04 http://wiki.auf.org/wikiteki/Ateliers/2012-02-24/Python 27/08/2012 14:50:10 vous y verrez des exemples (venant de JC) pour l'admin système 27/08/2012 14:50:26 mais pour de plus amples discussions : Python vs Bash... rendez-vous sur liste tech avec JC 27/08/2012 14:50:43 (moi je ne suis pas admin syst) 27/08/2012 14:50:48 27/08/2012 14:50:49 conclusion : 27/08/2012 14:50:56 avec les import... vous êtes royal 27/08/2012 14:51:08 import urlllib 27/08/2012 14:51:12 vous accédez au web 27/08/2012 14:51:18 pour importer vos propres trucs 27/08/2012 14:51:36 shafeek.sumser a quitté la salle 14:51

davin.baragiotta 27/08/2012 14:51:50 lisez la section "modules" de l,atelier et expériementer dans l'interpréteur tran.xuan.huy a quitté la salle 14:51

davin.baragiotta 27/08/2012 14:51:57 vous importez vos fonctions vous codez une fois... et utilisez N fois 27/08/2012 14:52:06 finalement... vous voudriez utiliser des modules qui ne viennent pas avec le langage et que vous N,avez pas coder? 27/08/2012 14:52:35 vous avez un exemple à la fin de cet atelier 27/08/2012 14:52:45 on vous demander de parser un flux RSS 27/08/2012 14:52:52 essayez-le 27/08/2012 14:53:00 un petit tour sur le web et on trouve feedparser 27/08/2012 14:53:09 on lit sa doc 27/08/2012 14:53:14 on expérimente dans interpréteur 27/08/2012 14:53:20 on trouve notre solution 27/08/2012 14:53:24 ... 27/08/2012 14:53:25 on la code dans un script et le tour est joué 27/08/2012 14:53:32 tran.xuan.huy a rejoint le salon 14:53

davin.baragiotta 27/08/2012 14:53:41 c'est comme ça qu'on travaille avec Python fin de la fin... pour stocker dans une DB comme un pro 27/08/2012 14:53:58 regardez : 27/08/2012 14:54:03 import sqlite3 27/08/2012 14:54:08 ça vient avec python 27/08/2012 14:54:13 http://docs.python.org/library/ 27/08/2012 14:54:32 vous trouverez donc dans library 27/08/2012 14:54:37 http://docs.python.org/library/sqlite3.html 27/08/2012 14:54:49 tadam... 27/08/2012 14:54:52 27/08/2012 14:54:55 mais vite, vous voudrez faire plus... 27/08/2012 14:55:04 et Django est là pour vous 27/08/2012 14:55:10 l'équipe SI aussi d,ailleurs 27/08/2012 14:55:20 je vous laisse regarder l'horaire pour les ateliers Django 27/08/2012 14:55:30

arnaud.amelina@auf.org 27/08/2012 14:55:33 Il reste 5 mn

davin.baragiotta 27/08/2012 14:55:37 et je suis là opur vos questions


FIN ATELIER : QUESTIONS


27/08/2012 14:55:55

arnaud.amelina@auf.org 27/08/2012 14:56:10 Formidable Darvin Legrand 27/08/2012 14:56:20 Merci torrent applaudissement !!! 27/08/2012 14:56:45

davin.baragiotta 27/08/2012 14:56:53 ahaha

arnaud.amelina@auf.org 27/08/2012 14:57:44 On a eu 28 Participants 29 y compris Formateur

davin.baragiotta 27/08/2012 14:57:56 génial

tran.xuan.huy 27/08/2012 14:58:11 je me demande si python est utile pour les techniciens de l'auf?

davin.baragiotta 27/08/2012 14:58:12 j'en profite (avant d'aller au petit coin) pour faire la pub du prochain atelier : Git : versionner votre code source... donc vos scripts python 27/08/2012 14:58:25

arnaud.amelina@auf.org 27/08/2012 14:58:26 C'est un Franc succès là je suis sûr que tout le monde est content ceux qui ne le sont pas n'aont qu'à le manifester de suite

davin.baragiotta 27/08/2012 14:58:34 ahaha


FIN ATELIER Python


27/08/2012 14:58:46

arnaud.amelina@auf.org 27/08/2012 14:58:59 Ouep Donc FIN ATELIER PYTHON !!!

david.violette 27/08/2012 14:59:07 Merci davin

davin.baragiotta 27/08/2012 14:59:19 plaisir campione

arnaud.amelina@auf.org 27/08/2012 15:00:15 Grand Merci Davin !!! Toute l'équipe d'organisation te félicite