## page was renamed from Ateliers/Python/2012-08-27 ## page was renamed from Ateliers/Python/Deroulement == Transciption du 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 {{{#!highlight irc 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 /* */ 27/08/2012 13:12:15 en python 27/08/2012 13:12:18 ni de // 27/08/2012 13:12:20 aussi, vous avez remarqué qu'on ne met pas de $ devant la variable 27/08/2012 13:12:37 fianlement... pas de ; en fin de ligne 27/08/2012 13:12:53 ça fait du code plus facile à lire 27/08/2012 13:13:03 ah oui... pas besoin non plus des {} pour les blocs de code 27/08/2012 13:13:22 donc une fonctino (on y reviendra) ça s'écrit comme ça : 27/08/2012 13:13:35 def coucou(): return 27/08/2012 13:13:44 très important : c'est l'indentation qui nous dispense des {} 27/08/2012 13:14:04 en Python l'indentation est obligatoire 27/08/2012 13:14:11 par convention... on utilise 4 espaces... 27/08/2012 13:14:23 *pas* des tabs.... 4 espaces 27/08/2012 13:14:29 niry.andriambelo a rejoint le salon 13:14 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]: 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: String Form: 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]: 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/ in () 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/ in () 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