Cours Python 3
Cours Python 3
Cours Python 3
Introduction Python 3
version 2.71828
bcordeau@numericable.fr
Remerciements : Sans les encouragements de Grard Swinnen, jamais je naurais os me lancer dans laventure de lenseignement de Python. Quil en soit remerci. Ce document a bnci des corrections impitoyables de Laurent Pointal (LIMSI), des lectures attentives de Michelle Kessous, de Michelle Cordeau et de Georges Vincents (IUT dOrsay, dpartement Mesures Physiques). Grand merci ma lle Hlne pour ses illustrations ; les aventures de Steven le Python enchantent les ttes de paragraphe. Merci Tarek Ziad pour les emprunts ses publications, en particulier je remercie les ditions Eyrolles pour leur aimable autorisation de publier le dialogue de la page 102, ainsi que les ditions Dunod pour leur aimable autorisation de publier les exemples des pages 88, 90, 96 et 98. Enn il me faudrait saluer tous les auteurs que jai butins sur Internet... Quau moins, je noublie pas ceux qui jai fait les plus grands emprunts dans les annexes : Sebsauvage et Christian Schindelhauer.
Avant-propos
La version 3 actuelle de Python abolit la compatibilit descendante avec la srie des versions 2.x 1 , dans le but dliminer les faiblesses originelles du langage. La ligne de conduite du projet tait de rduire la redondance dans le fonctionnement de Python par la suppression des mthodes obsoltes . qui sadresse ce cours ? Ce cours prend la suite des Notes de cours Python 2 destin aux tudiants de Mesures Physiques de lIUT dOrsay. Bien qu ce jour lore des bibliothques tierces ne soit pas pas encore riche (entre autres la bibliothque numpy nest pas disponible), il semble utile de disposer dun cours gnraliste en franais consacr la version 3 de Python. Nous en avons prot pour toer le texte de trois chapitres et pour proposer une forme plus pratique pour un texte suceptible dtre imprim, tout en restant agrable consulter lcran. Outre ce cadre universitaire assez rduit, ce cours sadresse toute personne dsireuse dapprendre Python en tant que premier langage de programmation. Ces notes de programmation reposent sur quelques partis pris : le choix du langage Python version 3 ; le choix de logiciels libres ou gratuits : des diteurs spcialiss comme Wingware 3 . A des outils open source : gnuplot, XLTEX dans sa distribution TEXLive, lditeur Kile... et sur labondance des ressources et de la documentation sur le Web. Licence : Ce cours est mis disposition selon le Contrat Paternit 2.0 France disponible en ligne creativecommons.org/licenses/by/2.0/fr/ ou par courrier postal Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.
1. Cest une grave dcision, mrement rchie : Un langage qui bouge peu permet une industrie qui bouge beaucoup (Bertrand Meyer) 2. disponibles ladresse http ://www.iut-orsay.fr/dptmphy/Pedagogie/coursPython.pdf. 3. spcialement sa version Wing IDE 101, gratuite pour toutes les plateformes.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iv
TABLE DES MATIRES 2.7.1 Les chanes de caractres : prsentation . . . . . . 2.7.2 Les chanes de caractres : oprations . . . . . . . 2.7.3 Les chanes de caractres : fonctions vs mthodes 2.7.4 Mthodes de test de ltat dune chane ch . . . . 2.7.5 Mthodes retournant une nouvelle chane . . . . . 2.7.6 Les chanes de caractres : indexation simple . . . 2.7.7 Extraction de sous-chanes . . . . . . . . . . . . Les donnes binaires . . . . . . . . . . . . . . . . . . . . Les entres-sorties . . . . . . . . . . . . . . . . . . . . . 2.9.1 Les entres . . . . . . . . . . . . . . . . . . . . 2.9.2 Les sorties . . . . . . . . . . . . . . . . . . . . . 2.9.3 Les squences dchappement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 14 14 14 15 16 16 17 17 18 19 19 21 21 22 22 23 23 23 23 24 24 24 24 25 27 27 27 27 27 28 28 28 29 30 30 31 31 32 33 33 33 34 35 35
2.8 2.9
3 Le contrle du ux dinstructions 3.1 Les instructions composes . . . . . . . . . . . 3.2 Choisir . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Choisir : if - [elif] - [else] 3.2.2 Syntaxe compacte dune alternative . . . 3.3 Boucler . . . . . . . . . . . . . . . . . . . . . 3.3.1 Boucler : while . . . . . . . . . . . . 3.3.2 Parcourir : for . . . . . . . . . . . . . 3.4 Ruptures de squences . . . . . . . . . . . . . . 3.4.1 Interrompre une boucle : break . . . . 3.4.2 Court-circuiter une boucle : continue 3.4.3 Syntaxe complte des boucles . . . . . . 3.4.4 Exceptions . . . . . . . . . . . . . . . 4 Les conteneurs standard 4.1 Les squences . . . . . . . . . . . . . 4.1.1 Quest-ce quune squence ? . . 4.2 Les listes . . . . . . . . . . . . . . . . 4.2.1 Dnition, syntaxe et exemples 4.2.2 Initialisations et tests . . . . . 4.2.3 Mthodes . . . . . . . . . . . 4.2.4 Manipulation des tranches . 4.3 Les listes en intension . . . . . . . . . 4.4 Les tuples . . . . . . . . . . . . . . . 4.5 Retour sur les rfrences . . . . . . . . 4.6 Les tableaux associatifs . . . . . . . . 4.6.1 Les types tableaux associatifs . 4.6.2 Les dictionnaires (dict) . . . 4.7 Les ensembles (set) . . . . . . . . . 4.8 Les chiers textuels . . . . . . . . . . 4.8.1 Les chiers : introduction . . . 4.8.2 Gestion des chiers . . . . . . 4.9 Itrer sur les conteneurs . . . . . . . . 4.10 Lachage format . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
TABLE DES MATIRES 5 Fonctions et espaces de noms 5.1 Dnition et syntaxe . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Passage des arguments . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Mcanisme gnral . . . . . . . . . . . . . . . . . . . . 5.2.2 Un ou plusieurs paramtres, pas de retour . . . . . . . . . 5.2.3 Un ou plusieurs paramtres, utilisation du retour . . . . . 5.2.4 Passage dune fonction en paramtre . . . . . . . . . . . 5.2.5 Paramtres avec valeur par dfaut . . . . . . . . . . . . . 5.2.6 Nombre darguments arbitraire : passage dun tuple . . . . 5.2.7 Nombre darguments arbitraire : passage dun dictionnaire 5.3 Espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 Porte des objets . . . . . . . . . . . . . . . . . . . . . 5.3.2 Rsolution des noms : rgle LGI . . . . . . . . . . . . . 6 Modules et packages 6.1 Modules . . . . . . . . . . . . . . . . . . 6.1.1 Import dun module . . . . . . . . 6.1.2 Exemples . . . . . . . . . . . . . 6.2 Bibliothque standard . . . . . . . . . . . 6.2.1 La bibliothque standard . . . . . 6.3 Bibliothques tierces . . . . . . . . . . . . 6.3.1 Une grande diversit . . . . . . . 6.3.2 Un exemple : la bibliothque Unum 6.4 Packages . . . . . . . . . . . . . . . . . .
v 39 39 41 41 41 41 42 42 43 43 44 44 44 47 47 47 48 49 49 52 52 52 53 55 55 56 57 57 57 57 58 58 58 59 59 59 60 60 60 60 60 60 62 62 63
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
7 La programmation Oriente Objet 7.1 Insusance de lapproche procdurale . . . . . . 7.2 Terminologie . . . . . . . . . . . . . . . . . . 7.3 Classes et instanciation dobjets . . . . . . . . . 7.3.1 Linstruction class . . . . . . . . . . 7.3.2 Linstanciation et ses attributs . . . . . . 7.3.3 Retour sur les espaces de noms . . . . . 7.4 Mthodes . . . . . . . . . . . . . . . . . . . . 7.5 Mthodes spciales . . . . . . . . . . . . . . . 7.5.1 Les mthodes spciales . . . . . . . . . 7.5.2 Linitialisateur . . . . . . . . . . . . . . 7.5.3 Surcharge des oprateurs . . . . . . . . 7.5.4 Exemple de surcharge . . . . . . . . . . 7.6 Hritage et polymorphisme . . . . . . . . . . . 7.6.1 Hritage et polymorphisme . . . . . . . 7.6.2 Exemple dhritage et de polymorphisme 7.7 Retour sur lexemple initial . . . . . . . . . . . 7.7.1 La classe Cercle : conception . . . . . 7.7.2 La classe Cercle . . . . . . . . . . . 7.8 Notion de Conception Oriente Objet . . . . . . 7.8.1 Composition . . . . . . . . . . . . . . . 7.8.2 Drivation . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
vi 8 Techniques avances 8.1 Techniques procdurales . . . . . . . . . . . . . . . . 8.1.1 Amliorer la documentation . . . . . . . . . . 8.1.2 Faire des menus avec un dictionnaire . . . . . 8.1.3 Les fonctions rcursives . . . . . . . . . . . . 8.1.4 Les gnrateurs et les expressions gnratrices 8.1.5 Les fonctions incluses . . . . . . . . . . . . . 8.1.6 Les dcorateurs . . . . . . . . . . . . . . . . 8.2 Techniques objets . . . . . . . . . . . . . . . . . . . 8.2.1 __slots__ et __dict__ . . . . . . . . . 8.2.2 Functor . . . . . . . . . . . . . . . . . . . . 8.2.3 Les accesseurs . . . . . . . . . . . . . . . . . 8.3 Techniques fonctionnelles . . . . . . . . . . . . . . . 8.3.1 Directive lambda . . . . . . . . . . . . . . 8.3.2 Les fonctions map, filter et reduce . . . 8.3.3 Les applications partielles de fonctions . . . . 9 La programmation OO graphique 9.1 Programmes pilots par des vnements . . 9.2 La bibliothque tkinter . . . . . . . . 9.2.1 Prsentation . . . . . . . . . . . . 9.2.2 Les widgets de tkinter . . . . 9.2.3 Le positionnement des widgets . . 9.3 Deux exemples . . . . . . . . . . . . . . . 9.3.1 tkPhone, un exemple sans menu 9.3.2 IDLE, un exemple avec menu . .
TABLE DES MATIRES 65 65 65 66 67 69 70 71 72 72 72 73 75 75 75 76 79 79 80 80 80 81 81 81 85 87 87 87 88 89 89 93 96 101 105 109 111 113 115 129
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
10 Notion de dveloppement agile 10.1 Les tests . . . . . . . . . . . . . . . . . . . . . . . . 10.1.1 Tests unitaires et tests fonctionnels . . . . . . 10.1.2 Le dveloppement dirig par les tests . . . . . 10.2 La documentation . . . . . . . . . . . . . . . . . . . 10.2.1 Le format reST . . . . . . . . . . . . . . . . 10.2.2 Le module doctest . . . . . . . . . . . . . 10.2.3 Le dveloppement dirig par la documentation A Interlude B Jeux de caractres et encodage C Les fonctions logiques D Les bases arithmtiques E Les fonctions de hachage F Exercices corrigs G Ressources
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
viii
Les instructions composes. . . . . . . . . . . . . . . . . . . . . . . . . . Assignation augmente dun objet non modiable. . . . . . . . . . . . . . . Assignation augmente dun objet modiable. . . . . . . . . . . . . . . . . Oprations sur les ensempbles . . . . . . . . . . . . . . . . . . . . . . . . Les avantages de lutilisation des fonctions . . . . . . . . . . . . . . . . . Passage des arguments par aectation. . . . . . . . . . . . . . . . . . . . . Rgle LGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conception UML de la classe Cercle. . . . . . . . . . . . . . . . . . . . Empilage/dpilage de 4 ! . . . . . . . . . . . . . . . . . . . . . . . . . . . Application partielle dun widget . . . . . . . . . . . . . . . . . . . . . . . Deux styles de programmation. Un exemple simple . . . . . . tkPhone. . . . . . . . . . . . . IDLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
exemple de sortie au format HTML. . . . . Excution du script doctest1.py. . . . Excution du script doctest2.py. . . . Excution du script example.py. . . . . Documentation du script doctest2.py. Documentation du script example.py. .
TABLE DES FIGURES B.3 Le jeu de caractres cp1252. . . . . . . . . . . . . . . . . . . . . . . . . 108 E.1 Le principe du hachage . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 E.2 Hachage des cls dun dictionnaire. . . . . . . . . . . . . . . . . . . . . . 114
Chapitre 1
Introduction linformatique
Ce premier chapitre introduit les grandes caractristiques du langage Python, replace Python dans lhistoire des langages, donne les particularits de production des scripts, dni la notion si importante dalgorithme et conclut sur les divers implmentations disponibles.
1.1
Historique 1991 : Guido van Rossum publie Python au CWI (Pays-Bas) partir du langage ABC et du projet AMOEBA (systme dexploitation distribu) 1996 : sortie de Numerical Python 2001 : naissance de de la PSF (Python Software Fundation) Les versions se succdent... Un grand choix de modules disponibles, des colloques annuels sont organiss, Python est enseign dans plusieurs universits et est utilis en entreprise... Fin 2008 : sorties simultanes de Python 2.6 et de Python 3.0 2010 : versions en cours 1 : v2.7 et v3.1.2 Langage Open Source Licence Open Source CNRI, compatible GPL, mais sans la restriction copyleft. Python est libre et gratuit mme pour les usages commerciaux GvR (Guido van Rossum) est le BDFL (dictateur bnvole vie !) Importante communaut de dveloppeurs Nombreux outils standard disponibles : Batteries included Travail interactif Nombreux interprteurs interactifs disponibles Importantes documentations en ligne Dveloppement rapide et incrmentiel Tests et dbogage faciles Analyse interactive de donnes Langage interprt rapide Interprtation du bytecode compil
1. en octobre.
CHAPITRE 1. INTRODUCTION De nombreux modules sont disponibles partir de bibliothques optimises crites en C, C++ ou FORTRAN Simplicit du langage (cf. Zen of Python p. 101) : Syntaxe claire et cohrente Indentation signicative Gestion automatique de la mmoire (garbage collector) Typage dynamique fort : pas de dclaration Orientation objet Modle objet puissant mais pas obligatoire Structuration multichier trs facile des applications : facilite les modications et les extensions Les classes, les fonctions et les mthodes sont des objets dits de premire classe. Ces objets sont traits comme tous les autres (on peut les aecter, les passer en paramtre) Ouverture au monde Interfaable avec C/C++/FORTRAN Langage de script de plusieurs applications importantes Excellente portabilit Disponibilit de bibliothques Plusieurs milliers de packages sont disponibles dans tous les domaines
Lordinateur comprend entre autres : un microprocesseur avec une UC (Unit de Contrle), une UAL (Unit Arithmtique et Logique), une horloge, une mmoire cache rapide ; de la mmoire volatile (dite vive ou RAM), contenant les instructions et les donnes ncessaires lexcution des programmes. La RAM est forme de cellules binaires (bits) organises en mots de 8 bits (octets) ; des priphriques : entres/sorties, mmoires permanentes (dites mortes : disque dur, cl USB, CD-ROM...), rseau...
les programmes applicatifs sont ddis des tches particulires. Ils sont forms dune srie de commandes contenues dans un programme source qui est transform pour tre excut par lordinateur.
1.3
Les langages
Des centaines de langages ont t crs, mais lindustrie nen utilise quune minorit.
1.4
Figure 1.1 Chane de compilation Dans la technique de linterprtation chaque ligne du source analys est traduite au fur et mesure en instructions directement excutes. Aucun programme objet nest gnr. Cette technique est trs souple mais les codes gnrs sont peu performants : linterprteur doit tre utilis chaque excution...
CHAPITRE 1. INTRODUCTION
Figure 1.3 Interprtation du bytecode compil Pour excuter un programme, Python charge le chier source .py (ou .pyw) en mmoire vive, en fait lanalyse syntaxique, produit le bytecode et enn lexcute. Pour chaque module import par le programme, Python vrie dabord sil existe une version prcompile du bytecode (dans un chier .pyo ou .pyc) dont la date correspond au chier .py. Sil y en a un, Python lutilise, sinon il fait une analyse syntaxique du module .py, et utilise le bytecode quil vient de gnrer. En pratique, il nest pas ncessaire de compiler explicitement un module, Python gre ce mcanisme de faon transparente.
Dnition Programme : un programme est la traduction dun algorithme en un langage compilable ou interprtable par un ordinateur.
Il est souvent crit en plusieurs parties dont une qui pilote les autres : le programme principal.
1.6
CPython : Classic Python, cod en C, portable sur dirents systmes Python3000 : Python 3, la nouvelle implmentation de CPython Jython : cibl pour la JVM (utilise le bytecode de JAVA) IronPython : Python.NET, crit en C#, utilise le MSIL (MicroSoft Intermediate Language) Stackless Python : limine lutilisation de la pile du langage C (permet de rcurser tant que lon veut) Pypy : projet de recherche europen dun interprteur Python crit en Python
CHAPITRE 1. INTRODUCTION
Chapitre 2
La calculatrice Python
Comme tout langage, Python permet de manipuler des donnes grce un vocabulaire de mots rservs et grce des types de donnes approximation des ensembles de dnition utiliss en mathmatique. Ce chapitre prsente les rgles de construction des identiants, les types de donnes simples (les conteneurs seront examins au chapitre 4) ainsi que les types chane de caractres (Unicode et binaires). Enn, last but not least, ce chapitre stend sur les notions non triviales de variables, de rfrences dobjet et daectation.
2.1
Sachant que : un caractre de dbut peut tre nimporte quelle lettre Unicode (cf. annexe B p. 105), ainsi que le caractre soulign (_) ; un caractre de continuation est un caractre de dbut, un chire ou un point. Attention Les identiants sont sensibles la casse et ne doivent pas tre un mot cl.
viter dutiliser l, O et I seuls (l minuscule, o et i majuscules). Enn, on rservera les notations suivantes :
_xxx # usage interne __xxx # attribut de classe __xxx__ # nom spcial rserv
Exemples :
NB_ITEMS = 12 # class MaClasse: pass # def maFonction(): pass mon_id = 5 # UPPER_CASE TitleCase # camelCase lower_case
2.3
Notion dexpression
Dnition Une expression est une portion de code que linterprteur Python peut valuer pour obtenir une valeur. Les expressions peuvent tre simples ou complexes. Elles sont formes dune combinaison de littraux, didentiants et doprateurs.
2.4
Bien remarquer le rle des deux oprateurs de division : / : produit une division ottante ; // : produit une division entire. Bases usuelles Un entier crit en base 10 (par exemple 179) peut se reprsenter en binaire, octal et hexadcimal en utilisant les syntaxes suivantes :
>>> 0b10110011 # binaire 179 >>> 0o263 # octal 179 >>> 0xB3 # hexadcimal 179
Oprateurs logiques (concept de shortcut) : not, or et and. En observant les tables de vrit des oprateurs and et or (cf. p. 109), on remarque que : ds quun premier membre a la valeur False, lexpression False and expression2 vaudra False. On na donc pas besoin de lvaluer ; de mme ds quun premier membre a la valeur True, lexpression True or expression2 vaudra True. Cette optimisation est appele principe du shortcut :
(3 == 3) or (9 > 24) # True (ds le premier membre) (9 > 24) and (3 == 3) # False (ds le premier membre)
Les oprations logiques et de comparaisons sont values an de donner des rsultats boolens dans False, True.
2.5. LES TYPES DE DONNES FLOTTANTS Les expressions boolennes Une expression boolenne (cf. p. 109) a deux valeurs possibles : False ou True. Python attribue une expression boolenne la valeur False si cest : la constante False ; la constante None ; une squence ou une collection vide ; une donne numrique de valeur 0. Tout le reste vaut True.
11
2.5
Les ottants supportent les mmes oprations que les entiers. Les float ont une prcision nie indique dans sys.float_info.epsilon. Limport du module math autorise toutes les oprations mathmatiques usuelles :
import math print(math.sin(math.pi/4)) # 0.7071067811865475 print(math.degrees(math.pi)) # 180.0 print(math.factorial(9)) # 362880 print(math.log(1024, 2)) # 10.0
12
2.6.2 Laectation
Dnition On aecte une variable par une valeur en utilisant le signe = (qui na rien voir avec lgalit en math !). Dans une aectation, le membre de gauche reoit le membre de droite ce qui ncessite dvaluer la valeur correspondant au membre de droite avant de laecter au membre de gauche.
La valeur dune variable, comme son nom lindique, peut voluer au cours du temps (la valeur antrieure est perdue) :
a = a + 1 # 3 (incrmentation) a = a - 1 # 2 (dcrmentation)
La comparaison a une valeur utilisable dans une expression mais na pas deet (lautomate interne reprsentant lvolution du programme nest pas modi) :
>>> x = (a == 3) + 2 >>> x 2
13
2.7
14
code. Non modiable signie quune donne, une fois cre en mmoire, ne pourra plus tre change. Trois syntaxes de chanes sont disponibles. Remarquez que lon peut aussi utiliser le la place de , ce qui permet dinclure une notation dans lautre :
syntaxe1 = Premire forme avec un retour la ligne \n syntaxe2 = rDeuxime forme sans retour la ligne \n syntaxe3 = Troisime forme multi-ligne guillemets = Leau vive apostrophes = Forme avec des apostrophes
Concatnation :
s1 = abc s2 = defg s3 = s1 + s2 # abcdefg
Rptition :
s4 = Fi! s5 = s4 * 3 # Fi! Fi! Fi! print(s5)
On applique une mthode un objet en utilisant la notation pointe entre la donne/variable laquelle on applique la mthode, et le nom de la mthode suivi de loprateur () appliqu la mthode :
ch2 = abracadabra ch3 = ch2.upper() # ABRACADABRA
15
La notation [xxx] indique un lment optionnel que lon peut donc omettre lors de lutilisation de la mthode. isupper() et islower() : retournent True si ch ne contient respectivement que des majuscules/minuscules :
print(cHAise basSe.isupper()) # False
istitle() : retourne True si seule la premire lettre de chaque mot de ch est en majuscule :
print(Chaise Basse.istitle()) # True
isalnum(), isalpha(), isdigit() et isspace() : retournent True si ch ne contient respectivement que des caractres alphanumriques, alphabtiques, numriques ou des espaces :
print(3 chaises basses.isalpha()) # False print(54762.isdigit()) # True
startswith(prefix[, start[, stop]]) et endswith(suffix[, start[, stop]]) : testent si la sous-chane dnie par start et stop commence respectivement par prefix ou nit par suffix :
print(abracadabra.startswith(ab)) # True print(abracadabra.endswith(ara)) # False
expandtabs([tabsize]) : remplace les tabulations par tabsize espaces (8 par dfaut). center(width[, fillchar]), ljust(width[, fillchar]) et rjust(width[, fillchar]) : retournent respectivement une chane centre, justie gauche ou droite, complte par le caractre fillchar (ou par lespace par dfaut) :
print(s.center(20, -)) # ----cHAise basSe---print(s.rjust(20, @)) # @@@@@@@@cHAise basSe
zfill(width) : complte ch gauche avec des 0 jusqu une longueur maximale de width :
print(s.zfill(20)) # 00000000cHAise basSe
strip([chars]), lstrip([chars]) et rstrip([chars]) : suppriment toutes les combinaisons de chars (ou lespace par dfaut) respectivement au dbut et en n, au dbut, ou en n dune chane :
16
find(sub[, start[, stop]]) : renvoie lindex de la chane sub dans la sous-chane start stop, sinon renvoie -1. rfind() eectue le mme travail en commenant par la n. index() et rindex() font de mme mais produisent une erreur (exception) si la chane nest pas trouve :
print(s.find(se b)) # 4
replace(old[, new[, count]]) : remplace count instances (toutes par dfaut) de old par new :
print(s.replace(HA, ha)) # chaise basSe
split(seps[, maxsplit]) : dcoupe la chane en maxsplit morceaux (tous par dfaut). rsplit() eectue la mme chose en commenant par la n et striplines() eectue ce travail avec les caractres de n de ligne :
print(s.split()) # [cHAise, basSe]
join(seq) : concatne les chanes du conteneur seq en intercalant la chane sur laquelle la mthode est applique :
print(**.join([cHAise, basSe])) # cHAise**basSe
17
2.8
Les types binaires Python 3 propose deux types de donnes binaires : byte (non modiable) et bytearray (modiable). Une donne binaire contient une suite de zro ou plusieurs octets, cest--dire dentiers non signs sur 8 bits (compris dans lintervalle [0...255]). Ces types la C sont bien adapts pour stocker de grandes quantits de donnes. De plus Python fournit des moyens de manipulation ecaces de ces types. Les deux types sont assez semblables au type str et possdent la plupart de ses mthodes. Le type modiable bytearray possde des mthodes communes au type list. Exemples de donnes binaires et de mthodes :
# donnes binaires b_mot = bAnimal # chane prfixe par b : type byte print(b_mot) # bAnimal for b in b_mot: print(b, end= ) # 65 110 105 109 97 108 (cf. table ASCII) print() bMot = bytearray(b_mot) # retourne un nouveau tableau de bytes... bMot.pop() # ...qui possde les mthodes usuelles print() print(bMot, \n) # bytearray(bAnima) data = b5 Hills \x35\x20\x48\x69\x6C\x6C\x73 print(data.upper()) # b5 HILLS 5 HILLS print(data.replace(bill, bat)) # b5 Hats 5 Hats
Bien direncier les codes, glyphes, caractres et octets ! (Cf. Fig. 2.5)
2.9
Les entres-sorties
Lutilisateur a besoin dinteragir avec le programme (cf. Fig. 2.6). En mode console (on verra les interfaces graphiques ultrieurement), on doit pouvoir saisir ou entrer des in-
18
Figure 2.5 Codes, glyphes, caractres et octets. formations, ce qui est gnralement fait depuis une lecture au clavier. Inversement, on doit pouvoir acher ou sortir des informations, ce qui correspond gnralement une criture sur lcran.
19
f1 = input(\nEntrez un flottant : ) f1 = float(f1) # transtypage en flottant # ou plus brivement : f2 = float(input(Entrez un autre flottant : )) print(type(f2)) # <class float>
20
Chapitre 3
Le contrle du ux dinstructions
Un script Python est form dune suite dinstructions excutes en squence de haut en bas. Chaque ligne dinstructions est forme dune ou plusieurs lignes physiques qui peuvent tre continues par un antislash \ ou un caractre ouvrant [({ pas encore ferm. Cette excution en squence peut tre modie pour choisir ou rpter des portions de code. Cest lobjet principal de ce chapitre.
3.1
Syntaxe Une instruction compose se compose : dune ligne den-tte termine par deux-points ; dun bloc dinstructions indent par rapport la ligne den-tte.
Attention Toutes les instructions au mme niveau dindentation appartiennent au mme bloc (cf. Fig. 3.1).
22
3.2 Choisir
3.2.1 Choisir : if - [elif] - [else]
Contrler une alternative :
if x < 0: print(x est ngatif)
3.3. BOUCLER
elif x % 2: print(x est positif et impair) else: print(x nest pas ngatif et est pair)
23
3.3
Boucler
Utilisation classique : la saisie ltre dune valeur numrique (on doit prciser le type car input() saisit une chane) :
n = int(input(Entrez un entier [1 .. 10] : )) while not(1 <= n <= 10): n = int(input(Entrez un entier [1 .. 10], S.V.P. : ))
24
for lettre in ciao: print(lettre, end= ) # c i a o for x in [2, a, 3.14]: print(x, end= ) # 2 a 3.14 for i in range(5): print(i, end= )
# 0 1 2 3 4
25
3.4.4 Exceptions
An de rendre les applications plus robustes, il est ncessaire de grer les erreurs dexcution des parties sensibles du code. Le mcanisme des exceptions spare dun ct la squence dinstructions excuter lorsque tout se passe bien et, dun autre ct, une ou plusieurs squences dinstructions excuter en cas derreur. Lorsquune erreur survient, un objet exception est pass au mnanisme de propagation des exceptions, et lexcution est transfre la squence de traitement ad hoc. Le mcanisme seectue en deux phases : la leve dexception lors de la dtection derreur ; le traitement appropri. Syntaxe La squence normale dinstructions est place dans un bloc try. Si une erreur est dtecte (leve dexception), elle est traite dans le bloc except appropri (le gestionnaire dexception).
from math import sin for x in range(-4, 5): # -4, -3, -2, -1, 0, 1, 2, 3, 4 try: print({:.3f}.format(sin(x)/x), end= ) except ZeroDivisionError: # toujours fournir une exception
26
print(1.0, end= ) # gre lexception en 0 # -0.189 0.047 0.455 0.841 1.0 0.841 0.455 0.047 -0.189
Toutes les exceptions leves par Python sont des instances de sous-classe de la classe Exception. La hirarchie des sous-classes ore une vingtaine dexceptions standard 1 . Syntaxe complte dune exception :
try: ... # squence normale dexcution except <exception_1> as e1: ... # traitement de lexception 1 except <exception_2> as e2: ... # traitement de lexception 2 ... else: ... # clause excute en labsence derreur finally: ... # clause toujours excute
Remarque raise, sans valeur, dans un bloc except, permet de ne pas bloquer une exception, de la propager. Bloc gard (ou gestionnaire de contexte) : Cette syntaxe simplie le code en assurant que certaines oprations sont excutes avant et aprs un bloc dinstructions donn. Illustrons ce mcanisme sur un exemple classique ou il importe de fermer le chier utilis :
# au lieu de ce code : fh = None try: fh = open(filename) for line in fh: process(line) except EnvironmentError as err: print(err) finally: if fh is not None: fh.close() # il est plus simple dcrire : try: with open(filename) as fh: for line in fh: process(line) except EnvironmentError as err: print(err) 1. Citons quelques classes : AritmeticError, ZeroDivisionError, IndexError, KeyError, AttributeError, IOError, ImportError, NameError, SyntaxError, TypeError...
Chapitre 4
Le chapitre 2 a prsent les types de donnes simples, mais Python ore beaucoup plus : les conteneurs. De faon gnrale, un conteneur est un objet composite destin contenir dautres objets. Ce chapitre dtaille les squences, les tableaux associatifs, les ensembles et les chiers textuels.
4.1
Les squences
Python dispose de trois types prdnis de squences : les chanes (vues prcdemment) ; les listes ; les tuples 1 .
4.2
Les listes
28
couleurs = [trfle, carreau, coeur, pique] print(couleurs) # [trfle, carreau, coeur, pique] couleurs[1] = 14 print(couleurs) # [trfle, 14, coeur, pique] list1 = [a, b] list2 = [4, 2.718] list3 = [list1, list2] # liste de listes print(list3) # [[a, b], [4, 2.718]]
4.2.3 Mthodes
Quelques mthodes de modication des listes :
nombres = [17, 38, 10, 25, 72] nombres.sort() print(nombres) # [10, 17, nombres.append(12) nombres.reverse() nombres.remove(38) print(nombres) # [12, 72, print(nombres.index(17)) # 3 nombres[0] = 11 nombres[1:3] = [14, 17, 2] print(nombres.pop()) # 10 print(nombres) # [11, 14, print(nombres.count(17)) # 2 nombres.extend([1, 2, 3]) print(nombres) # [11, 14,
17, 2, 17]
17, 2, 17, 1, 2, 3]
29
une tranche dans le membre de gauche dune aectation et fournir une liste dans le membre de droite.
mots = [jambon, sel, miel, confiture, beurre] mots[2:4] = [] # effacement par affectation dune liste vide print(mots) # [jambon, sel, beurre] mots[1:3] = [salade] print(mots) # [jambon, salade] mots[1:] = [mayonnaise, poulet, tomate] print(mots) # [jambon, mayonnaise, poulet, tomate] mots[2:2] = [miel] # insertion en 3 position print(mots) # [jambon, mayonnaise, miel, poulet, tomate]
4.3
Une liste en intension est une expression qui permet de gnrer une liste de manire trs compacte. Cette notation reprend la dnition mathmatique dun ensemble en intension : {x2 |x [2, 10]} [x**2 for x in range(2, 11)] Dnition Une liste en intension est quivalente une boucle for qui construirait la mme liste en utilisant la mthode append().
Les listes en intension sont utilisables sous trois formes. Premire forme expression dune liste simple de valeurs :
result1 = [x+1 for x in une_seq] # a le mme effet que : result2 = [] for x in une_seq: result2.append(x+1)
30
# calcul de la somme de la liste avec la fonction intgre sum print(sum([int(i) for i in valeurs_s])) # 761 # a le mme effet que : s = 0 for i in valeurs_s: s = s + int(i) print(s)
# 761
# Initialisation dune liste 2D multi_liste = [[0]*2 for ligne in range(3)] print(multi_liste) # [[0, 0], [0, 0], [0, 0]]
Les tuples sutilisent comme les listes mais leur parcours est plus rapide ; Ils sont utiles pour dnir des constantes. Attention Comme les chanes de caractres, les tuples ne sont pas modiables !
Dans lexemple ci-dessus, les aectations ralisent plusieurs oprations : cre en mmoire un objet du type ad hoc (membre de droite) ; stocke la donne dans lobjet cr ; cre un nom de variable (membre de gauche) ; associe ce nom de variable lobjet contenant la valeur. Une consquence de ce mcanisme est que, si un objet modiable est aect, tout changement sur un objet modiera lautre :
fable = [Je, plie, mais, ne, romps, point] phrase = fable phrase[4] = casse print(fable) # [Je, plie, mais, ne, casse, point]
31
Figure 4.1 Assignation augmente dun objet non modiable. Si lon dsire raliser une vraie copie 1 dun objet, on doit utiliser le module copy :
import copy a = [1, 2, 3] b = a # b.append(4) print(a) # c = copy.copy(a) c.append(5) print(c) # print(a) #
Dans les rares occasions o lon veut aussi que chaque lment et attribut de lobjet soit copi sparment et de faon rcursive, on emploie la fonction copy.deepcopy(). Complment graphique sur lassignation Assignation augmente dun objet non modiable (cas dun entier : Fig. 4.1). On a reprsent ltape de laddition intermdiaire : Assignation augmente dun objet modiable (cas dune liste : Fig. 4.2) : On a reprsent ltape de la cration de la liste intermdiaire :
4.6
1. Dans le cas gnral. Pour copier une squence simple, par exemple une liste l, on peut toujours crire l2 = l[ :]
32
Figure 4.2 Assignation augmente dun objet modiable. il est itrable (on peut le parcourir) mais nest pas ordonn. Python propose le type standard dict.
Les dictionnaires constituent un type composite mais ils nappartiennent pas aux squences. Comme les listes, les dictionnaires sont modiables, mais les couples enregistrs noccupent pas un ordre immuable, leur emplacement est gr par un algorithme spcique (Cf. les fonctions de hachage p. 113). Une cl pourra tre alphabtique, numrique. . . en fait tout type hachable. Les valeurs pourront tre des valeurs numriques, des squences, des dictionnaires, mais aussi des fonctions, des classes ou des instances. Exemples de cration
# insertion de cls/valeurs une une d1 = {} # dictionnaire vide d1[nom] = 3 d1[taille] = 176 print(d1) # {nom: 3, taille: 176} # dfinition en extension d2 = {nom: 3, taille: 176} print(d2) # {nom: 3, taille: 176} # dfinition en intension d3 = {x: x**2 for x in (2, 4, 6)} print(d3) # {2: 4, 4: 16, 6: 36} # utilisation de paramtres nomms d4 = dict(nom=3, taille=176) print(d4) # {taille: 176, nom: 3} # utilisation dune liste de couples cls/valeurs d5 = dict([(nom, 3), (taille, 176)]) print(d5) # {nom: 3, taille: 176}
4.7. LES ENSEMBLES (SET) Mthodes Quelques mthodes applicables aux dictionnaires :
tel = {jack: 4098, sape: 4139} tel[guido] = 4127 print(tel) # {sape: 4139, jack: 4098, guido: 4127} print(tel[jack]) # 4098 del tel[sape] tel[irv] = 4127 print(tel) # {jack: 4098, irv: 4127, guido: 4127} print(list(tel.keys())) # [jack, irv, guido] print(sorted(tel.keys())) # [guido, irv, jack] print(sorted(tel.values())) # [4098, 4127, 4127] print(guido in tel, jack not in tel) # True False
33
4.7
4.8
34
Mais, pour conserver durablement des informations, il faut utiliser une mmoire permanente comme par exemple le dique dur, la cl USB, le DVD,. . . Comme la plupart des langages, Python utilise classiquement la notion de chier. Cest un type pr-dni en Python, qui ne nesscite donc pas dimporter de module externe. Nous nous limiterons aux chiers textuels (portables, lisible par un diteur), mais signalons que les chiers stocks en codage binaire sont plus compacts et plus rapides grer.
Python utilise les chiers en mode texte par dfaut (not t) (pour les chiers binaires, il faut prciser le mode b). Le paramtre optionnel encoding assure les conversions entre les types byte et str 1 . Les encodages les plus frqents sont utf-8 (cest lencodage privilgier en Python 3), latin1, ascii... Tant que le chier nest pas ferm, son contenu nest pas garanti sur le disque. Une seule mthode de fermeture :
f1.close()
1. Cf. lannexe B
35
4.9
Les techniques suivantes sont classiques et trs utiles. Obtenir cls et valeurs en bouclant sur un dictionnaire :
knights = {Gallahad: the pure, Robin: the brave} for k, v in knights.items(): print(k, v) # Gallahad the pure # Robin the brave
Boucler sur une squence inverse (la squence initiale est inchange) :
print() for i in reversed(range(1, 10, 2)): print(i, end= ) # 9 7 5 3 1
Boucler sur une squence trie lments uniques (la squence initiale est inchange) :
print() basket = [apple, orange, apple, pear, orange, banana] for f in sorted(set(basket)): print(f, end= ) # apple banana orange pear
4.10
Lachage format
La mthode format() permet de contrler nement toutes sortes dachages. Remplacements simples :
print({} {} {}.format(zro, un, deux)) # zro un deux print({2} {0} {1}.format(zro, un, deux)) # deux zro un
36
print(Je mappelle {}.format(Bob)) # Je mappelle Bob print(Je mappelle {{{}}}.format(Bob)) # Je mappelle {Bob} print({}.format(-*10)) # ----------
Formatages numriques :
print({0} {0:b} {0:o} {0:x}.format(179)) # 179 10110011 263 b3 n = 100 pi = 3.1415926535897931 print({}, et {}.format(n, pi)) # 100, et 3.14159265359 print({}, et {}.format(n, pi)) # 100, et 3.14159265359 print({0}, {1} et {0}.format(n, pi)) # 100, 3.14159265359 et 100 print({:.4e}.format(pi)) # 3.1416e+00 print({:g}.format(pi)) # 3.14159 msg = Rsultat sur {:d} chantillons : {:.2f}.format(n, pi) print(msg) # Rsultat sur 100 chantillons : 3.14
37
38
Chapitre 5
Remarque Les fonctions sont les lments structurants de base de tout langage procdural. Elles orent dirents avantages : vite la rptition : on peut factoriser une portion de code qui se rpte lors de lexcution en squence dun script ; Met en relief les donnes et les rsultats : entres et sorties de la fonction ; Permet la rutilisation : mcanisme de limport ; Dcompose une tche complexe en tches plus simples : lapplication. Ces avantages sont illustrs sur la gure 5.1. conception de
5.1
Dnition et syntaxe
On doit dnir une fonction chaque fois quun bloc dinstructions se trouve plusieurs reprises dans le code ; il sagit dune mise en facteur commun . Syntaxe Cest une instruction compose :
def nomFonction(paramtres): Documentation de la fonction. <bloc_instructions>
Le bloc dinstructions est obligatoire. Sil est vide, on emploie linstruction pass. La documentation (facultative) est fortement conseille.
40
41
5.2
42
def volumeSphere(r): return 4.0 * pi * cube(r) / 3.0 # Saisie du rayon et affichage du volume rayon = float(input(Rayon : )) print(Volume de la sphre =, volumeSphere(rayon))
43
Note : Si la fonction possde plusieurs arguments, le tuple est en dernire position. Il est aussi possible de passer un tuple (en fait une squence) lappel qui sera dcompress en une liste de paramtres dune fonction classique :
def somme(a, b, c): return a+b+c # Exemple dappel : elements = (2, 4, 6) print(somme(*elements)) # 12
Note : Si la fonction possde plusieurs arguments, le dictionnaire est en toute dernire position (aprs un ventuel tuple).
44
Exemples de porte
# x et fonc sont affects dans le module : globaux def fonc(y): # y et z sont affects dans fonc : locaux global x # permet de modifier x ligne suivante x += 2 z = x + y return z x = 99
45
46
Chapitre 6
Modules et packages
Un programme Python est gnralement compos de plusieurs chiers sources, appels modules. Leur nom est sux .py. Sils sont correctement cods les modules doivent tre indpendants les uns des autres pour tre rutiliss la demande dans dautres programmes. Ce chapitre explique comment coder et importer des modules dans un autre. Nous verrons galement la notion de package qui permet de grouper plusieurs modules.
6.1
Modules
Dnition Module : chier indpendant permettant de scinder un programme en plusieurs scripts. Ce mcanisme permet dlaborer ecacement des bibliothques de fonctions ou de classes.
Avantages des modules : rutilisation du code ; la documentation et les tests peuvent tre intgrs au module ; ralisation de services ou de donnes partags ; partition de lespace de noms du systme.
la commande from <nom_module> import obj1, obj2... nimporte que les objets obj1, obj2... du module :
from math import pi, sin, log
48 Il est conseill dimporter dans lordre : les modules de la bibliothque standard ; les modules des bibliothques tierces ; Les modules personnels.
6.1.2 Exemples
Notion d auto-test Un module cube_m.py. Remarquez lutilisation de lauto-test qui permet de tester le module seul :
def cube(y): Calcule le cube du paramtre <y>. return y**3 # Auto-test ---------------------------------------------------if __name__ == __main__: # False lors dun import ==> ignor help(cube) # affiche le docstring de la fonction print(cube de 9 :, cube(9)) # cube de 9 : 729
Une interface gnuplot Lapplication libre gnuplot permet dacher des courbes. La fonction suivante est une interface dappel qui permet dacher des donnes issues de chiers :
import os def plotFic(courbes): dem = open(_.dem, w) # fichier rutilis chaque trac dem.write(set grid\n) plot_data = [%s with %s % (c[0], c[1]) for c in courbes] dem.write(plot + ,.join(plot_data)) dem.write(\npause -1 \Entre\ pour continuer\n) dem.write(reset) dem.close() os.system(wgnuplot _.dem)
49
6.2
Bibliothque standard
La gestion est assure par deux modules : getopt, le module historique hrit du C et optparse, un module rcent beaucoup plus puissant :
from optparse import OptionParser parser = OptionParser() parser.add_option(-f, --file, dest=filename, help=write report to FILE, metavar=FILE) parser.add_option(-q, --quiet, action=store_false, dest=verbose, default=True, help=dont print status messages to stdout) (options, args) = parser.parse_args()
ou
python 6_025.py --help
Bibliothques mathmatiques et types numriques En standard, Python propose les modules fraction et decimal :
from fractions import Fraction import decimal as d print(Fraction(16, -10)) # -8/5 print(Fraction(123)) # 123 print(Fraction( -3/7 )) # -3/7 print(Fraction(-.125)) # -1/8 print(Fraction(7e-6)) # 7/1000000 d.getcontext().prec = 6 print(d.Decimal(1) / d.Decimal(7)) # 0.142857 d.getcontext().prec = 18 print(d.Decimal(1) / d.Decimal(7)) # 0.142857142857142857
En plus des bibliothques math et cmath dj vues, la bibliothque random propose plusieurs fonctions de nombres alatoires. La gestion du temps et des dates Les modules calendar, time et datetime fournissent les fonctions courantes de gestion du temps et des dures :
51
Algorithmes et types de donnes collection Le module bisect fournit des fonctions de recherche de squences tries. Le module array propose un type semblable la liste, mais plus rapide car de contenu homogne. Le module heapq gre des tas dans lesquels llment dindex 0 est toujours le plus petit :
import heapq import random heap = [] for i in range(10): heapq.heappush(heap, random.randint(2, 9)) print(heap) # [2, 3, 5, 4, 6, 6, 7, 8, 7, 8]
linstar des structures C, Python propose dsormais, via le module collections, la notion de type tuple nomm :
import collections # description du type : Point = collections.namedtuple(Point, x y z) # on instancie un point : point = Point(1.2, 2.3, 3.4) # on laffiche : print(point : [{}, {}, {}] .format(point.x, point.y, point.z)) # point : [1.2, 2.3, 3.4]
Il est bien sr possible davoir des tuples nomms embots. Le type defaultdict permet des utilisations avances :
from collections import defaultdict s = [(y, 1), (b, 2), (y, 3), (b, 4), (r, 1)] d = defaultdict(list) for k, v in s: d[k].append(v) print(d.items()) # dict_items([(y, [1, 3]), (r, [1]), (b, [2, 4])]) s = mississippi
52
d = defaultdict(int) for k in s: d[k] += 1 print(d.items()) # dict_items([(i, 4), (p, 2), (s, 4), (m, 1)])
Et tant dautres domaines... Beaucoup dautres domaines pourraient tre explors : accs au systme ; utilitaires chiers ; programmation rseau ; persistance ; les chiers XML ; la compression ; ...
6.4. PACKAGES
53
6.4
Packages
Dnition Un package est un module contenant dautres modules. Les modules dun package peuvent tre des sous-packages, ce qui donne une structure arborescente.
En rsum, un package est simplement un rpertoire qui contient des modules et un chier __init__.py dcrivant larborescence du package.
54
Chapitre 7
La Programmation Oriente Objet : la POO permet de mieux modliser la ralit en concevant des ensembles dobjets, les classes. Ces classes permettent de construire des objets interactifs entre eux et avec le monde extrieur. Les objets sont crs indpendamment les uns des autres, grce lencapsulation, mcanisme qui permet dembarquer leurs proprits. Les classes permettent dviter au maximum lemploi des variables globales. Enn les classes orent un moyen conomique et puissant de construire de nouveaux objets partir dobjets prexistants.
7.1
Un exemple On veut reprsenter un cercle, ce qui ncessite au minimum trois informations, les coordonnes du centre et le rayon :
cercle = (11, 60, 8)
Pour rsoudre ce problme et amliorer la lisibilit, on peut utiliser des tuples nomms :
from collection import namedtuple Cercle = namedtuple(Cercle, x y rayon) cercle = Cercle(11, 60, 8) # exemple dutilisation : distance = distance_origine(cercle.x, cercle.y)
56
Par contre, il reste le problme des donnes invalides, ici un rayon ngatif :
cercle = Cercle(11, 60, -8)
Si les cercles doivent changer de caractristiques, il faut opter pour un type modiable, liste ou dictionnaire ce qui ne rgle toujours pas le problme des donnes invalides... On a donc besoin dun mcanisme pour empaqueter les donnes ncessaires pour reprsenter un cercle et pour empaqueter les mthodes applicables ce nouveau type de donnes (la classe), de telle sorte que seules les oprations valides soient utilisables.
7.2 Terminologie
Le vocabulaire de la POO Une classe est donc quivalente un nouveau type de donnes. On connat dj par exemple int ou str. Un objet ou une instance est un exemplaire particulier dune classe. Par exemple truc est une instance de la classe str. La plupart des classes encapsulent la fois les donnes et les mthodes applicables aux objets. Par exemple un objet str contient une chane de caractres Unicode (les donnes) et de nombreuses mthodes comme upper(). On pourrait dnir un objet comme une capsule, savoir un paquet contenant des attributs et des mthodes : objet = [attributs + mthodes] Beaucoup de classes orent des caractristiques supplmentaires comme par exemple la concatnation des chanes en utilisant simplement loprateur +. Ceci est obtenu grce aux mthodes spciales. Par exemple loprateur + est utilisable car on a redni la mthode __add()__. Les objets ont gnralement deux sortes dattributs : les donnes nommes simplement attributs et les fonctions applicables appeles mthodes. Par exemple un objet de la classe complex possde : .imag et .real, ses attributs ; beaucoup de mthodes, comme conjugate() ; des mthodes spciales : +, -, /... Les attributs sont normalement implments comme des variables dinstance, particulires chaque instance dobjet. Le mcanisme de property permet un accs contrl aux donnes, ce qui permet de les valider et de les scuriser. Un avantage dcisif de la POO est quune classe Python peut toujours tre spcialise en une classe lle qui hrite alors de tous les attributs (donnes et mthodes) de sa supper classe. Comme tous les attributs peuvent tre rednis, une mthode de la classe lle et de la classe mre peut possder le mme nom mais eectuer des traitements dirents (surcharge) et Python sadaptera dynamiquement, ds laectation. En proposant dutiliser un mme nom de mthode pour plusieurs types dobjets dirents, le polymorphisme permet une programmation beaucoup plus gnrique. Le dveloppeur na pas savoir, lorsquil programme une mthode, le type prcis de lobjet sur lequel la mthode va sappliquer. Il lui sut de savoir que cet objet implmentera la mthode.
57
Enn Python supporte galement le duck typing : sil marche comme un canard et cancane comme un canard, alors cest un canard ! . Ce qui signie que Python ne sintresse quau comportement des objets. Par exemple un objet chier peut tre cr par open() ou par une instance de io.StringIO. Les deux approches orent la mme API (interface de programmation), cest--dire les mmes mthodes.
7.3
Dans cet exemple, C est le nom de la classe (qui commence conventionnellement par une majuscule), et x est un attribut de classe, local C.
# b est un autre objet de la classe C # 23. b connat son attribut de classe, mais... # AttributeError: C instance has no attribute y
58
Noms non qualis (exemple dimension) laectation cre ou change le nom dans la porte locale courante. Ils sont cherchs suivant la rgle LGI. Noms qualis (exemple dimension.hauteur) laectation cre ou modie lattribut dans lespace de noms de lobjet. Un attribut est cherch dans lobjet, puis dans toutes les classes dont lobjet dpend (mais pas dans les modules). Lexemple suivant ache le dictionnaire li la classe C puis la liste des attributs lis une instance de C :
class C: x = 20 print(C.__dict__) # {__dict__: <attribute __dict__ of C objects>, x: 20, __module__: __main__, __weakref__: <attribute __weakref__ of C objects>, __doc__: None} a = C() print(dir(a)) # [__class__, __delattr__, __dict__, __doc__, __getattribute__, __hash__, __init__, __module__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__ , __weakref__, x]
7.4 Mthodes
Syntaxe Une mthode scrit comme une fonction du corps de la classe avec un premier paramtre self obligatoire, o self reprsente lobjet sur lequel la mthode sera applique. Autrement dit self est la rfrence dinstance.
class C: x = 23 # x et y : attributs de classe y = x + 5 def affiche(self): # mthode affiche() self.z = 42 # attribut dinstance print(C.y) # dans une mthode, on qualifie un attribut de classe , print(self.z) # mais pas un attribut dinstance ob = C() # instanciation de lobjet ob ob.affiche() # 28 42 ( lappel, ob affecte self)
59
7.5.2 Linitialisateur
Lors de linstanciation dun objet, la mthode __init__ est automatiquement invoque. Elle permet deectuer toutes les initialisations ncessaires :
class C: def __init__(self, n): self.x = n # initialisation de lattribut dinstance x une_instance = C(42) # paramtre obligatoire, affect n print(une_instance.x) # 42
Cest une procdure automatiquement invoque lors de linstanciation : elle ne contient jamais linstruction return.
Python possde des mthodes de surcharge pour : tous les types (__call__, __str__, ...) ; les nombres (__add__, __div__, ...) ; les squences (__len__, __iter__, ...). Soient deux instances, obj1 et obj2, les mthodes spciales suivantes permettent deectuer les oprations arithmtiques courantes : Nom Mthode spciale Utilisation oppos __neg__ -obj1 addition __add__ obj1 + obj2 soustraction __sub__ obj1 - obj2 multiplication __mul__ obj1 * obj2 division __div__ obj1 / obj2 division entire __floordiv__ obj1 // obj2
60
print(v1 + v2)
# Vecteur(4.6, 6.8)
Dnition Le polymorphisme est la facult pour une mthode portant le mme nom mais appartenant des classes distinctes hrites deectuer un travail dirent. Cette proprit est acquise par la technique de la surcharge.
61
Lutilisation du dcorateur property permet un accs en lecture seule au rsultat de la mthode distance_origine() considre alors comme un simple attribut (car il ny a pas de parenthse) :
if __name__ == __main__: p1, p2 = Point(), Point(3, 4) print(p1 == p2) # False print(p2, p2.distance_origine) # (3, 4) 5.0
De nouveau, les mthodes renvoyant un simple ottant seront utilises comme des attributs grce property :
class Cercle(Point): def __init__(self, rayon, x=0, y=0): super().__init__(x, y) self.rayon = rayon @property def aire(self): return math.pi * (self.rayon ** 2) @property def circonference(self): return 2 * math.pi * self.rayon @property def distance_bord_origine(self):
62
Voici la syntaxe permettant dutiliser la mthode rayon comme un attribut en lecturecriture. Remarquez que la mthode rayon() retourne lattribut protg : __rayon qui sera modi par le setter (la mthode modicatrice) :
@property def rayon(self): return self.__rayon @rayon.setter def rayon(self, rayon): assert rayon > 0, rayon strictement positif self.__rayon = rayon
7.8.1 Composition
Dnition La composition est la collaboration de plusieurs classes distinctes via une association (utilise-un) ou une agrgation (a-un).
La classe composite bncie de lajout de fonctionnalits dautres classes qui nont rien en commun. Limplmentation Python utilise est gnralement linstanciation de classes dans le constructeur de la classe composite.
63
7.8.2 Drivation
Dnition La drivation dcrit la cration de sous-classes par spcialisation.
On utilise dans ce cas le mcanisme de lhritage. Limplmentation Python utilise est gnralement lappel dans le constructeur de la classe drive du constructeur de la classe parente, soit nommment, soit grce linstruction super. Exemple
class Rectangle: def __init__(self, longueur=30, largeur=15): self.L, self.l, self.nom = longueur, largeur, rectangle class Carre(Rectangle): # hritage simple Sous-classe spcialise de la super-classe Rectangle. def __init__(self, cote=20): # appel au constructeur de la super-classe de Carre : super().__init__(cote, cote) self.nom = carr # surcharge dattribut
64
Chapitre 8
Ce chapitre prsente quelques exemples de techniques avances dans les trois paradigmes que supporte Python, les programmations procdurale, objet et fonctionnelle.
8.1
Techniques procdurales
66
L.reverse() -- reverse *IN PLACE* L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; cmp(x, y) -> -1, 0, 1
67
Par exemple, trier un tableau de N lments par ordre croissant cest extraire le plus petit lment puis trier le tableau restant N 1 lments. Bien que cette mthode soit souvent plus dicile comprendre et coder que la mthode classique dite itrative, elle est, dans certains cas, lapplication la plus directe de sa dnition mathmatique. Voici lexemple classique de dnition par rcurrence de la fonction factorielle 1 : { 1 si n = 0 n! = n (n 1)! si n 1 Remarque Son code est trs exactement calqu sur sa dnition mathmatique :
def factorielle(n): if n == 0: # cas de base : condition terminale return 1 else # cas rcursif return n*factorielle(n-1)
Dans cette dnition, la valeur de n! nest pas connue tant que lon na pas atteint la condition terminale (ici n == 0). Le programme empile les appels rcursifs jusqu atteindre la condition terminale puis dpile les valeurs. Ce mcanisme est illustr par la gure 8.1.
68
69
Les expressions gnratrices Syntaxe Une expression gnratrice possde une syntaxe presque identique celle des listes en intension ; la dirence est quune expression gnratrice est entoure de parenthses.
70 Utilisation
Les expressions gnratrices sont aux gnrateurs ce que les listes en intension sont aux fonctions.
class CasSpecial(object): def uneMethode(self): print(spcial) # fonction def casQuiConvient(estNormal=True): Fonction fabrique renvoyant une classe. return CasNormal() if estNormal else CasSpecial() # Programme principal ----------------------------------------------une_instance = casQuiConvient() une_instance.uneMethode() # normal autre_instance = casQuiConvient(False) autre_instance.uneMethode() # spcial
71
# programme principal =============================================== ## utilisation dun dcorateur print(uneFonction(1, 2)) ## utilisation de la composition de fonction autreFonction = unDecorateur(autreFonction) print(autreFonction(1, 2)) Fonction decore ! 3 Fonction decore ! 3
72
Quand une classe est cre sans utiliser linstruction __slot__, ce que nous avons fait jusqu maintenant, Python cre de manire transparente un dictionnaire priv appel __dict__ pour chaque instance de la classe, et ce dictionnaire contient les attributs de linstance. Voici pourquoi il est possible dajouter ou de retirer des attributs dun objet. Mais si lon se contente dobjets sur lesquels nous accdons aux attributs sans en ajouter ou en ter, nous pouvons crer des classes sans dictionnaire priv, ce qui conomisera de la mmoire chaque instanciation. Cest ce qui est ralis dans lexemple ci-dessus en dnissant un attribut de classe __slot__ dont la valeur est un tuple form des noms des attributs.
8.2.2 Functor
En Python un objet fonction ou fonctor est une rfrence tout objet appelable 1 : fonction, fonction lambda, mthode, classe. La fonction prdnie callable() permet de tester cette proprit :
>>> def maFonction(): print(Ceci est appelable) >>> callable(maFonction) True >>> chaine = Ceci est appelable >>> callable(chaine) False
Il est possible de transformer les instances dune classe en functor si la mthode spciale __call__() est dnie dans la la classe :
>>> class A: def __call__(self, un , deux): return un + deux >>> a = A() >>> callable(a) True >>> a(1, 6) 7 1. callable en anglais.
73
Deux syntaxes implmentent cette solution. La premire dnit explicitement la proprit x et ses quatre paramtres (dans lordre) :
#!/usr/bin/python3 #-*- coding: utf-8 -*# fichier : property.py class C: def __init__(self): self._ma_propriete = None def getx(self): getter. return self._x def setx(self, value): setter. self._x = value def delx(self): deleter. del self._x x = property(getx, setx, delx, Je suis la proprit x.)
74
# auto-test ========================================================= if __name__ == __main__: test = C() test.x = 10 print(test.x) # setter # getter
La seconde, plus simple, utilise la syntaxe des dcorateurs. On remarque que la chane de documentation de la property est ici la docstring de la dnition de la proprit x :
#!/usr/bin/python3 #-*- coding: utf-8 -*# fichier : property2.py class C: def __init__(self): self._x = None @property def x(self): Je suis la proprit x. return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x
# auto-test ========================================================= if __name__ == __main__: test = C() test.x = 10 print(test.x) # setter # getter
75
8.3
Techniques fonctionnelles
Par exemple cette fonction retourne s si son argument est dirent de 1, une chane vide sinon :
s = lambda x: if x == 1 else s
Autres exemples :
>>> def makeIncrementor(n): return lambda x: x+n >>> >>> >>> 5 9 >>> >>> >>> f2 = makeIncrementor(2) f6 = makeIncrementor(6) print(f2(3), f6(3))
4 8 16
76
>>> def renvoiTitres(element): return element.title()
>>> map(renvoiTitres, [fiat lux, lord of the fly]) [Fiat Lux, Lord Of The Fly] >>> >>> [element.title() for element in [fiat lux, lord of the fly]] [Fiat Lux, Lord Of The Fly]
On remarque que map() peut tre remplace par une liste en intension. La fonction filter() : filter() construit et renvoie un itrateur sur une liste qui contient tous les lments de la squence initiale rpondant au critre : function(element) == True :
>>> [1, >>> >>> [1, filter(lambda x: x > 0, [1, -2, 3, -4]) 3] [x for x in [1, -2, 3, -4] if x > 0] 3]
On remarque que filter() peut tre remplace par une liste en intension avec un test. La fonction reduce() : reduce() est une fonction du module functools. Elle applique de faon cumulative une fonction de deux arguments aux lments dune squence, de gauche droite, de faon rduire cette squence une seule valeur quelle renvoie :
>>> def somme(x, y): print x, +, y return x + y >>> 1 + 3 + 6 + 10 >>> >>> 10 reduce(somme, [1, 2, 3, 4]) 2 3 4
sum([1, 2, 3, 4])
On remarque que reduce() peut tre remplace par une des fonctions suivantes : all(), any(), max(), min() ou sum().
77
Les PFA sont trs utiles pour fournir des modles partiels de widgets, qui ont souvent de nombreux paramtres. Dans lexemple suivant, on rednit la classe Button en xant certains de ses attributs (qui peuvent toujours tre surchargs) :
from functools import partial import tkinter as tk root = tk.Tk() # instanciation partielle de classe : MonBouton = partial(tk.Button, root, fg=purple, bg=green) MonBouton(text=Bouton 1).pack() MonBouton(text=Bouton 2).pack() MonBouton(text=QUITTER, bg=red, fg=black, command=root.quit).pack(fill=tk.X, expand=True) root.title(PFA !) root.mainloop()
78
Chapitre 9
La programmation OO graphique
Trs utilise dans les systmes dexploitation et dans les applications, les interfaces graphiques sont programmables en Python. Parmi les direntes bibliothques graphiques utilisables dans Python (GTK+, wxPython, Qt...), la bibliothque tkinter, issue du langage tcl/Tk est trs employe, car elle est installe de base dans toute les distributions Python. tkinter facilite la construction dinterfaces graphiques simples. Aprs avoir import la bibliothque, la mthode consiste crer, congurer et positionner les widgets utiliss, coder les fonctions/mthodes associes aux widgets, puis dentrer dans la boucle principale de gestion des vnements.
9.1
En programmation graphique objet, on remplace le droulement squentiel du script par une boucle dvnements (cf. Fig. 9.1)
80
Liste des principaux widgets de tkinter : Tk fentre de plus haut niveau Frame contenant pour organiser dautres widgets Label zone de message Button bouton avec texte ou image Message zone dachage multi-lignes Entry zone de saisie Checkbutton bouton deux tats Radiobutton bouton deux tats exclusifs Scale glissire plusieurs positions PhotoImage sert placer des images sur des widgets
9.3. DEUX EXEMPLES BitmapImage sert placer des bitmaps sur des widgets Menu associ un Menubutton Menubutton bouton ouvrant un menu doptions Scrollbar ascenseur Listbox liste de noms slectionner Text dition de texte multi-lignes Canvas zone de dessins graphiques ou de photos OptionMenu liste droulante ScrolledText widget Text avec ascenseur PanedWindow interface onglets LabelFrame contenant avec un cadre et un titre Spinbox un widget de slection multiple
81
9.3
9.3.1
Deux exemples
tkPhone, un exemple sans menu
Il sagit de crer un script de gestion dun carnet tlphonique. Laspect de lapplication est illustr Fig. 9.3 Conception graphique La conception graphique va nous aider choisir les bons widgets. Tout dabord, il est naturel de distinguer trois zones : 1. la zone suprieure, ddie lachage ; 2. la zone mdiane est une liste alphabtique ordonne ; 3. la zone infrieure est forme de boutons de gestion de la liste ci-dessus. Chacune de ces zones est code par une instance de Frame(), positionne lune sous lautre grce au packer, et toutes trois incluses dans une instance de Tk() (cf. conception Fig. 9.3).
82
Figure 9.3 tkPhone. Le code de linterface graphique An de ne pas mlanger les problmes, on se propose la mthodologie suivante : Remarque Sparer le codage de linterface graphique et celui des callbacks. Voici dans un premier temps le code de linterface graphique. Linitialisateur cre un attribut phoneList, une liste quil remplit avec le contenu du chier contenant les donnes (si le chier nexiste pas il est cr), cre la fentre de base root et appelle la mthode makeWidgets(). Cette mthode, suit la conception graphique et remplit chacun des trois frames. Les callbacks sont vides (instruction pass minimale). Comme tout bon module, un auto-test permet de vrier le bon fonctionnement (ici le bon aspect) de linterface :
import tkinter as tk # class class Allo_IHM(object): IHM de lapplication rpertoire tlphonique. def __init__(self, fic): Initialisateur/lanceur de la fentre de base self.phoneList = [] self.fic = fic f = open(fic) try: for line in f: self.phoneList.append(line[: -1].split(*)) except: # cration du fichier de rpertoire f = open(self.fic, w) finally: f.close() self.phoneList.sort()
83
tk.Label(frameH, text=Nom :).grid(row=0, column=0, sticky=tk.W) self.nameEnt = tk.Entry(frameH) self.nameEnt.grid(row=0, column=1, sticky=tk.W, padx=5, pady=10) tk.Label(frameH, text=Tel :).grid(row=1, column=0, sticky=tk.W) self.phoneEnt = tk.Entry(frameH) self.phoneEnt.grid(row=1, column=1, sticky=tk.W, padx=5, pady=2) b = tk.Button(frameH, text=Effacer , command=self.clear) b.grid(row=2, column=0, columnspan=2, pady=3) # frame liste (au milieu) frameM = tk.Frame(self.root) frameM.pack() self.scroll = tk.Scrollbar(frameM) self.select = tk.Listbox(frameM, yscrollcommand=self.scroll.set, height=6) self.scroll.config(command=self.select.yview) self.scroll.pack(side=tk.RIGHT, fill=tk.Y, pady=5) self.select.pack(side=tk.LEFT, fill=tk.BOTH, expand=1, pady=5) ## remplissage de la Listbox for i in self.phoneList: self.select.insert(tk.END, i[0]) self.select.bind(<Double-Button-1>, lambda event: self.afficher (event)) # frame boutons (en bas) frameB = tk.Frame(self.root, relief=tk.GROOVE, bd=3) frameB.pack(pady=3) b1 = tk.Button(frameB, text=Ajouter , command=self.ajouter) b2 = tk.Button(frameB, text=Supprimer, command=self.supprimer) b3 = tk.Button(frameB, text=Afficher , command=self.afficher) b1.pack(side=tk.LEFT, pady=2) b2.pack(side=tk.LEFT, pady=2) b3.pack(side=tk.LEFT, pady=2) def ajouter(self): pass def supprimer(self): pass def afficher(self, event=None): pass
84
def clear(self): pass # auto-test --------------------------------------------------------if __name__ == __main__: app = Allo_IHM(phones.txt) # instancie lIHM
Le code de lapplication On va maintenant utiliser le module de la faon suivante : On importe la classe Allo_IHM depuis le module prcdent ; on cre une classe Allo qui en drive ; son initialisateur appelle linitialisateur de la classe de base pour hriter de toutes ses caractristiques ; il reste surcharger les callbacks. Enn, le script instancie lapplication.
# imports import tkinter as tk from tkPhone_IHM import Allo_IHM # classes class Allo(Allo_IHM): Rpertoire tlphonique. def __init__(self, fic=phones.txt): Constructeur de lIHM. Allo_IHM.__init__(self, fic) def ajouter(self): # maj de la liste ajout = [, ] ajout[0] = self.nameEnt.get() ajout[1] = self.phoneEnt.get() if (ajout[0] == ) or (ajout[1] == ): return self.phoneList.append(ajout) self.phoneList.sort() # maj de la listebox self.select.delete(0, tk.END) for i in self.phoneList: self.select.insert(tk.END, i[0]) self.clear() self.nameEnt.focus() # maj du fichier f = open(self.fic, a) f.write(%s*%s\n % (ajout[0], ajout[1])) f.close() def supprimer(self): self.clear() # maj de la liste retrait = [, ] retrait[0], retrait[1] = self.phoneList[int(self.select. curselection()[0])]
85
def afficher(self, event=None): self.clear() name, phone = self.phoneList[int(self.select.curselection()[0])] self.nameEnt.insert(0, name) self.phoneEnt.insert(0, phone) def clear(self): self.nameEnt.delete(0, tk.END) self.phoneEnt.delete(0, tk.END) # programme principal ---------------------------------------------------app = Allo() # instancie lapplication
9.3.2
Toutes les distributions Python comporte lapplication IDLE, linterprteur/diteur crit en Python 1 . Cette application se prsente sous laspect dune interface graphique complte (cf Fig. 9.4), avec menu. Cest un source Python dont le code est disponible 2 et constitue lui seul un cours complet tkinter.
1. Dans certaines distributions linux, IDLE est un package particulier. 2. Mais il est trop volumineux pour tre reproduit dans ces notes...
86
Chapitre 10
Le dveloppement agile est un style de dveloppement logiciel itratif, davantage centr sur les personnes que sur les mthodes, et qui met laccent sur la satisfaction du client travers lintgration continue dun logiciel entirement fonctionnel. Le Manifeste Agile est un texte rdig en 2001 par 17 experts reconnus pour leurs apports respectifs au dveloppement dapplications informatiques sous la forme de plusieurs mthodes dont les plus connues sont leXtreme Programming et Scrum. Cette philosophie couvre lensemble du cycle de dveloppement du projet, mais nous nous limiterons ici aux problmes de la documentation et des tests.
10.1
Les tests
Ds lors quun programme dpasse le stade du petit script, le problme des erreurs et donc des tests se pose invitablement. Dnition Un test consiste appeler la fonctionnalit spcie dans la documentation, avec un scnario qui correspond un cas dutilisation, et vrier que cette fonctionnalit se comporte comme prvu.
Mthode Dans la philosophie du dveloppement agile , les tests sont crits en mme temps que le code, voire juste avant. On parle de DDT, Dveloppement Dirig par les Tests (ou TDD, Test Driven Developpement).
88
Tests unitaires : validations isoles du fonctionnement dune classe, dune mthode ou dune fonction. Par convention, chaque module est associ un module de tests unitaires, plac dans un rpertoire tests du paquet. Par exemple, un module nomm calculs.py aura un module de tests nomm tests/test_calculs.py Tests fonctionnels : prennent lapplication complte comme une bote noire et la manipulent comme le ferait lutilisateur nal. Ces tests doivent passer par les mmes interfaces que celles fournies aux utilisateurs, cest pourquoi ils sont spciques la nature de lapplication et plus dlicats mettre en uvre. On peut citer les projets : Mechanize : fournit des objets Python sans IHM qui bouchonnent un navigateur Web ; Selenium : tests fonctionnels pour les applications Web dans un vritable navigateur ; guitest : teste les applications GTK ; FunkLoad ore un systme de benchmark et de reporting tendu.
10.2. LA DOCUMENTATION
dirName = . dirName = os.path.realpath(dirName) upDir = os.path.split(dirName)[0] if upDir not in sys.path: sys.path.append(upDir) from calculs import moyenne, division # classes class CalculTest(unittest.TestCase): def test_moyenne(self): self.assertEquals(moyenne(1, 2, 3), 2) self.assertEquals(moyenne(2, 4, 6), 4) def test_division(self): self.assertEquals(division(10, 5), 2) self.assertRaises(ZeroDivisionError, division, 10, 0) def test_suite(): tests = [unittest.makeSuite(CalculTest)] return unittest.TestSuite(tests) if __name__ == __main__: unittest.main()
89
Pour eectuer une campagne de tests , il reste crer un script qui : recherche tous les modules de test : leurs noms commencent par test_ et ils sont contenus dans un rpertoire tests ; rcupre la suite, renvoye par la fonction globale test_suite ; cre une suite de suites et lance la campagne.
10.2
La documentation
Durant la vie dun projet, on distingue plusieurs types de documentation : les documents de spcication (upstream documentation) ; les documents techniques attachs au code (mainstream documentation) ; les manuels dutilisation et autres documents de haut niveau (downstream documentation). Les documents mainstream voluent au rythme du code et doivent donc tre traits comme lui : ils doivent pouvoir tre lus et manipuls avec un simple diteur de texte. Il existe deux outils majeurs pour concevoir des documents pour les applications Python : le reStructuredText (ou reST) : un format enrichi ; les doctests : compatibles avec le format reST. Ils permettent de combiner les textes applicatifs avec les tests.
90
A la dirence de LTEX il enrichit le document de manire non intrusive , cest--dire que les chiers restent directement lisibles.
Le projet docutils, qui inclut linterprteur reST, fournit un jeu dutilitaires : rst2html gnre un rendu html avec une css intgre ;
A rst2latex cre un chier LTEX quivalent ;
rst2s5 construit une prsentation au format s5, qui permet de crer des prsentations interactives en HTML. Voici un exemple simple 1 de cier texte au format reST. On remarque entre autres que : la principale balise est la ligne blanche qui spare les direntes structures du texte ; la structuration se fait en soulignant les titres des sections de dirents niveaux avec des caractres de ponctuation (= - _ : , etc.). chaque fois quil rencontre un texte ainsi soulign, linterprteur associe le caractre utilis un niveau de section ; un titre est gnralement soulign et surlign avec le mme caractre, comme dans lexemple suivant :
====================== Fichier au format reST ====================== Section 1 ========= On est dans la section 1. Sous-section :::::::::::: Ceci est une sous-section. Sous-sous-section ................. Ceci est une sous-sous-section. .. et ceci un commentaire Section 2 ========= La section 2 est beaucoup plus **intressante** que la section 1. Section 3 ========= La section 2 est un peu vantarde : la section 1 est *trs bien*. --------------Un tableau de trois images au format png :::::::::::::::::::::::::::::::::::::::::: 1. Cf. [B6] p. 131
10.2. LA DOCUMENTATION
91
Lutilitaire rst2html, appliqu ce chier, produit le chier de mme nom mais avec lextention .html (cf. Fig. 10.1).
92
10.2. LA DOCUMENTATION
93
Il est possible daller plus loin et dinclure dans les chanes de documentation des exemples dutilisation, crits sous la forme de session interactive. Examinons trois exemples. Pour chacun, nous donnerons dune part le source muni de sa chane de documentation dans lequel le module standard doctest permet dextraire puis de lancer ces sessions pour vrier quelles fonctionnent et, dautre part une capture dcran de lexcution. Premier exemple : doctest1.py
Module dessai de doctest. # import import doctest # fonctions def somme(a, b): Renvoie a + b. >>> somme(2, 2) 4 >>> somme(2, 4) 6 return a+b if __name__ == __main__: print({:-^40}.format( Mode silencieux )) doctest.testmod() print(Si tout va bien, on a rien vu !) input() print({:-^40}.format( Mode dtaill )) doctest.testmod(verbose=True)
94
10.2. LA DOCUMENTATION
95
If the result is small enough to fit in an int, return an int. Else return a long. >>> [factorial(n) for n in range(6)] [1, 1, 2, 6, 24, 120] >>> factorial(30) 265252859812191058636308480000000 >>> factorial(-1) Traceback (most recent call last): ... ValueError: n must be >= 0 Factorials of floats are OK, but the float must be an exact integer: >>> factorial(30.1) Traceback (most recent call last): ... ValueError: n must be exact integer >>> factorial(30.0) 265252859812191058636308480000000 It must also not be ridiculously large: >>> factorial(1e100) Traceback (most recent call last): ... OverflowError: n too large import math if not n >= 0: raise ValueError(n must be >= 0) if math.floor(n) != n: raise ValueError(n must be exact integer) if n+1 == n: # catch a value like 1e300 raise OverflowError(n too large) result = 1 factor = 2 while factor <= n: result *= factor
96
factor += 1 return result
10.2. LA DOCUMENTATION
97
98
10.2. LA DOCUMENTATION
99
100
Annexe A
1. Tim Peters (PEP no 20), traduction Ccile Trevian et Bob Cordeau. Retour chap.1 historique, p. 2
102
ANNEXE A. INTERLUDE
Le Graal de Python 1 !
arthur: Lancelot ! Lancelot ! Lancelot ! [mgaphone de police] Lancelooooooooot ! lancelot: Bloody hell, mais que se passe-t-il donc, mon Roi ? arthur: Bevedere, explique-lui ! bevedere: Nous devons te parler dun nouveau langage de programmation : Python lancelot: Nouveau ? Cela fait bien dix ans quil existe, et je ne vois pas en quoi cela va nous aider rcuprer le Saint-Graal ! bevedere: Saint-Graal, Saint-Graal... [soupir] Tu ne peux pas penser des activits plus saines que cette qute stupide de temps en temps ? arthur: [sort une massue et assomme Bevedere avec] Son explication tait mal partie de toute manire. gardes franais: Est-ce que ces messieurs les Anglais peuvent aller sentretuer plus loin ? Ne voyez-vous pas que nous sommes concentrs sur notre jeu en ligne ? arthur: Ce tunnel sous la Manche, quelle hrsie ! [racle sa gorge] Lancelot, assieds-toi, et coute-moi. (et ferme ce laptop, bloody hell !)
1. Cf. [B5] p. 131
103 lancelot: [rabat lcran de son laptop] arthur: La qute a chang. Tu dois maintenant apprendre le langage Python, et dcouvrir pourquoi il est de plus en plus pris par mes sujets. lancelot: Mais... arthur: Il ny a pas de mais ! [menace Lancelot avec sa massue] Je suis ton Roi. dot slash. Prends ce livre, et au travail ! gardes franais: Oui, au travail, et en silence !
104
ANNEXE A. INTERLUDE
Annexe B
Position du problme
Nous avons vu que lordinateur code toutes les informations quil manipule en binaire. Pour coder les nombres entiers un changement de base sut, pour les ottants, on utilise une norme (IEEE 754), mais la situation est plus complexe pour reprsenter les caractres. En eet, la grande diversit des langues humaines et de leur reprsentation ncessite un codage adapt. La premire ide est de constuire une table qui associe les symboles reprsenter un nombre (gnralement cod sur un octet) : Symbole Nombre La plus clbre est la table ASCII 1 (cf. Fig.B.1), code sur 7 bits (soit 128 codes), mais bien dautres tables ont t cres (EBCDIC, ISO-8852-1...).
La table Unicode
En Python 3, les chanes de caractres (le type str()) sont des chanes Unicode, norme dans laquelle les identiants numriques de leurs caractres sont uniques et universels.
1. American Standard Code for Information Interchange
106
Comme il sagit de direncier plusieurs centaines de milliers de caractres (on compte environ 6000 langues dans le monde) ils ne pourront videmment pas tre encods sur un seul octet. En fait, la norme Unicode ne xe aucune rgle concernant le nombre doctets ou de bits rserver pour lencodage, mais spcie seulement la valeur numrique de lidentiant associ chaque caractre (cf. Fig.B.2).
Encodage
Aprs avoir collect tous les symboles et y avoir associ un nombre, il reste leur trouver une reprsentation binaire. Pour lASCII un seul octet susait mais pour reprsenter les millions de possibilits de lUnicode, plusieurs octets par caractre sont ncessaires. Comme la plupart des textes nutilisent que la table ASCII ce qui correspond justement la partie basse de la table Unicode, lencodage le plus conomique est lUTF-8. Pour les codes 0 127, lUTF-8 utilise loctet de la table ASCII. Pour les caractres spciaux (codes 128 2047), lUTF-8 utilise 2 octets. Pour les caractres spciaux encore moins courants (codes 2048 65535), lUTF-8 utilise 3 octets, et ainsi de suite 1 . Symbole Nombre Bits Exemple de lencodage UTF-8 du caractre Unicode : 233 C3 A9
Applications pratiques
Les entres/sorties Il est important de pouvoir prciser sous quelle forme exacte les donnes sont attendues par nos programmes, que ces donnes soient fournies par lintermdiaire de frappes au clavier
1. Retour chap. 2 identiants, p. 8
107 ou par importation depuis une source quelconque. De mme, nous devons pouvoir choisir le format des donnes que nous exportons vers nimporte quel dispositif priphrique, quil sagisse dune imprimante, dun disque dur, dun cran... Pour toutes ces entres ou sorties de chanes de caractres, nous devrons donc toujours considrer quil sagit concrtement de squences doctets, et utiliser divers mcanismes pour convertir ces squences doctets en chanes de caractres, ou vice-versa. Python met dsormais votre disposition le nouveau type de donnes bytes, spciquement conu pour traiter les squences (ou chanes) doctets. Les caractres peuvent bien entendu tre encods en octets, et les octets dcods en caractres (en particulier avec lencodage UTF-8 que nous venons de voir) :
>>> chaine = Une dille\n >>> of = open(test.txt, w) # une chaine de caractres, type str() >>> of.write(chaine) 12 >>> of.close() >>> of = open(test.txt, rb) # une chaine doctets, type bytes() >>> octets = of.read() >>> type(chaine) <class str> >>> print(chaine) Une dille >>> len(chaine) 12 >>> type(octets) <class bytes> >>> print(octets) bUn \xe7\xe9ille\r\b >>> len(octets) 13
Cas des scripts Python Puisque les scripts Python que lon produit avec un diteur sont eux-mmes des textes, ils risquent dtre encods suivant direntes normes. An que Python puisse les interprter correctement, il est est utile de prcisez le jeu de caractres (obligatoirement en 1re ou 2e ligne des sources). Il faut au pralable connatre le jeu de caractres utilis par votre systme (cf. Fig.B.3).
import sys print(sys.stdout.encoding) # cp1252 (Windows XP/SciTE)
Pour viter les erreurs Unicode Pour viter les erreurs Unicode, la technique consiste indiquer lencodage au moment des entres-sorties. Par exemple :
108
Annexe C
La logique de Boole
Au 19 sicle, le logicien et mathmaticien George Boole restructura compltement la logique en un systme formel. Aujourdhui, lalgbre de Boole trouve de nombreuses applications en informatique et dans la conception des circuits lectroniques. Cest une logique deux valeurs. Soit B = {0, 1}, lensemble de dnition, sur lequel on dnit les oprateurs NON, ET et OU. Les valeurs des variables sont parfois notes False et True. Les oprateurs sont parfois nots respectivement a, a.b et a + b.
Table de vrit des oprateurs composs 1 : Oprateurs ou exclusif, quivalence et implication a 0 0 1 1 b 0 1 0 1 a XOR b a b a = b 0 1 1 1 0 1 1 0 0 0 1 1
110
Annexe D
Dnition
Dnition En arithmtique, une base n dsigne la valeur dont les puissances successives interviennent dans lcriture des nombres, ces puissances dnissant lordre de grandeur de chacune des positions occupes par les chires composant tout nombre. Par exemple : 57n = (5 n1 ) + (7 n0 )
Certaines bases sont couramment employes : la base 2 (systme binaire), en lectronique numrique et informatique ; la base 8 (systme octal), en informatique ; la base 16 (systme hexadcimal), frquente en informatique ; la base 60 (systme sexagsimal), dans la mesure du temps et des angles.
Conversion
Dnition Les changements de base : un nombre dans une base n donne scrit sous la forme daddition des puissances successives de cette base 1 .
Exemples
112
Annexe E
Principe
Cest une application f qui prend en entre des chiers de longueur dirente, les condense, et fournit en sortie une squence binaire de longueur xe (cf. Fig.E.1) : f : {0, 1} {0, 1}k o f applique lensemble des squences binaires : {0, 1} = {, 0, 1, 10, 11, 100, 101, ...} sur lensemble des squences binaires de k bits : {0, 1}k = {0...00, 0..01, 0...10, ..., 1...11}. Cette application doit permettre didentier les chiers en entre : f (x) = f (y) sera vrai si et seulement si x = y. Par contre, cause de la longueur nie de k, on ne peut pas reconstituer les chiers : il existe deux valeurs x et y direntes (chiers distincts), telles que f (x) = f (y) (mme squence binaire). On parle alors de collision.
Ralisation pratique
Il faut rsoudre deux problmes : diminuer le nombre de collisions en choisissant une squence binaire assez longue. Avec, par exemple, k = 512, on obtient 2512 soit environ 10154 cellules disponibles. grer les collisions restantes par un algorithmes appropri. Application aux dictionnaires On dispose dun espace mmoire S pour stocker m donnes. On peut accder chaque donne par une notation associative o linformation entre crochets sappelle la cl : S[0], S[1], ..., S[m 1].
114
Figure E.2 Hachage des cls dun dictionnaire. Par exemple avec des cls de caractres, on utilisera une fonction de hachage ainsi dnie : f : {a, b, c, ..., z} {0, 1, 2, ..., m 1}
1
Soit stocker les informations suivantes dans un dictionnaire (cf. Fig.E.2) : lapin renard hrisson ours 12 2 4 1
Annexe F
7. crire un programme qui estime la valeur de la constante mathmatique e en utilisant la formule : n 1 e= i! i=0 Pour cela, dnissez la fonction factorielle et, dans votre programme principal, saisissez lordre n et achez lapproximation correspondante de e. 8. Un gardien de phare va aux toilettes cinq fois par jour or les WC sont au rez-dechausse. . . crire une procdure (donc sans retour) hauteurparcourue qui reoit deux paramtres le nombre de marches du phare et la hauteur de chaque marche (en cm), et qui ache :
116
On noubliera pas : quune semaine comporte 7 jours ; quune fois en bas, le gardien doit remonter ; que le rsultat est exprimer en m. 9. Un permis de chasse points remplace dsormais le permis de chasse traditionnel. Chaque chasseur possde au dpart un capital de 100 points. Sil tue une poule il perd 1 point, 3 points pour un chien, 5 points pour une vache et 10 points pour un ami. Le permis cote 200 . crire une fonction amende qui reoit le nombre de victimes du chasseur et qui renvoie la somme due. Utilisez cette fonction dans un programme principal qui saisit le nombre de victimes et qui ache la somme que le chasseur doit dbourser. 10. Je suis ligot sur les rails en gare dArras. crire un programme qui ache un tableau me permettant de connatre lheure laquelle je serai dchiquet par le train parti de la gare du Nord 9h (il y a 170 km entre la gare du Nord et Arras). Le tableau prdira les direntes heures possibles pour toutes les vitesses de 100 km/h 300 km/h, par pas de 10 km/h, les rsultats tant arrondis la minute infrieure. crire une procdure tchacatchac qui reoit la vitesse du train et qui ache lheure du drame ; crire le programme principal qui ache le tableau demand. 11. Un programme principal saisit une chane dADN valide et une squence dADN valide ( valide signie quelles ne sont pas vides et sont formes exclusivement dune combinaison arbitraire de a, t, g ou c). crire une fonction valide qui renvoie vrai si la saisie est valide, faux sinon. crire une fonction saisie qui eectue une saisie valide et renvoie la valeur saisie sous forme dune chane de caractres. crire une fonction proportion qui reoit deux arguments, la chane et la squence et qui retourne la proportion de squence dans la chane (cest--dire son nombre doccurrences). Le programme principal appelle la fonction saisie pour la chane et pour la squence et ache le rsultat. Exemple dachage : Il y a 13.33 % de ca dans votre chane. 12. Il sagit dcrire, dune part, un programme principal et, dautre part, une fonction utilise dans le programme principal. La fonction listAleaInt(n, a, b) retourne une liste de n entiers alatoires dans [a .. b] en utilisant la fonction randint(a, b) du module random. Dans le programme principal : construire la liste en appelant la fonction listAleaInt() ; calculer lindex de la case qui contient le minimum ; changez le premier lment du tableau avec son minimum.
117 13. Comme prcdemment, il sagit dcrire, dune part, un programme principal et, dautre part, une fonction utilise dans le programme principal. La fonction listAleaFloat(n) retourne une liste de n ottants alatoires en utilisant la fonction random() du module random. Dans le programme principal : Saisir un entier n dans lintervalle : [2 .. 100] ; construire la liste en appelant la fonction listAleaFloat() ; acher lamplitude du tabeau (cart entre sa plus grande et sa plus petite valeur) ; acher la moyenne du tableau. 14. Fonction renvoyant plusieurs valeurs sous forme dun tuple. crire une fonction minMaxMoy qui reoit une liste dentiers et qui renvoie le minimum, le maximum et la moyenne de cette liste. Le programme principal appellera cette fonction avec la liste : [10, 18, 14, 20, 12, 16]. 15. Saisir un entier entre 1 et 3999 (pourquoi cette limitation ?). Lacher en nombre romain. 16. Amliorer le script prcdent en utilisant la fonction zip().
17. Un tableau contient n entiers (2 < n < 100) alatoires tous compris entre 0 et 500. Vrier quils sont tous dirents. 18. Lutilisateur donne un entier n entre 2 et 12, le programme donne le nombre de faons de faire n en lanant deux ds. 19. Mme problme que le prcdent mais avec n entre 3 et 18 et trois ds. 20. Gnralisation des deux questions prcdentes. Lutilisateur saisit deux entres, dune part le nombre de ds, nbd (que lon limitera pratiquement 10) et, dautre part la somme, s, comprise entre nbd et 6.nbd. Le programme calcule et ache le nombre de faons de faire s avec les nbd ds. 21. Mme problme que le prcdent mais cod rcursivement. 22. Nombres parfaits et nombres chanceux. On appelle nombre premier tout entier naturel suprieur 1 qui possde exactement deux diviseurs, lui-mme et lunit. On appelle diviseur propre de n, un diviseur quelconque de n, n exclu. Un entier naturel est dit parfait sil est gal la somme de tous ses diviseurs propres. Les nombres a tels que : (a+n+n2 ) est premier pour tout n tel que 0 n < (a1), sont appels nombres chanceux. crire un module (parfait_chanceux_m.py) dnissant quatre fonctions : somDiv, estParfait, estPremier, estChanceux et un auto-test : la fonction somDiv retourne la somme des diviseurs propres de son argument ; les trois autres fonctions vrient la proprit donne par leur dnition et retourne un boolen. Plus prcisment, si par exemple la fonction estPremier vrie que son argument est premier, elle retourne True, sinon elle retourne False. La partie de test doit comporter quatre appels la fonction verif permettant de tester somDiv(12), estParfait(6), estPremier(31) et estChanceux(11). Puis crire le programme principal (parfait_chanceux.py) qui comporte :
118
ANNEXE F. EXERCICES CORRIGS linitialisation de deux listes : parfaits et chanceux ; une boucle de parcours de lintervalle [2, 1000] incluant les tests ncessaires pour remplir ces listes ; enn lachage de ces listes.
119
if n%2 == 0: print(n, est pair.) else: print(n, est impair.) # -*- coding: utf-8 -*Nombre de fois quun entier est divisible par 2. # programme principal ----------------------------------------------n = int(input(Entrez un entier strictement positif : )) while n < 1: n = int(input(Entrez un entier STRICTEMENT POSITIF, s.v.p. : )) save = n cpt = 0 while n%2 == 0: n /= 2 cpt += 1 print(save, est, cpt, fois divisible par 2.) # -*- coding: utf-8 -*Diviseurs propres dun entier. # programme principal ----------------------------------------------n = int(input(Entrez un entier strictement positif : )) while n < 1: n = int(input(Entrez un entier STRICTEMENT POSITIF, s.v.p. : )) i = 2 cpt = 0 p = n/2 # plus petit diviseur possible de n # initialise le compteur de divisions # calcul une fois dans la boucle
print(Diviseurs propres sans rptition de , n, :, end= ) while i <= p: if n%i == 0: cpt += 1 print(i, end= ) i += 1 if not cpt: print(aucun ! Il est premier.) else: print((soit, cpt, diviseurs propres)) # -*- coding: utf-8 -*Approximation de e. # fonction def fact(n): r = 1 for i in range(1, n+1): r *= i return r # programme principal ----------------------------------------------n = int(input(n ? ))
120
exp = 0.0 for i in range(n): exp = exp + 1.0/fact(i)
print(Approximation de e : {:.3f}.format(exp)) # -*- coding: utf-8 -*Gardien de phare. # fonction def hauteurParcourue(nb, h): print(Pour {:d} marches de {:d} cm, il parcourt {:.2f} m par semaine..format(nb, h, nb*h*2*5*7/100.0)) # programme principal ----------------------------------------------nbMarches = int(input(Combien de marches ? )) hauteurMarche = int(input(Hauteur dune marche (cm) ? )) hauteurParcourue(nbMarches, hauteurMarche) # -*- coding: utf-8 -*Permis de chasse. # fonction def permisSup(p, c, v, a): pointsPerdus = p + 3*c + 5*v + 10*a nbrePermis = pointsPerdus/100.0 return 200*nbrePermis # programme principal ----------------------------------------------poules = int(input(Combien de poules ? )) chiens = int(input(Combien de chiens ? )) vaches = int(input(Combien de vaches ? )) amis = int(input(Combien damis ? )) payer = permisSup(poules, chiens, vaches, amis) print(\nA payer :, end= ) if payer == 0: print(rien payer) else: print(payer, euros) # -*- coding: utf-8 -*Histoire de train. # fonction def tchacatchac(v): Affiche lheure du drame. heure = 9 + int(170/v) minute = (60 * 170 / v) % 60 print(A, v, km/h, je me fais dchiqueter , heure, h, minute, min.) # programme principal ----------------------------------------------i = 100 while i <= 300: tchacatchac(i) i += 10
121
# -*- coding: utf-8 -*Proportion dune squence dans une chane dADN. # fonctions def valide(seq): Retourne vrai si la squence est valide, faux sinon. ret = any(seq) for c in seq: ret = ret and c in atgc return ret def proportion(a, s): Retourne la proportion de la squence <s> dans la chane <a>. return 100*a.count(s)/len(a) def saisie(ch): s = input({:s} : .format(ch)) while not valide(s): print({:s} ne peut contenir que les chanons a, t, g et c et ne doit pas tre vide.format(ch)) s = input({:s} : .format(ch)) return s # programme principal ----------------------------------------------adn = saisie(chane) seq = saisie(squence) print(Il y a {:.2f} % de {:s} dans votre chane. .format(proportion(adn, seq), seq)) # -*- coding: utf-8 -*Echanges. # imports from random import seed, randint # fonction def listAleaInt(n, a, b): Retourne une liste de <n> entiers alatoires dans [<a> .. <b>]. return [randint(a, b) for i in range(n)] # programme principal ----------------------------------------------seed() # initialise le gnrateur de nombres alatoires t = listAleaInt(100, 2, 125) # construction de la liste # calcul de lindex du minimum de la liste iMin = t.index(min(t)) print(Avant change :) print(\tt[0] =, t[0], \tt[iMin] =, t[iMin]) t[0], t[iMin] = t[iMin], t[0] # change print(Apres change :) print(\tt[0] =, t[0], \tt[iMin] =, t[iMin]) # -*- coding: utf-8 -*-
122
Amplitude et moyenne dune liste de flottants. # imports from random import seed, random # fonctions def listAleaFloat(n): Retourne une liste de <n> flottants alatoires return [random() for i in range(n)] # programme principal ----------------------------------------------n = int(input(Entrez un entier [2 .. 100] : )) while not(n >= 2 and n <= 100): n = int(input(Entrez un entier [2 .. 100], s.v.p. : )) seed() # initialise le gnrateur de nombres alatoires t = listAleaFloat(n) # construction de la liste print(Amplitude : {:.2f}.format(max(t) - min(t))) print(Moyenne : {:.2f}.format(sum(t)/n)) # -*- coding: utf-8 -*Min, max et moyenne dune liste dentiers. # fonction def minMaxMoy(liste): Renvoie le min, le max et la moyenne de la liste. min, max, som = liste[0], liste[0], float(liste[0]) for i in liste[1:]: if i < min: min = i if i > max: max = i som += i return (min, max, som/len(liste)) # programme principal ----------------------------------------------lp = [10, 18, 14, 20, 12, 16] print(liste =, lp) l = minMaxMoy(lp) print(min : {0[0]}, max : {0[1]}, moy : {0[2]}.format(l)) # -*- coding: utf-8 -*Nombres romains (version 1). # programme principal ----------------------------------------------n = int(input(Entrez un entier [1 .. 4000[ : )) while not(n >= 1 and n < 4000): n = int(input(Entrez un entier [1 .. 4000[, s.v.p. : )) s = # Chane rsultante while n >= 1000: s += M n -= 1000 if n >= 900: s += CM
123
n -= 900 if n >= 500: s += D n -= 500 if n >= 400: s += CD n -= 400 while n >= 100: s += C n -= 100 if n >= 90: s += XC n -= 90 if n >= 50: s += L n -= 50 if n >= 40: s += XL n -= 40 while n >= 10: s += X n -= 10 if n >= 9: s += IX n -= 9 if n >= 5: s += V n -= 5 if n >= 4: s += IV n -= 4 while n >= 1: s += I n -= 1 print(En romain :, s) # -*- coding: utf-8 -*Nombres romains (version 2). # globales code = zip( [1000,900 ,500,400 ,100,90 ,50 ,40 ,10 ,9 ,5 ,4 ,1], [M ,CM,D,CD,C,XC,L,XL,X,IX,V,IV,I] ) # fonction
124
def decToRoman(num): res = [] for d, r in code: while num >= d: res.append(r) num -= d return .join(res)
# programme principal ----------------------------------------------for i in range(1, 4000): print(i, decToRoman(i)) # -*- coding: utf-8 -*Liste dentiers diffrents. # imports from random import seed, randint # fonction def listAleaInt(n, a, b): Retourne une liste de <n> entiers alatoires entre <a> et <b>. return [randint(a, b) for i in range(n)] # programme principal ----------------------------------------------n = int(input(Entrez un entier [1 .. 100] : )) while not(n >= 1 and n <= 100): n = int(input(Entrez un entier [1 .. 100], s.v.p. : )) # construction de la liste seed() # initialise le gnrateur de nombres alatoires t = listAleaInt(n, 0, 500) # Sont-ils diffrents ? tousDiff = True i = 0 while tousDiff and i < (n-1): j = i + 1 while tousDiff and j < n: if t[i] == t[j]: tousDiff = False else: j += 1 i += 1 print(\n, t, end= ) if tousDiff: print(: tous les lments sont distincts.) else: print(: au moins une valeur est rpte.) # -*- coding: utf-8 -*Jeu de ds (1). # programme principal ----------------------------------------------n = int(input(Entrez un entier [2 .. 12] : )) while not(n >= 2 and n <= 12): n = int(input(Entrez un entier [2 .. 12], s.v.p. : )) s = 0
125
for i in range(1, 7): for j in range(1, 7): if i+j == n: s += 1 print(Il y a {:d} faon(s) de faire {:d} avec deux ds..format(s, n)) # -*- coding: utf-8 -*Jeu de ds (2). # programme principal ----------------------------------------------n = int(input(Entrez un entier [3 .. 18] : )) while not(n >= 3 and n <= 18): n = int(input(Entrez un entier [3 .. 18], s.v.p. : )) s = 0 for i in range(1, 7): for j in range(1, 7): for k in range(1, 7): if i+j+k == n: s += 1 print(Il y a {:d} faon(s) de faire {:d} avec trois ds..format(s, n) ) # -*- coding: utf-8 -*Jeu de ds (3). # globale MAX = 8 # programme principal ----------------------------------------------nbd = int(input(Nombre de ds [2 .. {:d}] : .format(MAX))) while not(nbd >= 2and nbd <= MAX): nbd = int(input(Nombre de ds [2 .. {:d}], s.v.p. : .format(MAX))) s = int(input(Entrez un entier [{:d} .. {:d}] : .format(nbd, 6*nbd))) while not(s >= nbd and s <= 6*nbd): s = int(input(Entrez un entier [{:d} .. {:d}], s.v.p. : .format( nbd, 6*nbd))) if s == nbd or s == 6*nbd: cpt = 1 # 1 seule solution else: I = [1]*nbd # initialise une liste de <nbd> ds cpt, j = 0, 0 while j < nbd: som = sum([I[k] for k in range(nbd)]) if som == s: cpt += 1 # compteur de bonnes solutions if som == 6*nbd: break j = 0 if I[j] < 6: I[j] += 1 else: while I[j] == 6:
126
I[j] = 1 j += 1 I[j] += 1
print(Il y a {:d} faons de faire {:d} avec {:d} ds..format(cpt, s, nbd)) # -*- coding: utf-8 -*Jeu de ds (rcursif). # globale MAX = 8 # fonction def calcul(d, n): Calcul rcursif du nombre de faons de faire <n> avec <d> ds. resultat, debut = 0, 1 if (d == 1) or (n == d) or (n == 6*d): # conditions terminales return 1 else: # sinon appels rcursifs if n > 6*(d-1): # optimisation importante debut = n - 6*(d-1) for i in range(debut, 7): if n == i: break resultat += calcul(d-1, n-i) return resultat # programme principal ----------------------------------------------d = int(input(Nombre de ds [2 .. {:d}] : .format(MAX))) while not(d >= 2and d <= MAX): d = int(input(Nombre de ds [2 .. {:d}], s.v.p. : .format(MAX))) n = int(input(Entrez un entier [{:d} .. {:d}] : .format(d, 6*d))) while not(n >= d and n <= 6*d): n = int(input(Entrez un entier [{:d} .. {:d}], s.v.p. : .format(d, 6*d))) print(Il y a {:d} faon(s) de faire {:d} avec {:d} ds..format(calcul (d, n), n, d)) # -*- coding: utf-8 -*module dexemple de polymorphisme. # classes class Rectangle: classe des rectangles. def __init__(self, longueur=30, largeur=15): Constructeur avec valeurs par dfaut. self.lon = longueur self.lar = largeur self.nom = rectangle def surface(self): Calcule la surface dun rectangle. return self.lon*self.lar def __str__(self):
127
Affichage des caractristiques dun rectangle. return \nLe {:s} de cts {:s} et {:s} a une surface de {:s} .format(self.nom, self.lon, self.lar, self.surface()) class Carre(Rectangle): classe des carrs (hrite de Rectangle). def __init__(self, cote=10): Constructeur avec valeur par dfaut Rectangle.__init__(self, cote, cote) self.nom = carr # surchage dattribut dinstance # Auto-test --------------------------------------------------------if __name__ == __main__: r = Rectangle(12, 8) print r c = Carre() print c
128
Annexe G
Ressources
Webographie
Les sites gnraux : www.python.org pypi.python.org/pypi www.pythonxy.com/download.php rgruet.free.fr Les EDI spcialiss : www.wingware.com/downloads/wingide-101 eric-ide.python-projects.org/eric4-download.html www.eclipse.org/downloads/ www.scintilla.org/SciTEDownload.html Les outils : sourceforge.net/projects/gnuplot/les/ Labrg Python 3.1 en un recto/verso : perso.limsi.fr/pointal/python :abrege Le lien des liens : perso.limsi.fr/pointal/liens :langage_python
130
ANNEXE G. RESSOURCES
Bibliographie
[B1] Swinnen, Grard, Apprendre programmer avec Python 3, Eyrolles, 2010. [B2] Summereld, Mark, Programming in Python 3, Addison-Wesley, 2e dition, 2009. [B3] Martelli, Alex, Python en concentr, OReilly, 2004. [B4] Lutz, Mark et Bailly, Yves, Python prcis et concis, OReilly, 2e dition, 2005. [B5] Ziad, Tarek, Programmation Python. Conception et optimisation, Eyrolles, 2e dition, 2009. [B6] Ziad, Tarek, Python : Petit guide lusage du dveloppeur agile, Dunod, 2007. [B7] Ziad, Tarek, Expert Python Programming, Packt Publishing, 2008. [B8] Younker, Je, Foundations of Agile Python Development, Apress, 2008.
A [B9] Chevalier Cline et collectif, LT X pour limpatient, H & K, 3e dition, 2009. E A [B10] Carella, David, Rgles typographiques et normes. Mise en pratique avec LT X, Vuibert, E 2006.
131
132
BIBLIOGRAPHIE
Annexe H
Glossaire
Lexique bilingue
>>> Invite Python par dfaut dans un shell interactif. Souvent utilise dans les exemples de code extraits de sessions de linterprteur Python. ... Invite Python par dfaut dans un shell interactif, utilise lorsquil faut entrer le code dun bloc indent ou lintrieur dune paire de parenthses, crochets ou accolades. 2to3 Un outil qui essaye de convertir le code Python 2.x en code Python 3.x en grant la plupart des incompatibilits quil peut dtecter. 2to3 est disponible dans la bibliothque standard lib2to2 ; un point dentre autonome est Tool/scipts/2to3. Voir 2to3 Automated Python 2 to 3 code translation. abstract base class ABC (classe de base abstraite) Complte le duck-typing en fournissant un moyen de dnir des interfaces alors que dautres techniques (comme hasattt()) sont plus lourdes. Python fournit de base plusieurs ABC pour les structures de donnes (module collections), les nombres (module numbers) et les ux (module io). Vous pouvez crer votre propre ABC en utilisant le module abc. argument (argument) Valeur passe une fonction ou une mthode, aecte une variable nomme locale au corps de la fonction. Une fonction ou une mthode peut avoir la fois des arguments par position et avec des valeurs par dfaut. Ces arguments peuvent tre de multiplicit variable : * accepte ou fournit plusieurs arguments par position dans une liste, tandis que ** joue le mme rle en utilisant les valeurs par dfaut dans un dictionnaire. On peut passer toute expression dans la liste darguments, et la valeur value est transmise la variable locale. attribute (attribut) Valeur associe un objet rfrenc par un nom et une expression pointe. Par exemple, lattribut a dun objet o peut tre rfrenc o.a. BDFL Benevolent Dictator For Life, cest--dire Guido van Rossum, le crateur de Python. bytecode (bytecode ou langage intermdiaire) Le code source Python est compil en bytecode, reprsentation interne dun programme Python dans linterprteur. Le bytecode est galement rang dans des chiers .pyc et .pyo, ainsi lexcution dun mme chier est plus rapide les fois ultrieures (la compilation du source en bytecode peut tre vite). On dit que le bytecode tourne sur une machine virtuelle qui, essentiellement, se rduit une collection dappels des routines correspondant chaque code du bytecode. class (classe) Modle permettant de crer ses propres objets. Les dnitions de classes contiennent normalement des dnitions de mthodes qui oprent sur les instances de classes.
134
ANNEXE H. GLOSSAIRE
coercion (coercition ou transtypage) Conversion implicite dune instance dun type dans un autre type dans une opration concernant deux arguments de types compatibles. Par exemple, int(3.15) convertit le nombre ottant 3.15 en lentier 3, mais dans 3+4.5, chaque argument est dun type dirent (lun int et lautre float) et tous deux doivent tre convertis dans le mme type avant dtre additionns, sinon une exception TypeError sera lance. Sans coercition, tous les arguments, mme de types compatibles, doivent tre normaliss la mme valeur par le programmeur, par exemple, float(3)+4.5 au lieu de simplement 3+4.5. complex number (nombre complexe) Une extension du systme familier des nombres rels dans laquelle tous les nombres sont exprims comme la somme dune partie relle et une partie imaginaire. Les nombres imaginaires sont des multiples rels de lunit imaginaire (la racine carre de -1), souvent crite i par les mathmaticiens et j par les ingnieurs. Python a un traitement incorpor des nombres complexes, qui sont crits avec cette deuxime notation ; la partie imaginaire est crite avec un suxe j, par exemple 3+1j. Pour avoir accs aux quivalents complexes des lments du module math utilisez le module cmath. Lutilisation des nombres complexes est une possibilit mathmatique assez avance. Si vous ntes pas certain den avoir besoin vous pouvez les ignorer sans risque. context manager (gestionnaire de contexte) Objet qui contrle lenvironnement indiqu par linstruction with et qui dnit les mthodes __enter__() et __exit__(). Voir la PEP 343. CPython (Python classique) Implmentation canonique du langage de programmation Python. Le terme CPython est utilis dans les cas o il est ncessaire de distinguer cette implmentation dautres comme Jython ou IronPython. decorator (dcorateur) Fonction retournant une autre fonction habituellement applique comme une transformation utilisant la syntaxe @wrapper. classmethod() et staticmethod() sont des exemples classiques de dcorateurs. Les deux dnitions de fonctions suivantes sont smantiquement quivalentes :
def f(...): ... f = staticmethod(f) @staticmethod def f(...): ...
Un concept identique existe pour les classes mais est moins utilis. Voir la documentation function denition et class denition pour plus de dtails sur les dcorateurs. descriptor (descripteur) Tout objet qui dnit les mthodes __get__(), __set__() ou __delete__(). Lorsquun attribut dune classe est un descripteur, un comportement spcique est dclench lors de la consultation de lattribut. Normalement, crire a.b consulte lobjet b dans le dictionnaire de la classe de a, mais si b est un descripteur, la mthode __get__() est appele. Comprendre les descripteurs est fondamental pour la comprhension profonde de Python, car ils sont la base de nombreuses caractristiques, comme les fonctions, les mthodes, les proprits, les mthodes de classe, les mthodes statiques et les rfrences aux super-classes. Pour plus dinformations sur les mthodes des descripteurs, voir Implementing Descriptors.
135 dictionary (dictionnaire) Une table associative, dans laquelle des cls arbitraires sont associes des valeurs. Lutilisation des objets dict ressemble beaucoup celle des objets list, mais les cls peuvent tre nimporte quels objets ayant une fonction __hash__(), non seulement des entiers. Ces tables sont appeles hash en Perl. docstring (chane de documentation) Chane littrale apparaissant comme premire expression dune classe, dune fonction ou dun module. Bien quignore lexcution, elle est reconnue par le compilateur et incluse dans lattribut __doc__ de la classe, de la fonction ou du module qui la contient. Depuis quelle est disponible via linstrospection, cest lendroit canonique pour documenter un objet. duck-typing (typage comme un canard ) Style de programmation pythonique dans lequel on dtermine le type dun objet par inspection de ses mthodes et attributs plutt que par des relations explicites des types ( sil ressemble un canard et fait coin-coin comme un canard alors ce doit tre un canard ). En mettant laccent sur des interfaces plutt que sur des types spciques on amliore la exibilit du code en permettant la substitution polymorphe. Le duck-typing vite les tests qui utilisent type() ou isinstance() (notez cependant que le duck-typing doit tre complt par lemploi des classes de base abstraites). la place, il emploie des tests comme hasattr() et le style de programmation EAFP. EAFP (Easier to ask for forgiveness than permission, ou plus facile de demander pardon que la permission ). Ce style courant de programmation en Python consiste supposer lexistence des cls et des attributs ncessaires lexcution dun code et attraper les exceptions qui se produisent lorsque de telles hypothses se rvlent fausses. Cest un style propre et rapide, caractris par la prsence de nombreuses instructions try et except. Cette technique contraste avec le style LBYL, courant dans dautres langages comme le C. expression (expression) Fragment de syntaxe qui peut tre valu. Autrement dit, une expression est une accumulation dlments dexpression comme des littraux, des noms, des accs aux attributs, des oprateurs ou des appels des fonctions retournant une valeur. linverse de beaucoup dautres langages, toutes les constructions de Python ne sont pas des expressions. Les instructions ne peuvent pas tre utilises comme des expressions (par exemple if). Les aectations sont aussi des instructions, pas des expressions. extension module (module dextention) Module crit en C ou en C++, utilisant lAPI C de Python, qui interagit avec le cur du langage et avec le code de lutilisateur. nder Objet qui essaye de trouver le loader (chargeur) dun module. Il doit implmenter une mthode nomme find_module(). Voir la PEP 302 pour des dtails et importlib.abc.Finder pour une classe de base abstraite. oor division (division entire) Division mathmatique qui laisse tomber le reste. Loprateur de division entire est //. Par exemple, lexpression 11//4 est value 2, par opposition la division ottante qui retourne 2.75. function (fonction) Suite dinstructions qui retourne une valeur lappelant. On peut lui passer zro ou plusieurs arguments qui peuvent tre utiliss dans le corps de la fonction. Voir aussi argument et method. __future__ Un pseudo-module que les programmeurs peuvent utiliser pour permettre les nouvelles fonctionnalits du langage qui ne sont pas compatibles avec linterprteur couramment employ.
136
ANNEXE H. GLOSSAIRE En important __future__ et en valuant ses variables, vous pouvez voir quel moment une caractristique nouvelle a t ajoute au langage et quand est-elle devenue la fonctionnalit par dfaut :
>>> import __future__ >>> __future__.division _Feature((2, 2, 0, alpha, 2), (3, 0, 0, alpha, 0), 8192)
garbage collection (gestion automatique de la mmoire) Processus de libration de la mmoire quand elle nest plus utilise. Python excute cette gestion en comptant les rfrences et en dtectant et en cassant les rfrences cycliques. generator (fonction gnrateur) Une fonction qui renvoie un itrateur. Elle ressemble une fonction normale, except que la valeur de la fonction est rendue lappelant en utilisant une instruction yield au lieu dune instruction return. Les fonctions gnrateurs contiennent souvent une ou plusieurs boucles for ou while qui cdent des lments lappelant. Lexcution de la fonction est stoppe au niveau du mot-cl yield, en renvoyant un rsultat, et elle est reprise lorsque llment suivant est requis par un appel de la mthode next() de litrateur. generator expression (expression gnrateur) Une expression qui renvoie un gnrateur. Elle ressemble une expression normale suivie dune expression for dnissant une variable de contrle, un intervalle et une expression if facultative. Toute cette expression combine produit des valeurs pour une fonction englobante :
>>> sum(i*i for i in range(10)) # somme des carrs 0, 1, 4, ... 81 285
GIL Voir global interpreter lock. global interpreter lock (verrou global de linterprteur) Le verrou utilis par les threads Python pour assurer quun seul thread tourne dans la machine virtuelle CPython un instant donn. Il simplie Python en garantissant que deux processus ne peuvent pas accder en mme temps une mme mmoire. Bloquer linterprteur tout entier lui permet dtre multi-thread aux frais du paralllisme du systme environnant. Des eorts ont t faits par le pass pour crer un interprteur free-threaded (o les donnes partages sont verrouilles avec une granularit ne), mais les performances des programmes en souraient considrablement, y compris dans le cas des programmes mono-thread. hashable (hachable) Un objet est hachable sil a une valeur de hachage constante au cours de sa vie (il a besoin dune mthode __hash__()) et sil peut tre compar dautres objets (il a besoin dune mthode __eq__()). Les objets hachables compars gaux doivent avoir la mme valeur de hachage. Lhachabilit rend un objet propre tre utilis en tant que cl dun dictionnaire ou membre dun ensemble (set), car ces structures de donnes utilisent la valeur de hachahge de faon interne. Tous les objets de base Python non modiables (immutable) sont hachables, alors que certains conteneurs comme les listes ou les dictionnaires sont modiables. Les objets instances des classes dnies par lutilisateur sont hachables par dfaut ; ils sont tous ingaux (dirents) et leur valeur de hachage est leur id(). IDLE Un environnement de dveloppement intgr pour Python. IDLE est un diteur basique et un environnement dinterprtation ; il est donn avec la distribution standard
137 de Python. Excellent pour les dbutants, il peut aussi servir dexemple pas trop sophistiqu pour tous ceux qui doivent implmenter une application avec interface utilisateur graphique multi-plate-forme. immutable (immuable) Un objet avec une valeur xe. Par exemple, les nombres, les chanes, les tuples. De tels objets ne peuvent pas tre altrs ; pour changer de valeur un nouvel objet doit tre cr. Les objets immuables jouent un rle important aux endroits o une valeurs de hash constantes est requise, par exemple pour les cls des dictionnaires. importer Objet qui la fois trouve et charge un module. Cest la fois un objet nder et un objet loader. interactive (interactif) Python possde un interprteur interactif, ce qui signie que vous pouvez essayer vos ides et voir immdiatement les rsultats. Il sut de lancer python sans argument (ventuellement en le slectionnant dans un certain menu principal de votre ordinateur). Cest vraiment un moyen puissant pour tester les ides nouvelles ou pour inspecter les modules et les paquetages (pensez help(x)). interpreted (interprt) Python est un langage interprt, par opposition aux langages compils, bien que cette distinction puisse tre oue cause de la prsence du compilateur de bytecode. Cela signie que les chiers source peuvent tre directement excuts sans avoir besoin de crer pralablement un chier binaire excut ensuite. Typiquement, les langages interprts ont un cycle de dveloppement et de mise au point plus court que les langages compils mais leurs programmes sexcutent plus lentement. Voir aussi interactive. iterable Un objet conteneur capable de renvoyer ses membres un par un. Des exemples diterable sont les types squences (comme les list, les str, et les tuple) et quelques types qui ne sont pas des squences, comme les objets dict, les objets file et les objets de nimporte quelle classe que vous dnissez avec une mthode __iter__() ou une mthode __getitem__(). Les iterables peuvent tre utiliss dans les boucles for et dans beaucoup dautres endroits o une squence est requise (zip(), map(), ...). Lorsquun objet iterable est pass comme argument la fonction incorpore iter() il renvoie un itrateur. Cet itrateur est un bon moyen pour eectuer un parcours dun ensemble de valeurs. Lorsquon utilise des iterables, il nest gnralement pas ncesaire dappeler la fonction iter() ni de manipuler directement les valeurs en question. Linstruction for fait cela automatiquement pour vous, en crant une variable temporaire sans nom pour grer litrateur pendant la dure de litration. Voir aussi iterator, sequence, et generator. iterator (itrateur) Un objet reprsentant un ot de donnes. Des appels rpts la mthode __next__() de litrateur (ou la fonction de base next()) renvoient des lments successifs du ot. Lorsquil ny a plus de donnes disponibles dans le ot, une exception StopIteration est lance. ce moment-l, lobjet itrateur est puis et tout appel ultrieur de la mthode next() ne fait que lancer encore une exception StopIteration. Les itrateurs doivent avoir une mthode __iter__() qui renvoie lobjet itrateur lui-mme. Ainsi un itrateur est itratif et peut tre utilis dans beaucoup dendroits o les iterables sont accepts ; une exception notable est un code qui tenterait des itrations multiples. Un objet conteneur (comme un objet list) produit un nouvel itrateur chaque fois quil est pass la fonction iter() ou bien utilis dans une boucle for. Si on fait cela avec un itrateur on ne rcuprera que le mme itrateur puis utilis dans le parcours prcdent, ce qui fera apparatre le conteneur comme sil tait vide.
138
ANNEXE H. GLOSSAIRE
keyword argument (argument avec valeur par dfaut) Argument prcd par variable_name= dans lappel. Le nom de la variable dsigne le nom local dans la fonction auquel la valeur est aecte. ** est utilis pour accepter ou passer un dictionnaire darguments avec ses valeurs. Voir argument. lambda Fonction anonyme en ligne ne comprenant quune unique expression value lappel. Syntaxe de cration dune fonction lambda :
lambda[arguments]: expression
LBYL (Look before you leap ou regarder avant dy aller ). Ce style de code teste explicitement les pr-conditions avant deectuer un appel ou une recherche. Ce style soppose lapproche EAFP et est caractris par la prsence de nombreuses instructions if. list (liste) Squence Python de base. En dpit de son nom, elle ressemble plus au tableau dautres langages qu une liste chane puisque laccs ses lments est en O(1). list comprehension (liste en intention) Une manire compacte deectuer un traitement sur un sous-ensemble dlments dune squence en renvoyant une liste avec les rsultats. Par exemple :
result = [0x%02x % x for x in range(256) if x % 2 == 0]
engendre une liste de chanes contenant les critures hexadcimales des nombres impairs de lintervalle de 0 255. La clause if est facultative. Si elle est omise, tous les lments de lintervalle range(256) seront traits. loader (chargeur) Objet qui charge un module. Il doit possder une mthode load_module(). un loader est typiquement fournit par un nder. Voir la PEP 302 pour les dtails et voir importlib.abc.Loader pour une classe de base abstraite. mapping (liste associative) Un objet conteneur (comme dict) qui supporte les recherches par des cls arbitraires en utilisant la mthode spciale __getitem__(). metaclass La classe dune classe. La dnition dune classe cre un nom de classe, un dictionnaire et une liste de classes de base. La mtaclasse est responsable de la cration de la classe partir de ces trois lments. Beaucoup de langages de programmation orients objets fournissent une implmentation par dfaut. Une originalit de Python est quil est possible de crer des mtaclasses personnalises. Beaucoup dutilisateurs nauront jamais besoin de cela mais, lorsque le besoin apparat, les mtaclasses fournissent des solutions puissantes et lgantes. Elles sont utilises pour enregistrer les accs aux attributs, pour ajouter des treads scuriss, pour dtecter la cration dobjet, pour implmenter des singletons et pour bien dautres tches. Plus dinformations peuvent tre trouves dans Customizing class creation. method (mthode) Fonction dnie dans le corps dune classe. Appele comme un attribut dune instance de classe, la mthode prend linstance dobjet en tant que premier argument (habituellement nomm self). Voir function et nested scope. mutable (modiable) Les objets modiables peuvent changer leur valeur tout en conservant leur id(). Voir aussi immutable. named tuple (tuple nomm) Toute classe de pseudo-tuples dont les lments indexables sont galement accessibles par des attributs nomms (par exemple time.localtime() retourne un objet pseudo-tuple o lanne est accessible soit par un index comme t[0] soit par un attribut nomm comme t.tm_year. Un tuple nomm peut tre un type de base comme time.struct_time ou il peut
139 tre cr par une dnition de classe ordinaire. Un tuple nomm peut aussi tre cr par la fonction fabrique collections.nametuple(). Cette dernire approche fournit automatiquement des caractristiques supplmentaires comme une reprsentation auto-documente, par exemple :
>>> Employee(name=jones, title=programmer)
namespace (espace de noms) Lendroit o une variable est conserve. Les espaces de noms sont implments comme des dictionnaires. Il y a des espace de noms locaux, globaux et intgrs et galement imbriqus dans les objets. Les espaces de noms contribuent la modularit en prvenant les conits de noms. Par exemple, les fonctions __builtin__.open() et os.open() se distinguent par leurs espaces de noms. Les espaces de noms contribuent aussi la lisibilit et la maintenablit en clariant quel module implmente une fonction. Par exemple, en crivant random.seed() ou itertools.izip() on rend vident que ces fonctions sont implmentes dans les modules random et itertools respectivement. nested scope (porte imbrique) La possibilit de faire rfrence une variable dune dnition englobante. Par exemple, une fonction dnie lintrieur dune autre fonction peut faire rfrence une variable de la fonction extrieure. Notez que le portes imbriques fonctionnent uniquement pour la rfrence aux variables et non pour leur aectation, qui concerne toujours la porte imbrique. Les variables locales sont lues et crites dans la porte la plus intrieure ; les variables globales sont lues et crites dans lespace de noms global. Linstruction nonlocal permet dcrire dans la porte globale. new-style class (style de classe nouveau) Vieille dnomination pour le style de programmation de classe actuellement utilis. Dans les versions prcdentes de Python, seul le style de classe nouveau pouvait bncier des nouvelles caractristiques de Python, comme __slots__, les descripteurs, les proprits, __getattribute__(), les mthodes de classe et les mthodes statiques. object (objet) Toute donne comprenant un tat (attribut ou valeur) et un comportement dni (mthodes). galement la classe de base ultime du new-style class. positional argument (argument de position) Arguments aects aux noms locaux internes une fonction ou une mthode, determins par lordre donn dans lappel. La syntaxe * accepte plusieurs arguments de position ou fournit une liste de plusieurs arguments une fonction. Voir argument. property (proprit) Attribut dinstance permettant dimplmenter les principes de lencapsulation. Python3000 Surnom de la version 3 de Python (forg il y a longtemps, quand la version 3 tait un projet lointain). Aussi abrg Py3k . Pythonic (pythonique) Ide ou fragment de code plus proche des idiomes du langage Python que des concepts frquemment utliss dans dautres langages. par exemple, un idiome frquent en Python est de boucler sur les lments dun iterable en utilisant linstruction for. Beaucoup dautres langages nont pas ce type de construction et donc les utilisateurs non familiers avec Python utilisent parfois un compteur numrique :
for i in range(len(food)): print(food[i])
ANNEXE H. GLOSSAIRE
reference count (nombre de rfrences) Nombre de rfrences dun objet. Quand le nombre de rfrences dun objet tombe zro, lobjet est dsallou. Le comptage de rfrences nest gnralement pas visible dans le code Python, mais cest un lment cl de limplmentation de CPython. Le module sys dnit la fonction getrefcount() que les programmeurs peuvent appeler pour rcuprer le nombre de rfrences dun objet donn. __slots__ Une dclaration lintrieur dune classe de style nouveau qui conomise la mmoire en pr-dclarant lespace pour les attributs et en liminant en consquence les dictionnaires dinstance. Bien que populaire, cette technique est quelque peu dicile mettre en place et doit tre rserve aux rares cas o il y a un nombre important dinstances dans une application o la mmoire est rduite. sequence (squence) Un iterable qui ore un accs ecace aux lments en utilisant des index entiers et les mthodes spciales __getitem__() et __len__(). Des types squences incorpors sont list, str, tuple et unicode. Notez que le type dict comporte aussi les mthodes __getitem__() et __len__(), mais est considr comme une table associative plutt que comme une squence car la recherche se fait laide de cls arbitraires immuables au lieu dindex. slice (tranche) Objet contenant normalement une partie dune squence. Une tranche est cre par une notation indexe utilisant des : entre les index quand plusieurs sont donns, comme dans variable_name[1:3:5]. La notation crochet utilise les objets slice de faon interne. special method (mthode spciale) mthode appele implicitement par Python pour excuter une certaine opration sur un type, par exemple une addition. Ces mthodes ont des noms commenant et nissant par deux caractres souligns. Les mthodes spciales sont documentes dans Special method names. statement (instruction) Une instruction est une partie dune suite, dun bloc de code. Une instruction est soit une expression soit une ou plusieurs constructions utilisant un mot cl comme if, while ou for. triple-quoted string (chane multi-ligne) Une chane dlimite par trois guillemets () ou trois apostrophes (). Bien quelles ne fournissent pas de fonctionnalits direntes de celles des chanes simplement dlimites, elles sont utiles pour nombre de raisons. Elles permettent dinclure des guillemets ou des apostrophes non protgs et elles peuvent stendre sur plusieurs lignes sans utiliser de caractre de continuation, et sont donc spcialement utiles pour rdiger des chanes de documentation. type (type) Le type dun objet Python dtermine de quelle sorte dobjet il sagit ; chaque objet possde un type. Le type dun objet est accessible grce son attribut __class__ ou peut tre retourn par la fonction type(obj). view (vue) Les objets retourns par dict.keys(), dict.values() et dict.items() sont appels des dictionary views. ce sont des squences paresseuses 1 qui laisseront voir les modications du dictionnaire sous-jacent. Pour forcer le dictionary view tre une liste complte, utiliser list(dictview). Voir Dictionary wiew objects.
1. Lvaluation paresseuse est une technique de programmation o le programme nexcute pas de code avant que les rsultats de ce code ne soient rellement ncessaires. Le terme paresseux (en anglais lazzy evaluation) tant connot ngativement en franais on parle aussi dvaluation retarde.
141 virtual machine (machine virtuelle) Ordinateur entirement dni par un programme. la machine virtuelle Python excute le bytecode gnr par le compilateur. Zen of Python Une liste de principes mthodologiques et philosophiques utiles pour la comprhension et lutilisation du langage Python. Cette liste peut tre obtenue en tapant import this dans linterprteur Python.
142
ANNEXE H. GLOSSAIRE
Colophon
Ce texte a t crit grce au logiciel de composition A XLTEX de la distribution TEXLive. Nous avons utilis les composants libres suivants du monde Linux : A lditeur Kile, environnement intgr LTEX ; les polices Free Font de GNU ; lditeur de graphisme vectoriel Inkscape.