Projet / SemaineTech / 2013 / Ateliers / Python / Archive

ARCHIVE ATELIER Python

   1 (14:31:01) davin.baragiotta: ------------------------------------- DEBUT Atelier Python -------------------------
   2 (14:32:19) davin.baragiotta: bonjour à tous
   3 (14:32:27) davin.baragiotta: vous devriez avoir lu la page de l'atelier
   4 (14:32:28) davin.baragiotta: http://wiki.auf.org/wikiteki/Projet/SemaineTech/2013/Ateliers/Python
   5 (14:32:46) davin.baragiotta: le support de présentation est ici :
   6 (14:32:47) davin.baragiotta: http://wiki.auf.org/wikiteki/Ateliers/Python/Base/Support
   7 (14:32:58) davin.baragiotta: vous devriez avoir 3 fenêtres d'ouvertes :
   8 (14:33:03) stefano.amekoudi [stefano.amekoudi@auf.org/CNF Dakar] entered the room.
   9 (14:33:07) davin.baragiotta: 1. jabber salon formation (ici) ;)
  10 (14:33:14) davin.baragiotta: 2. support de présentation
  11 (14:33:17) davin.baragiotta: 3. un terminal
  12 (14:33:36) davin.baragiotta: Notre objectif aujourd'hui est de mettre les mains dans Python
  13 (14:33:57) davin.baragiotta: y'a 35 personnes dans le salon, mais seulement 5-6 ont dit qu'ils suivaient :
  14 (14:34:21) davin.baragiotta: j'espère qu'on pourra aller vite alors pour arriver à l'exercice
  15 (14:34:46) davin.baragiotta: cet atelier est le même que celui de l'an dernier (mais je voudrais qu'on fasse exercice)
  16 (14:34:58) davin.baragiotta: ok c'est parti
  17 (14:35:01) davin.baragiotta: INTRODUCTION
  18 (14:35:10) davin.baragiotta: quand on code en Python
  19 (14:35:28) davin.baragiotta: on expérimente souvent ce qu'on va coder dans l'interpréteur
  20 (14:35:49) davin.baragiotta: et ensuite, on écrit le script final dans un fichier
  21 (14:35:52) davin.baragiotta: c'est ce qu'on fera
  22 (14:36:09) davin.baragiotta: j'ai mis dans le support de formation, les liens vers la documentation officielle
  23 (14:36:28) davin.baragiotta: NOTIONS DE BASE
  24 (14:36:35) davin.baragiotta: INTERPRÉTEUR
  25 (14:36:45) davin.baragiotta: Python est un langage interprété
  26 (14:37:00) davin.baragiotta: on n'a pas besoin de le compiler (comme en Java) pour l'exécuter
  27 (14:37:09) davin.baragiotta: c'est pratique pendant le développement
  28 (14:37:28) davin.baragiotta: ce qu'on écrit comme code, est interprété par.... l'interpréteur
  29 (14:37:41) fred-juvenal.namsionou left the room.
  30 (14:37:48) davin.baragiotta: pour lancer l'interpréteur, tapez : "python" dans votre terminal
  31 (14:38:00) davin.baragiotta: la version de votre Python s'affiche
  32 (14:38:00) shafeek.sumser left the room.
  33 (14:38:08) davin.baragiotta: et un "prompt" >>>
  34 (14:38:23) davin.baragiotta: moi je préfère travailler avec l'interpréteur ipython
  35 (14:38:36) davin.baragiotta: le "i" devant veut dire interactif
  36 (14:38:45) davin.baragiotta: cet atelier utilisera ipython
  37 (14:38:51) davin.baragiotta: pour l'installer, voir la page de l'atelier
  38 (14:38:59) davin.baragiotta: 
  39 sudo aptitude install ipython
  40 (14:39:02) fawaz.tairou [fawaz.tairou@auf.org/Bureau] entered the room.
  41 (14:39:26) davin.baragiotta: ipython facilite aussi l'introspection... on va y revenir
  42 (14:39:30) davin.baragiotta: SYNTAXE
  43 (14:39:35) davin.baragiotta: Python est magnifique
  44 (14:39:37) davin.baragiotta: beau
  45 (14:39:39) davin.baragiotta: doux
  46 (14:39:41) davin.baragiotta: et puissant
  47 (14:39:42) davin.baragiotta: :)
  48 (14:39:58) davin.baragiotta: la syntaxe participe beaucoup a sa beauté
  49 (14:40:17) davin.baragiotta: pour sa puissance... j'aurais dû l'ajouter en intro :
  50 (14:40:31) davin.baragiotta: Python est un langage utiliser dans presque tous les domaines imaginables
  51 (14:40:42) davin.baragiotta: souvent utiliser comme passerelle entre langages
  52 (14:41:01) davin.baragiotta: il est le langage privilégié, de facto, par la communauté universitaire
  53 (14:41:17) davin.baragiotta: plein d'outils existent pour faire de la science avec Python (on pourra en parler plus tard)
  54 (14:41:27) davin.baragiotta: revenons à la syntaxe
  55 (14:41:48) davin.baragiotta: les commentaires se font seulement avec #
  56 (14:41:54) davin.baragiotta: pas de /* */ ni de //
  57 (14:42:06) davin.baragiotta: les variables? on n'utilise pas de $ devant
  58 (14:42:16) davin.baragiotta: à la fin des lignes d'instructions.... pas de ;
  59 (14:42:29) davin.baragiotta: aussi.... pas de {} pour les blocs d'instructions
  60 (14:42:52) davin.baragiotta: ça c,est possible par un usage obligatoire de l'indentation
  61 (14:43:23) davin.baragiotta: donc au final, Python est aéré, donc lisible, donc plus facilement maintenable
  62 (14:43:29) davin.baragiotta: ok, assez parlé
  63 (14:43:40) davin.baragiotta: jouons ensemble dans l'interpréteur
  64 (14:43:44) davin.baragiotta: lancez ipython
  65 (14:44:03) davin.baragiotta: davin.baragiotta@u-db:~$ ipython
  66 Python 2.6.5 (r265:79063, Oct 1 2012, 22:07:21) 
  67 Type "copyright", "credits" or "license" for more information.
  68 
  69 IPython 0.10 -- An enhanced Interactive Python.
  70 ? -> Introduction and overview of IPython's features.
  71 %quickref -> Quick reference.
  72 help -> Python's own help system.
  73 object? -> Details about 'object'. ?object also works, ?? prints more.
  74 
  75 In [1]: 
  76 
  77 (14:44:30) davin.baragiotta: ah oui... dernier truc sur la syntaxe : 
  78 (14:44:47) davin.baragiotta: Python a une stylistique largement utilisée dans sa communauté
  79 (14:44:50) davin.baragiotta: PEP8
  80 (14:44:56) davin.baragiotta: http://www.python.org/dev/peps/pep-0008/
  81 (14:45:16) davin.baragiotta: PEP = Python Enhencement Proposal (un genre de RFC)
  82 (14:45:38) davin.baragiotta: lisez la à temps perdu... ça vous évitera un jour des "ton code n'est pas PEP8" ;)
  83 (14:45:50) davin.baragiotta: ok, ipythyon est lancé
  84 (14:46:07) davin.baragiotta: on voit la version de Python et la version de ipython
  85 (14:46:22) davin.baragiotta: Python vit actuellement avec 2 séries en parallèle
  86 (14:46:27) davin.baragiotta: 2.x et 3.x
  87 (14:46:40) davin.baragiotta: on travaille encore avec le 2.x même si 3.x = le futur
  88 (14:47:02) davin.baragiotta: ok jouons dans interpréteur pour découvrir les variables
  89 (14:47:05) davin.baragiotta: VARIABLES
  90 (14:47:32) davin.baragiotta: les variables sont des *noms* qui *référencent* des *valeurs*
  91 (14:47:45) davin.baragiotta: In [1]: a = 12
  92 
  93 (14:47:59) davin.baragiotta: la variable de nom "a" référence la valeur 12
  94 (14:48:20) davin.baragiotta: In [2]: b = a
  95 
  96 In [3]: b
  97 Out[3]: 12
  98 
  99 (14:48:47) davin.baragiotta: si on dit que b = a.... Python ne copie pas la valeur 12 dans b...
 100 (14:49:00) davin.baragiotta: b point (référence) 12 comme a le faisait
 101 (14:49:24) davin.baragiotta: si on utilise une fonction built-in appelé id() qui nous montre l,emplacement en mémoire de la valeur
 102 (14:49:29) davin.baragiotta: on voit que c'est la même chose
 103 (14:49:42) davin.baragiotta: In [4]: id(a)
 104 Out[4]: 168455396
 105 
 106 In [5]: id(b)
 107 Out[5]: 168455396
 108 
 109 
 110 (14:50:08) davin.baragiotta: TYPES
 111 (14:50:26) davin.baragiotta: créons ensemble chacun des types de base de Python
 112 (14:50:33) davin.baragiotta: n = None
 113 
 114 (14:50:57) davin.baragiotta: None est un type spécial... comme NULL dans les bases de données... représente "rien"
 115 (14:51:14) davin.baragiotta: b = True # ou b = False
 116 (14:51:27) davin.baragiotta: Boolean... on connait tous
 117 (14:51:35) davin.baragiotta: remarquez la syntaxe : faut une majuscule
 118 (14:51:50) davin.baragiotta: none, true, false : ça n'existe pas en Python
 119 (14:51:58) davin.baragiotta: Python est sensible à la casse
 120 (14:52:18) davin.baragiotta: on a pour le numérique des entiers et des floats
 121 (14:52:22) davin.baragiotta: i = 15
 122 (14:52:26) davin.baragiotta: f = 15.5
 123 (14:52:56) davin.baragiotta: dans la vraie vie... ils peuvent se comporter bizarrement dans le calcul (les floats en particuliers)
 124 (14:53:34) davin.baragiotta: on va préférer utiliser un type (qui n'est pas "de base") qui s'appelle Decimal (mais il est dans le standard library : il vient avec le langage Python)
 125 (14:53:50) davin.baragiotta: finalement on a plusieurs chaînes de caractère
 126 (14:54:10) davin.baragiotta: "string"
 127 (14:54:14) davin.baragiotta: u"unicode"
 128 (14:54:20) davin.baragiotta: r"raw"
 129 (14:54:26) davin.baragiotta: noté la lettre mise devant
 130 (14:54:57) davin.baragiotta: unicode est pour dire que les caractères de la chaîne sont de l'encodage unicode
 131 (14:55:28) davin.baragiotta: raw = caractères bruts, non interprétés... en gros y'a pas de \ pour escaping
 132 (14:55:38) davin.baragiotta: concrètement : on utilise ""
 133 (14:55:46) davin.baragiotta: sauf pour unicode
 134 (14:56:19) davin.baragiotta: finalement on va voir les types de variables de base qui sont des "conteneurs"
 135 (14:56:23) davin.baragiotta: es questions avant?
 136 (14:57:19) davin.baragiotta: bon on continue
 137 (14:57:27) yemen.sayour: (14:57:18) stefano.amekoudi: Question : Dans la vraie vie, quand préférer r"raw" à u"unicode" ?
 138 (14:57:57) davin.baragiotta: raw = dans de rares, cas... par exemple pour les regex (expressions régulières)
 139 (14:58:11) davin.baragiotta: on le voit dans Django, pour les règles d'URL
 140 (14:58:40) davin.baragiotta: (on veut vérifier si l'URL suit un patron régulier... donc on déclare ce patron en "raw")
 141 (14:59:33) davin.baragiotta: ok, les conteneurs... le plaisir commence pour vrai, car on monte en complexité
 142 (14:59:38) davin.baragiotta: une liste
 143 (14:59:41) davin.baragiotta: l = []
 144 (14:59:57) davin.baragiotta: c'est une liste ordonnée d'éléments
 145 (15:00:04) davin.baragiotta: l = [1,2,3,4]
 146 (15:00:12) davin.baragiotta: l = [1,2,2,3,4]
 147 (15:00:19) davin.baragiotta: qui peuvent être redondants
 148 (15:00:28) davin.baragiotta: (j'ai deux fois 2 ici)
 149 (15:00:37) davin.baragiotta: et différents entre eux :
 150 (15:00:52) davin.baragiotta: l = [1, 2, 'deux', 3]
 151 (15:01:10) davin.baragiotta: (pour être PEP8, mettez une espace après la virgule, c'est plus lisible) ;)
 152 (15:01:28) davin.baragiotta: on voit dans mon exemple que j'ai des entiers et un strings
 153 (15:01:29) davin.baragiotta: ah oui
 154 (15:01:51) davin.baragiotta: string : soit avec simple quote ou double quote : 'string' ou "string"
 155 (15:02:19) davin.baragiotta: on a même l'usage de triple pour les chaînes multilignes....
 156 (15:02:57) davin.baragiotta: """"Une chaîne multilignes
 157 sur deux lignes
 158 """
 159 (15:03:07) davin.baragiotta: on voit ça dans la documentation : docstring
 160 (15:03:28) davin.baragiotta: car en Python, on documente les fonctions (par exemple), dans les fonctions
 161 (15:03:40) davin.baragiotta: bon, on a vu grosso modo les listes
 162 (15:03:49) davin.baragiotta: voyons les tuples
 163 (15:03:51) davin.baragiotta: t = ()
 164 (15:04:09) davin.baragiotta: un tuple c'est une liste..... immuable
 165 (15:04:12) davin.baragiotta: retenez ça
 166 (15:04:39) davin.baragiotta: à quoi ça sert? ben... si tu sais que tu ne modifieras pas la liste, c'est plus rapide (en terme de computation)
 167 (15:05:04) davin.baragiotta: un exemple concret ?
 168 (15:05:13) davin.baragiotta: des coordonnées... d'une ville disons
 169 (15:05:27) davin.baragiotta: montreal = (42, 57)
 170 (15:05:48) davin.baragiotta: où 42 = longitude, et l,autre latitude
 171 (15:05:59) davin.baragiotta: (exemple fictif hein!)
 172 (15:06:26) davin.baragiotta: sachez ce que les tuples existent... car vous le verrez dans le code que vous lirez
 173 (15:06:35) davin.baragiotta: vous apprendrez à L'utiliser avec le temps...
 174 (15:06:45) davin.baragiotta: autre conteneur :
 175 (15:06:47) davin.baragiotta: dictionnaire
 176 (15:06:55) davin.baragiotta: d = {}
 177 (15:07:22) davin.baragiotta: un dictionnaire est un conteneur d'associations "clé, valeur"
 178 (15:07:26) davin.baragiotta: syntaxe :
 179 (15:07:47) davin.baragiotta: davin = {'prenom':'Davin', 'nom':'Baragiotta'}
 180 (15:07:59) davin.baragiotta: les clés sont uniques...
 181 (15:08:08) davin.baragiotta: j'ai pas 2 prénoms... 
 182 (15:08:37) davin.baragiotta: c'est comme dans un dictionnaire : l'entrée n'est là qu'une fois (même si elle a plusieurs définitions ;) )
 183 (15:08:58) davin.baragiotta: les valeurs peuvent évidemment être de n'importe quel type
 184 (15:09:12) davin.baragiotta: la`'Davin' et 'Baragiotta' sont des strings...
 185 (15:09:21) davin.baragiotta: mais j'aurais pu mettre 'age':38
 186 (15:09:27) davin.baragiotta: (ouaip... depuis hier!)
 187 (15:09:49) davin.baragiotta: les clés, elles aussi doivent être de plusieurs type
 188 (15:09:52) davin.baragiotta: mais
 189 (15:10:11) davin.baragiotta: pour qu'on puisse vérifier si sont unique, elles doivent être immuables
 190 (15:10:25) davin.baragiotta: tiens essayons ceci :
 191 (15:10:36) davin.baragiotta: d = {15:'Davin'}
 192 (15:10:57) davin.baragiotta: ça marche
 193 (15:11:24) davin.baragiotta: j'ai utilisé l'entier 15 pour index
 194 (15:11:26) davin.baragiotta: ok
 195 (15:11:32) davin.baragiotta: dernier type
 196 (15:11:35) davin.baragiotta: les ensembles
 197 (15:11:37) davin.baragiotta: j'aime!
 198 (15:11:49) davin.baragiotta: en anglais, un ensemble est un "set"
 199 (15:12:34) davin.baragiotta: comme en mathématique... un ensemble est non-ordonné... et ses éléments sont uniques
 200 (15:13:00) davin.baragiotta: ex. en Français... si on dit l'ensemble des Techs de l'AUF... c'est débile de me citer deux fois!
 201 (15:13:15) davin.baragiotta: créons une liste avec des éléments redondants
 202 (15:13:29) davin.baragiotta: l = [1, 2, 2, 3, 3, 3]
 203 (15:13:57) davin.baragiotta: faisons maintenant un ensemble de cette liste
 204 (15:13:59) davin.baragiotta: set(l)
 205 (15:14:23) davin.baragiotta: In [11]: l = [1, 2, 2, 3, 3, 3]
 206 
 207 In [12]: set(l)
 208 Out[12]: set([1, 2, 3])
 209 
 210 (15:14:44) davin.baragiotta: voilà! on a donc les éléments mais non redondants...
 211 (15:15:05) davin.baragiotta: on finit maintenant la théorie sur les types
 212 (15:15:19) davin.baragiotta: un truc pas mal en Python
 213 (15:15:31) davin.baragiotta: c'est un peu de la syntaxe : le unpacking
 214 (15:16:03) davin.baragiotta: ex.; montreal est un tuple de coordonnées, disons x et y
 215 (15:16:10) davin.baragiotta: In [13]: montreal = (42, 57)
 216 (15:16:27) davin.baragiotta: je peux "unpacker" la variable montreal dans 2 variables x et y
 217 (15:16:38) davin.baragiotta: In [14]: x, y = montreal
 218 (15:16:48) davin.baragiotta: 
 219 In [15]: x
 220 Out[15]: 42
 221 
 222 In [16]: y
 223 Out[16]: 57
 224 
 225 (15:16:51) davin.baragiotta: joli, non?
 226 (15:17:24) davin.baragiotta: Python permet aussi de déclarer en une ligne que plusieurs variables ont la même valeur
 227 (15:17:33) davin.baragiotta: a, b, c = 14
 228 (15:17:44) davin.baragiotta: crotte non!
 229 (15:17:54) davin.baragiotta: In [17]: a, b, c = 14
 230 ---------------------------------------------------------------------------
 231 TypeError Traceback (most recent call last)
 232 
 233 /net/nfs-authnss.b.ca.auf/home/davin.baragiotta/<ipython console> in <module>()
 234 
 235 (15:18:37) davin.baragiotta: j'ai eu une erreur de type, car justement... Python pensait que je voulais "unpacker" 14... 
 236 (15:18:39) davin.baragiotta: TypeError: 'int' object is not iterable
 237 
 238 (15:18:46) davin.baragiotta: en essayent d'itérer
 239 (15:18:53) davin.baragiotta: faut donc écrire :
 240 (15:19:00) davin.baragiotta: a, b, c = 14, 14, 14
 241 (15:19:05) davin.baragiotta: bon, moins intéressant ;)
 242 (15:19:27) davin.baragiotta: finalement.... sachez que Python est fortement typé
 243 (15:19:40) davin.baragiotta: on sait que Python est interprété (pas compilé)
 244 (15:20:04) davin.baragiotta: mais il aussi fortement typé : on peut pas faire n'importe quoi avec les variables
 245 (15:20:23) davin.baragiotta: ex.:
 246 'Davin' + 5
 247 (15:20:37) davin.baragiotta: 
 248 In [18]: 'Davin' + 5
 249 ---------------------------------------------------------------------------
 250 TypeError Traceback (most recent call last)
 251 
 252 /net/nfs-authnss.b.ca.auf/home/davin.baragiotta/<ipython console> in <module>()
 253 
 254 TypeError: cannot concatenate 'str' and 'int' objects
 255 
 256 (15:20:47) davin.baragiotta: On a encore un TypeError
 257 (15:20:52) davin.baragiotta: explicite en plus
 258 (15:21:15) davin.baragiotta: je ne peux pas concaténer un 'str' (string) et nu 'int' (integer... un entier)
 259 (15:21:52) davin.baragiotta: en PHP, ça aurait marché... PHP aurait dit "aaaah, je comprends que tu veux concaténer un string avec un entier"
 260 (15:22:12) davin.baragiotta: en Python, pour faire ça... on va transtyper (changer de type) nous même les variables
 261 (15:22:30) davin.baragiotta: pour ça, on a des focntions dédiées :
 262 (15:22:54) davin.baragiotta: In [20]: cinq = str(5)
 263 
 264 (15:23:08) davin.baragiotta: In [21]: type(cinq)
 265 Out[21]: <type 'str'>
 266 
 267 
 268 (15:23:53) davin.baragiotta: en utilisant la fonction built-in str() on peut créer des chaînes
 269 (15:24:05) davin.baragiotta: str() peut servir à initialiser une chaîne
 270 (15:24:17) davin.baragiotta: s = str()
 271 (15:24:25) davin.baragiotta: mais ce n'est pas vraiment utile
 272 (15:24:33) davin.baragiotta: car Python est dynamique :
 273 (15:24:59) davin.baragiotta: pas besoin de "déclarer" les variables avec leurs types... comme en Java
 274 (15:25:19) davin.baragiotta: donc Python est interprété, fortement typé et dynamique
 275 (15:25:35) davin.baragiotta: ok avançons pour être dynaiqmue aussi! on veut coder!
 276 (15:25:55) davin.baragiotta: BUILT-IN : FONCTIONS ET STRUCTURE DU LANGAGE
 277 (15:26:09) davin.baragiotta: suivez moi dans le support de présentation
 278 (15:26:37) davin.baragiotta: on voit là le lien vers la documentation officielle où sont listées toutes les fonctions "built-in"
 279 (15:26:51) davin.baragiotta: c,est à dire des fonctions qui viennet avec le langage : qu'on n,a pas beosin de coder
 280 (15:27:02) davin.baragiotta: ... il n'y en n'a pas des masses, comparé à PHP
 281 (15:27:18) davin.baragiotta: c'est que Python est un langage Orienté-objet...
 282 (15:27:36) davin.baragiotta: et il offre plein d'objets au lieu de fournir plein de fonctions ;)
 283 (15:28:01) davin.baragiotta: je passe rapidement sur les fonctions built-in... on les verra au fur et à mesure
 284 (15:28:32) davin.baragiotta: mais type() permet de tester le type d'un objet
 285 (15:28:45) davin.baragiotta: (on l'a utilisé sur la variable "cinq" plus haut)
 286 (15:29:07) davin.baragiotta: len() permet de compter la longeur d'éléments... très utile
 287 (15:29:09) davin.baragiotta: exemple :
 288 (15:29:26) davin.baragiotta: 
 289 In [23]: l = [1,2,3,4,4,4]
 290 
 291 In [24]: len(l)
 292 Out[24]: 6
 293 
 294 (15:29:35) davin.baragiotta: on a 6 éléments dans cette liste
 295 (15:30:27) davin.baragiotta: ok, dégourdissez-vous un instant... je vais remplir mon café et je vous fais découvrir la toute puissance de l'orienté objet et de l'introspection
 296 (15:30:36) davin.baragiotta: ce qui fait que Python nous permet de travailler vite
 297 (15:30:38) davin.baragiotta: très vite
 298 (15:30:46) davin.baragiotta: (café, je reviens)
 299 (15:32:39) davin.baragiotta: (de retour)
 300 (15:32:58) davin.baragiotta: OBJETS ET NAMESPACE
 301 (15:33:12) davin.baragiotta: qu'est qu'un objet... au sens de "orienté-objet"
 302 (15:33:23) davin.baragiotta: c'est rien d'autre qu'une structure d'information
 303 (15:33:48) davin.baragiotta: un peu comme le dictionnaire Python, tiens...
 304 (15:34:14) davin.baragiotta: un objet stocke "sur lui"... ou "derrière lui" son information
 305 (15:34:35) davin.baragiotta: moi, j'ai un nom et un prénom
 306 (15:35:13) davin.baragiotta: si j'étais un objet informatique... ce sera mes "attributs"... des variables qui me sont attachées
 307 (15:35:25) davin.baragiotta: attributs = variables d'un objet
 308 (15:35:59) davin.baragiotta: aussi, dans certain cas, on va associer des instructions de traitement de l'info propre à un objet sur l'objet même
 309 (15:36:22) davin.baragiotta: on va mettre des "méthodes" qui sont des fonctions "sur l'objet"...
 310 (15:36:30) davin.baragiotta: méthodes = fonctions d'un objet
 311 (15:36:57) davin.baragiotta: ex.: si on veut mon âge... on pourrait mettre un attribut : age = 38
 312 (15:37:05) davin.baragiotta: mais c'est nul car l'âge varie dans le temps
 313 (15:37:23) davin.baragiotta: on va créer une méthode qui va retourner l'age en fonction de la date de naissance
 314 (15:37:48) davin.baragiotta: age()
 315 (15:38:18) davin.baragiotta: si on avait un objet personne... on aurait :
 316 * nom
 317 * prenom
 318 * date_naissance
 319 * age()
 320 (15:38:48) davin.baragiotta: qui serait SUR l'objet.... ou DERRIÈRE L,objet... on accède à ces infos en passant par l'objet
 321 (15:38:55) davin.baragiotta: d'où l'idée de NAMESPACE
 322 (15:39:08) davin.baragiotta: les variables ou attributs ont des noms : prenom, nom
 323 (15:39:18) davin.baragiotta: les fonctions ou méthodes ont des noms : age
 324 (15:39:40) davin.baragiotta: (même si pour les appeler, les exécuter, on met des ()... leur nom n'a pas de ()
 325 (15:39:48) davin.baragiotta: exécuter : age()
 326 (15:39:56) davin.baragiotta: nom : age
 327 (15:40:24) davin.baragiotta: pour accéder aux noms, Python utilise la syntaxe avec des points...
 328 (15:40:40) davin.baragiotta: objet.attribut (ex.: personne.nom )
 329 (15:40:55) davin.baragiotta: objet.methode (personne.age)
 330 (15:41:30) davin.baragiotta: mais laissons l'exemple fictif... pour explorer les OBJETS... en parcourant leur NAMESPACE... via l' INTROSPECTION
 331 (15:41:40) davin.baragiotta: questions?
 332 (15:42:19) davin.baragiotta: Question : un NAMESPACE doit etre consideré comme une classe ?
 333 (15:42:30) davin.baragiotta: Réponse NON
 334 (15:42:48) davin.baragiotta: ce sont des noms derrières des noms... tout simplement... mais c'est possible
 335 (15:43:32) davin.baragiotta: car en orienté-objet... l'objet a un nom... il a des attributs attachés à lui qui ont des noms... des méthodes attachées à lui qui ont des noms
 336 (15:43:37) davin.baragiotta: et oui
 337 (15:43:46) davin.baragiotta: les objets sont créés par des "classes"
 338 (15:43:59) davin.baragiotta: class Personne():
 339 (15:44:32) davin.baragiotta: y'a un lien entre "noms" et "classe" mais pas direct
 340 (15:44:40) davin.baragiotta: INTROSPECTION
 341 (15:44:54) davin.baragiotta: prenons une chaine de caractère
 342 (15:45:10) davin.baragiotta: In [25]: nom = "Davin Baragiotta"
 343 (15:45:21) davin.baragiotta: on sait maintenant qu'on a ici un type string
 344 (15:45:34) davin.baragiotta: mais la question qui tue : on veut faire quoi... dans la vie... avec des strings?
 345 (15:46:02) davin.baragiotta: ehu... peut-être les fusionner avec d'autres strings?... les concaténer
 346 (15:46:07) davin.baragiotta: les tronquer?
 347 (15:46:12) davin.baragiotta: les mettre en majuscule
 348 (15:46:27) davin.baragiotta: ... bref toutes sortes de choses qu'on ne fait QUE sur les chaînes de caractères
 349 (15:46:39) davin.baragiotta: mais j'ai pas envie de coder tout ça moi!
 350 (15:46:57) davin.baragiotta: Python offre ces méthodes de traitement des string... sur les strings même
 351 (15:47:19) davin.baragiotta: pour les découvrir, avec ipython on introspecte (on interroge) la string comme suit :
 352 (15:47:31) davin.baragiotta: nom. (suivi d'un tab)
 353 (15:47:46) davin.baragiotta: In [26]: nom.
 354 nom.__add__ nom.__repr__ nom.istitle
 355 nom.__class__ nom.__rmod__ nom.isupper
 356 nom.__contains__ nom.__rmul__ nom.join
 357 nom.__delattr__ nom.__setattr__ nom.ljust
 358 nom.__doc__ nom.__sizeof__ nom.lower
 359 nom.__eq__ nom.__str__ nom.lstrip
 360 nom.__format__ nom.__subclasshook__ nom.partition
 361 nom.__ge__ nom._formatter_field_name_split nom.replace
 362 nom.__getattribute__ nom._formatter_parser nom.rfind
 363 nom.__getitem__ nom.capitalize nom.rindex
 364 nom.__getnewargs__ nom.center nom.rjust
 365 nom.__getslice__ nom.count nom.rpartition
 366 nom.__gt__ nom.decode nom.rsplit
 367 nom.__hash__ nom.encode nom.rstrip
 368 nom.__init__ nom.endswith nom.split
 369 nom.__le__ nom.expandtabs nom.splitlines
 370 nom.__len__ nom.find nom.startswith
 371 nom.__lt__ nom.format nom.strip
 372 --More--
 373 
 374 (15:47:52) davin.baragiotta: Ta-daaaaaaaaaaaaaam!
 375 (15:48:09) davin.baragiotta: vous êtes puissants maintenant, jeunes padawan! ;)
 376 (15:48:26) progfou [jean-christophe.andre@auf.org/Gajim] entered the room.
 377 (15:48:32) davin.baragiotta: et oui... on voit les NOMS des atttributs et méthodes sur les string
 378 (15:48:37) davin.baragiotta: ok, lisons
 379 (15:48:54) davin.baragiotta: vous voulez tout en minuscule, supposons...
 380 (15:49:03) davin.baragiotta: qu'est-ce qu'on pourrait prendre?
 381 (15:49:21) davin.baragiotta: hmmm.... on lit les noms disponibles sur (derrière) la string
 382 (15:49:27) davin.baragiotta: ah? lower?
 383 (15:49:56) davin.baragiotta: pour lire la doc d'une méthode... avec ipython
 384 (15:50:03) davin.baragiotta: on utilise le ?
 385 (15:50:08) davin.baragiotta: nom.lower?
 386 (15:50:36) davin.baragiotta: (ah... si vous êtes encore coincés avec le "More" de l'introspection des noms... appuyez sur Q pour Quit)
 387 (15:50:47) davin.baragiotta: 
 388 In [26]: nom.lower?
 389 Type: builtin_function_or_method
 390 Base Class: <type 'builtin_function_or_method'>
 391 String Form: <built-in method lower of str object at 0xa465890>
 392 Namespace: Interactive
 393 Docstring:
 394 S.lower() -> string
 395 
 396 Return a copy of the string S converted to lowercase.
 397 
 398 (15:51:07) davin.baragiotta: ipython nous donne l'info sur le nom "lower"
 399 (15:51:49) davin.baragiotta: tiens... "lower" est de type "built-in method".... ok, donc on peut l'appeler (en ajoutant parenthèse)
 400 (15:52:05) davin.baragiotta: on lit la docstring : Return a copy of the string S converted to lowercase.
 401 (15:52:12) davin.baragiotta: parfait ça!
 402 (15:52:18) davin.baragiotta: nom.lower
 403 (15:52:31) davin.baragiotta: 
 404 In [27]: nom.lower
 405 Out[27]: <built-in method lower of str object at 0xa465890>
 406 
 407 (15:52:42) davin.baragiotta: ah... on a oublié les parenthèses... 
 408 (15:52:49) davin.baragiotta: on l'a pas appelé donc
 409 (15:52:51) davin.baragiotta: nom.lower()
 410 (15:53:07) davin.baragiotta: 
 411 In [27]: nom.lower
 412 Out[27]: <built-in method lower of str object at 0xa465890>
 413 
 414 (15:53:10) davin.baragiotta: ta-dammm
 415 (15:53:34) davin.baragiotta: vous venez, avec ipython... de découvrir ce qu'un string pouvait faire...
 416 (15:53:55) davin.baragiotta: vous avez cherchez, lu la doc.... et expérimenté directement dans l'interpréteur
 417 (15:54:04) davin.baragiotta: c'est fort ça...
 418 (15:54:47) davin.baragiotta: (on peut introspecter avec interpréteur normal python avec les focntions : dir() pour avoir les noms... et help() pour lire la doc )
 419 (15:55:12) davin.baragiotta: vous savez explorer seuls maintenant
 420 (15:55:32) davin.baragiotta: nous reste donc à s'amuser un peu avec le reste du langage (autre que les types)
 421 (15:55:38) davin.baragiotta: CONTENEURS
 422 (15:55:53) davin.baragiotta: on a vu que les liste, tuple et dictionnaire sont des conteneurs
 423 (15:56:22) davin.baragiotta: on peut imbriquer les conteneurs dans des conteneurs
 424 (15:56:28) davin.baragiotta: exemple de liste imbriquées
 425 (15:56:35) davin.baragiotta: l = [[1,2,3],[4,'salut',6],[7,8,9]]
 426 (15:56:51) davin.baragiotta: la liste [1, 2, 3] est le premier élément de ma liste l
 427 (15:57:15) davin.baragiotta: aussi... on peut accéder aux éléments des conteurs en utilisant la notation d'index :
 428 (15:57:26) davin.baragiotta: l[0] : retourne le premier élément
 429 (15:57:40) davin.baragiotta: 
 430 In [29]: l = [[1,2,3],[4,'salut',6],[7,8,9]]
 431 
 432 In [30]: l[0]
 433 Out[30]: [1, 2, 3]
 434 (15:57:56) davin.baragiotta: finalement, une notion propre à Python... le slicing
 435 (15:58:05) davin.baragiotta: une slice en angals c'est une "tranche"
 436 (15:58:11) davin.baragiotta: anglais
 437 (15:58:33) davin.baragiotta: on peut extraire une tranche de liste avec une extension de la notation d'index
 438 (15:58:37) davin.baragiotta: l[0:2]
 439 (15:58:50) davin.baragiotta: 
 440 In [31]: l[0:2]
 441 Out[31]: [[1, 2, 3], [4, 'salut', 6]]
 442 
 443 (15:59:13) davin.baragiotta: ça se lit : à partir du premier élément (0), donne m'en 2...
 444 (15:59:14) davin.baragiotta: voilà
 445 (15:59:35) davin.baragiotta: questions sur introspection et conteneurs?
 446 (15:59:58) davin.baragiotta: on continue
 447 (16:00:45) davin.baragiotta: je passe rapidement sur la syntaxe des ITÉRATIONS et COMPARAISONS
 448 (16:00:51) davin.baragiotta: car c'est très intuitif
 449 (16:01:09) davin.baragiotta: il faut remarquer par contre la beauté de la syntaxe : les blocs n'ont pas de {}
 450 (16:01:20) davin.baragiotta: faut utiliser l'indentation
 451 (16:01:53) davin.baragiotta: selon PEP8, utilisez 4 espaces pour indenter vos lignes de codes (PAS de tabs)
 452 (16:02:33) davin.baragiotta: codons une petite boucle for
 453 (16:02:43) davin.baragiotta: 
 454 for i in range(2012, 2016):
 455 (16:02:45) davin.baragiotta: ach
 456 (16:02:52) davin.baragiotta: 
 457 for i in range(2012, 2016):
 458 print i
 459 (16:03:47) davin.baragiotta: ici on utilise range, une fonction built-in pour générer des nombres entre 2 bornes
 460 (16:03:56) davin.baragiotta: (dernière exclue)
 461 (16:04:33) davin.baragiotta: 
 462 In [33]: for i in range(2012, 2016):
 463 ....: print i
 464 ....: 
 465 ....: 
 466 2012
 467 2013
 468 2014
 469 2015
 470 
 471 
 472 (16:04:49) davin.baragiotta: voilà... pas {}.... pas de ; pour fin d'instruction... que du beau
 473 (16:05:16) davin.baragiotta: COMPARAISONS : je vous laisse expérimenter... mais je vous montre un truc cool : in, not in
 474 (16:05:44) davin.baragiotta: créez une liste avec des éléments
 475 (16:05:54) davin.baragiotta: on va voir si une valeur est dans la liste avec "in"
 476 (16:06:19) davin.baragiotta: 
 477 In [34]: l = [1, 2, 3, 4]
 478 
 479 In [35]: 3 in l
 480 Out[35]: True
 481 
 482 In [36]: 5 in l
 483 Out[36]: False
 484 
 485 (16:06:30) davin.baragiotta: ahahaha! si c,est pas magnifique ça!
 486 (16:06:40) davin.baragiotta: utile pour créer de beaux conditionnels!
 487 (16:06:45) davin.baragiotta: CONDITIONNELS
 488 (16:07:03) davin.baragiotta: pas grand chose à dire, sinon qu'on a un elif (pour enchainer des conditions)
 489 (16:07:11) davin.baragiotta: encore une fois : pas de {}, pas de ;
 490 (16:07:36) davin.baragiotta: vérifier dans le document de présentation, section CONDITIONNEL
 491 (16:07:40) davin.baragiotta: http://wiki.auf.org/wikiteki/Ateliers/Python/Base/Support
 492 (16:07:53) davin.baragiotta: voilà... questions, remarques jusqu'ici?
 493 (16:08:23) davin.baragiotta: progfou me faisait remarquer une erreur sur les slices
 494 (16:08:29) davin.baragiotta: l[0:2]
 495 (16:08:31) progfou: une remarque sur ce point :
 496 ‎[08:58:36] ‎davin.baragiotta‎: l[0:2]
 497 ‎‎[08:59:12] ‎davin.baragiotta‎: ça se lit : à partir du premier élément (0), donne m'en 2...
 498 => en fait ça se lit : à partir du premier élément (0) jusqu'au 3ème (2) exclu
 499 => c'est vraiment une notion de « tranche » (de cette position ci à cette position là) par opposition à la notion de sous-chaîne (substring) dans la plupart des autres langages (à partir de là, n éléments)
 500 (16:08:45) davin.baragiotta: voilà
 501 (16:08:58) davin.baragiotta: donc 2 veut dire... "jusqu'à 3è position"
 502 (16:09:03) davin.baragiotta: testez, vous verrez
 503 (16:09:36) davin.baragiotta: pour finir, je saute FICHIERS, FORMATTAGE DE CHAÎNE, COMPRÉHENSION DE LISTE
 504 (16:09:43) davin.baragiotta: essayons de faire un script
 505 (16:10:04) davin.baragiotta: créez un fichier texte, nommé, disons : script.py
 506 (16:10:43) davin.baragiotta: coder le for qu'on a vu, par exemple
 507 (16:11:03) davin.baragiotta: 
 508 for i in range(2012, 2016): print i
 509 (16:11:13) davin.baragiotta: pour exécuter le script
 510 (16:11:28) davin.baragiotta: dans ipython : simplement écrire :
 511 run script
 512 (16:11:58) davin.baragiotta: (pour peu que soit dans répertoire courant de interpréteur... sinon donner le path)
 513 (16:12:11) davin.baragiotta: avec python normal :
 514 $ python script.py
 515 (16:12:18) davin.baragiotta: (path au besoin, évidemment)
 516 (16:12:48) davin.baragiotta: voilà... votre script est interprété... la boucle for exécutée... on print des années (ce sont des entiers, en fait)
 517 (16:12:54) davin.baragiotta: ce script n'est pas utile...
 518 (16:13:06) davin.baragiotta: mais vous pouvez expérimentez dans interpréteur
 519 (16:13:25) davin.baragiotta: pour trouver ce qui utile avec les objets existants (types de base)
 520 (16:13:26) davin.baragiotta: ou
 521 (16:13:38) davin.baragiotta: coder vos traitements... notamment vos fonctions
 522 (16:13:51) davin.baragiotta: je passe la partie FONCTIONS par manque de temps
 523 (16:14:08) davin.baragiotta: on pourra continuer dans un labo, si des gens sont intéressés
 524 (16:14:21) davin.baragiotta: finalement, je ne peut pas partir sans parler des IMPORT
 525 (16:14:43) davin.baragiotta: jusqu'ici, on a vu des notions "built-in"... qui viennent avec le langage :
 526 (16:14:50) davin.baragiotta: on lance interpéteur... c'est là
 527 (16:15:07) davin.baragiotta: mais y,a plein de fonctionnalités qui viennent aussi avec le langage, qu'il faut importer au besoin
 528 (16:15:23) davin.baragiotta: exemple : des types pour les dates, l'heure
 529 (16:15:29) davin.baragiotta: c'est dans datetime
 530 (16:15:48) davin.baragiotta: lisez la doc de la "standard library" Python
 531 (16:16:05) davin.baragiotta: les modules "qui viennent avec Python... mais qui faut importer pour les utiliser
 532 (16:16:38) davin.baragiotta: on peut aussi importer des modules tiers, qui ne viennent pas avec Python... mais faut d'abord les installer sur le système :
 533 (16:16:41) davin.baragiotta: ex.: Django
 534 (16:16:49) davin.baragiotta: import django
 535 (16:16:54) davin.baragiotta: c'est un autre atelier... ;)
 536 (16:17:01) davin.baragiotta: des questions?
 537 (16:17:24) davin.baragiotta: CONCLUSION
 538 (16:17:30) davin.baragiotta: Python est simple et puissant
 539 (16:17:32) davin.baragiotta: vraiment
 540 (16:17:44) davin.baragiotta: pas juste pour l'AUF... pour tous les domaines
 541 (16:18:18) davin.baragiotta: l'apprendre vous donne la liberté de coder
 542 (16:18:46) davin.baragiotta: c'est la Semaine Tech : ceux intéressés à aller plus loin ou approfondir : faites moi signe, on se monte un labo
 543 (16:19:11) davin.baragiotta: ---------------------------------- FIN Atelier Python -----------------------------

Projet/SemaineTech/2013/Ateliers/Python/Archive (dernière édition le 2013-09-03 13:28:11 par YemenSayour)