Adaptation libre de "How to think like a computer scientist" de Allen B. Downey, Jeffrey Elkner & Chris Meyers Grace Hopper, inventeur du compilateur : « Pour moi, la programmation est plus qu'un art applique important. C'est aussi une ambitieuse quite menee dans les trefonds de la connaissance. » A Maximilien, Elise, Lucille, Augustin et Alexane. Colophon Choisie deliberement hors propos, l'illustration de couverture est un dessin realise par l'auteur a la mine de graphite sur papier Canson en 1987, d'apres une photographie ancienne. II represente le yacht de course de 106 tonnes Valdora participant a une regate dans la rade de Cowes en 1923. Construit vingt ans plus tot, et d'abord gree en yawl, Valdora remporta plusieurs trophees avant d'etre regree en ketch en 1912 avec la voilure de 516 m 2 que Ton voit sur le dessin. Ce superbe voilier, tres estime par ses equipages pour son bon comportement a la mer, a navigue pendant pres dun demi-siecle. 2. Gerard Swinnen : Apprendre a programmer avec Python Apprendre a programmer avec Python par Gerard Swinnen professeur et conseiller pedagogique Institut S' Jean Berchmans - S te Marie 59, rue des Wallons - B4000 Liege Ces notes peuvent etre telechargees librement a partir du site : http://www.ulg.ac.be/cifen/inforef/swi Une part de ce texte est inspiree de : How to think like a computer scientist de Allen B. Downey, Jeffrey Elkner & Chris Meyers disponible sur : http://rocky.wellesley.edu/downrey/ost ou : http://www.ibiblio.org/obp Copyright (C) 2000-2005 Gerard Swinnen Les notes qui suivent sont distributes suivant les termes de la Licence de Documentation Libre GNU (GNU Free Documentation License, version 1.1) de la Free Software Foundation. Cela signifie que vous pouvez copier, modifier et redistribuer ces notes tout a fait librement, pour autant que vous respectiez un certain nombre de regies qui sont precisees dans cette licence, dont le texte complet peut etre consulte dans l'annexe intitulee « GNU Free Documentation licence », page 361. Pour l'essentiel, sachez que vous ne pouvez pas vous approprier ce texte pour le redistribuer ensuite (modifie ou non) en definissant vous-meme d'autres droits de copie. Le document que vous redistribuez, modifie ou non, doit obligatoirement inclure integralement le texte de la licence citee ci-dessus, le present avis, l'introduction qui suit, ainsi que la section Preface du texte original americain (voir annexes). L'acces a ces notes doit rester libre pour tout le monde. Vous etes autorise a demander une contribution financiere a ceux a qui vous redistribuez ces notes, mais la somme demandee ne peut concerner que les frais de reproduction. Vous ne pouvez pas redistribuer ces notes en exigeant pour vous-meme des droits d'auteur, ni limiter les droits de reproduction des copies que vous distribuez. La diffusion commerciale de ce texte en librairie, sous la forme classique d'un manuel imprime, est reservee exclusivement a la maison d' edition O'Reilly (Paris). Ces notes sont publiees dans l'espoir qu'elles seront utiles, mais sans aucune garantie. Gerard Swinnen : Apprendre a programmer avec Python 3. Introduction A l'origine, les presentes notes ont ete redigees a l'intention des eleves qui suivent le cours Programmation et langages de l'option Sciences & informatique au 3 e degre de transition de l'enseignement secondaire beige. II s'agit d'un texte experimental qui s'inspire largement de plusieurs autres documents publies sous licence libre sur {'internet. Nous proposons dans ces notes une demarche d'apprentissage non lineaire qui est tres certainement critiquable. Nous sommes conscients qu'elle apparaitra un peu chaotique aux yeux de certains puristes, mais nous l'avons voulue ainsi parce que nous sommes convaincus qu'il existe de nombreuses manieres d'apprendre (pas seulement la programmation, d'ailleurs), et qu'il faut accepter d'emblee ce fait etabli que des individus differents n'assimilent pas les memes concepts dans le meme ordre. Nous avons done cherche avant tout a susciter l'interet et a ouvrir un maximum de portes, en nous efforcant tout de meme de respecter les principes directeurs suivants : • L'apprentissage que nous visons doit etre adapte au niveau de comprehension et aux connaissances generates d'un eleve moyen. Nous nous refusons d'elaborer un cours qui soit reserve a une « elite » de petit* genies. Dans la meme optique, notre ambition reste generaliste : nous voulons mettre en evidence les invariants de la programmation et de l'informatique, sans poursuivre une specialisation quelconque. • Les outils utilises au cours de l'apprentissage doivent etre modernes et performants, mais il faut aussi que l'eleve puisse se les procurer en toute legalite pour son usage personnel. Toute notre demarche d'apprentissage repose en effet sur l'idee que l'eleve devra tres tot mettre en chantier des realisations personnelles qu'il pourra developper et exploiter a sa guise. • L'eleve qui apprend doit pouvoir rapidement realiser de petites applications graphiques. Les etudiants auxquels nous nous adressons sont en effet fort jeunes (en theorie, ils sont a peine arrives a l'age ou Ton commence a pouvoir faire des abstractions). Dans ce cours, nous avons pris le parti d'aborder tres tot la programmation d'une interface graphique, avant meme d'avoir presente l'ensemble des structures de donnees disponibles, parce que nous observons que les jeunes qui arrivent aujourd'hui dans nos classes « baignent » deja dans une culture informatique a base de fenetres et autres objets graphiques interactifs. S'ils choisissent d'apprendre la programmation, ils sont forcement impatients de creer par eux-memes des applications (peut-etre tres simples) ou l'aspect graphique est deja bien present. Nous avons done choisi cette approche un peu inhabituelle afin de permettre a nos eleves de se lancer tres tot dans de petit* projets personnels attrayants, par lesquels ils puissent se sentir valorises. Nous leur imposerons cependant de realiser leurs projets sans faire appel a l'un ou l'autre de ces environnements de programmation sophistiques qui ecrivent automatiquement de nombreuses lignes de code, parce que nous ne voulons pas non plus masquer la complexity sous-jacente. Certains nous reprocheront que notre demarche n'est pas suffisamment centree sur l'algorithmique pure et dure. Nous pensons qu'une telle approche n'est guere adaptee aux jeunes, pour les raisons deja evoquees ci-dessus. Nous pensons egalement qu'elle est moins primordiale que par le passe. II semble en effet que l'apprentissage de la programmation moderne par objets necessite plutot une mise en contact aussi precoce que possible de l'etudiant avec des objets et des bibliotheques de classes preexistants. Ainsi il apprend tres tot a raisonner en termes d' interactions entre objets, plutot qu'en termes de procedures, et cela l'autorise assez vite a tirer profit de concepts avances, tels que l'heritage et le polymorphisme. Nous avons par ailleurs accorde une place assez importante a la manipulation de differents types de structures de donnees, car nous estimons que e'est la reflexion sur les donnees qui doit rester la colonne vertebrale de tout developpement logiciel. 4. Gerard Swinnen : Apprendre a programmer avec Python Choix d'un premier langage de programmation II existe un tres grand nombre de langages de programmation, chacun avec ses avantages et ses inconvenients. L'ideal serait certainement d'en utiliser plusieurs, et nous ne pouvons qu'encourager les professeurs a presenter de temps a autre quelques exemples tires de langages differents. II faut cependant bien admettre que nous devons avant tout viser l'acquisition de bases solides, et que le temps dont nous disposons est limite. Dans cette optique, il nous semble raisonnable de n'utiliser d'abord qu'un seul langage, au mo ins pendant la premiere annee d' etudes. Mais quel langage allons-nous choisir pour commencer ? Lorsque nous avons commence a reflechir a cette question, durant notre preparation d'un curriculum pour la nouvelle option Sciences & Informatique, nous avions personnellement accumule une assez longue experience de la programmation sous Visual Basic (Micro$off) et sous Clarion (Top$peed). Nous avions egalement experiments quelque peu sous Delphi {Borl@nd). II etait done naturel que nous pensions d'abord exploiter l'un ou l'autre de ces langages (avec une nette preference pour Clarion, qui reste malheureusem*nt peu connu). Si nous souhaitons les utiliser comme outils de base pour un apprentissage general de la programmation, ces langages presentent toutefois deux gros inconvenients : • lis sont lies a des environnements de programmation (e'est-a-dire des logiciels) proprietaries. Cela signifie done, non seulement que l'institution scolaire desireuse de les utiliser devrait acheter une licence de ces logiciels pour chaque poste de travail (ce qui risque de se reveler assez couteux), mais surtout que les eleves souhaitant utiliser leurs competences de programmation ailleurs qu'a l'ecole seraient implicitement forces d'en acquerir eux aussi des licences, ce que nous ne pouvons pas accepter. • Ce sont des langages specifiquement lies au seul systeme d'exploitation Windows. lis ne sont pas « portables » sur d'autres systemes {Unix, MacOS, etc.). Cela ne cadre pas avec notre projet pedagogique qui ambitionne d'inculquer une formation generale (et done diversifiee) dans laquelle les invariants de l'informatique seraient autant que possible mis en evidence. Nous avons alors decide d'examiner l'offre alternative, e'est-a-dire celle qui est proposee gratuitement dans la mouvance de l'informatique libre 1 . Ce que nous avons trouve nous a enthousiasmes : non seulement il existe dans le monde de VOpen Source des interpreters et des compilateurs gratuits pour toute une serie de langages, mais le veritable cadeau consiste dans le fait que ces langages sont modernes, performants, portables (e'est-a-dire utilisables sur differents systemes d'exploitation tels que Windows, Linux, MacOS ...), et fort bien documentes. Le langage dominant y est sans conteste C/C++. Ce langage s'impose comme une reference absolue, et tout informaticien serieux doit s'y frotter tot ou tard. II est malheureusem*nt tres rebarbatif et complique, trop proche de la machine. Sa syntaxe est peu lisible et fort contraignante. La mise au point d'un gros logiciel ecrit en C/C++ est longue et penible. (Les memes remarques valent aussi dans une large mesure pour le langage Java). 1 Un logiciel libre {Free Software) est avant tout un logiciel dont le code source est accessible a tous (Open source). Souvent gratuit (ou presque), copiable et modifiable librement au gre de son acquereur, il est generalement le produit de la collaboration benevole de centaines de developpeurs enthousiastes disperses dans le monde entier. Son code source etant "epluche" par de tres nombreux specialistes (etudiants et professeurs universitaires), un logiciel libre se caracterise la plupart du temps par un tres haut niveau de qualite technique. Le plus celebre des logiciels libres est le systeme d'exploitation GNU/Linux, dont la popularity ne cesse de s'accroitre de jour en jour. Gerard Swinnen : Apprendre a programmer avec Python 5. D'autre part, la pratique moderne de ce langage fait abondamment appel a des generateurs d'applications et autres outils d'assistance tres elabores tels C++Builder, Kdevelop, etc. Ces environnements de programmation peuvent certainement se reveler tres efficaces entre les mains de programmeurs experimentes, mais ils proposent d'emblee beaucoup trop d'outils complexes, et ils presupposent de la part de l'utilisateur des connaissances qu'un debutant ne maitrise evidemment pas encore. Ce seront done aux yeux de celui-ci de veritables « usines a gaz » qui risquent de lui masquer les mecanismes de base du langage lui-meme. Nous laisserons done le C/C++ pour plus tard. Pour nos debuts dans l'etude de la programmation, il nous semble preferable d'utiliser un langage de plus haut niveau, moins contraignant, a la syntaxe plus lisible. Veuillez aussi consulter a ce sujet la preface de « How to think like a computer scientist », par Jeffrey Elkner (voir page 358). Apres avoir successivement examine et experiments quelque peu les langages Perl et Tcl/Tk , nous avons finalement decide d'adopter Python, langage tres moderne a la popularite grandissante. Presentation du langage Python, par Stefane Fermigier 2 . Python est un langage portable, dynamique, extensible, gratuit, qui permet (sans l'imposer) une approche modulaire et orientee objet de la programmation. Python est developpe depuis 1989 par Guido van Rossum et de nombreux contributeurs benevoles. Caracteristiques du langage Detaillons un peu les principales caracteristiques de Python, plus precisem*nt, du langage et de ses deux implantations actuelles: • Python est portable, non seulement sur les differentes variantes 6! Unix, mais aussi sur les OS proprietaries: MacOS, BeOS, NeXTStep, MS-DOS et les differentes variantes de Windows. Un nouveau compilateur, baptise JPython, est ecrit en Java et genere du bytecode Java. • Python est gratuit, mais on peut l'utiliser sans restriction dans des projets commerciaux. • Python convient aussi bien a des scripts d'une dizaine de lignes qu'a des projets complexes de plusieurs dizaines de milliers de lignes. • La syntaxe de Python est tres simple et, combinee a des types de donnees evolues (listes, dictionnaires,...), conduit a des programmes a la fois tres compacts et tres lisibles. A fonctionnalites egales, un programme Python (abondamment commente et presente selon les canons standards) est souvent de 3 a 5 fois plus court qu'un programme C ou C++ (ou meme Java) equivalent, ce qui represente en general un temps de developpement de 5 a 10 fois plus court et une facilite de maintenance largement accrue. • Python gere ses ressources (memo ire, descripteurs de fichiers...) sans intervention du programmeur, par un mecanisme de comptage de references (proche, mais different, d'un garbage collector). • II n'y a pas de pointeurs explicites en Python. • Python est (optionnellement) multi-threade. • Python est oriente-objet. II supporte l'heritage multiple et la surcharge des operateurs. Dans son modele objets, et en reprenant la terminologie de C++, toutes les methodes sont virtuelles. • Python integre, comme Java ou les versions recentes de C++, un systeme d'exceptions, qui permettent de simplifier considerablement la gestion des erreurs. 2 Stefane Fermigier est le president de l'AFUL (Association Francophone des Utilisateurs de Linux et des logiciels libres). Ce texte est extrait d'un article paru dans le magazine Programmez! en decembre 1998. II est egalement disponible sur http://www.linux-center.org/articles/9812/python.htmn 6. Gerard Swinnen : Apprendre a programmer avec Python • Python est dynamique (l'interpreteur peut evaluer des chaines de caracteres representant des expressions ou des instructions Python), orthogonal (un petit nombre de concepts suffit a engendrer des constructions tres riches), reflectif (il supporte la metaprogrammation, par exemple la capacite pour un objet de se rajouter ou de s'enlever des attributs ou des methodes, ou meme de changer de classe en cours d' execution) et introspectif (un grand nombre d'outils de developpement, comme le debugger ou le profiler, sont implantes en Python lui-meme). • Comme Scheme ou SmallTalk, Python est dynamiquement type. Tout objet manipulable par le programmeur possede un type bien defini a l'execution, qui n'a pas besoin d'etre declare a l'avance. • Python possede actuellement deux implementations. L'une, interpretee, dans laquelle les programmes Python sont compiles en instructions portables, puis executes par une machine virtuelle (comme pour Java, avec une difference importante: Java etant statiquement type, il est beaucoup plus facile d'accelerer l'execution d'un programme Java que d'un programme Python). L'autre genere directement du bytecode Java. • Python est extensible : comme Tel ou Guile, on peut facilement l'interfacer avec des bibliotheques C existantes. On peut aussi s'en servir comme d'un langage d' extension pour des systemes logiciels complexes. • La bibliotheque standard de Python, et les paquetages contribues, donnent acces a une grande variete de services : chaines de caracteres et expressions regulieres, services UNIX standards (fichiers, pipes, signaux, sockets, threads...), protocoles Internet (Web, News, FTP, CGI, HTML...), persistance et bases de donnees, interfaces graphiques. • Python est un langage qui continue a evoluer, soutenu par une communaute d'utilisateurs enthousiastes et responsables, dont la plupart sont des supporters du logiciel libre. Parallelement a l'interpreteur principal, ecrit en C et maintenu par le createur du langage, un deuxieme interpreteur, ecrit en Java, est en cours de developpement. • Enfin, Python est un langage de choix pour traiter le XML. Plusieurs versions differentes ? Comme cela a ete evoque dans le texte ci-dessus, Python continue a evoluer sans cesse. Mais cette evolution ne vise qu'a ameliorer ou perfectionner le produit. De ce fait, vous ne devez pas craindre de devoir tot ou tard modifier tous vos programmes afin de les adapter a une nouvelle version qui serait devenue incompatible avec les precedentes. Les exemples de ce livre ont ete realises les uns apres les autres sur une periode de temps relativement longue : certains ont ete developpes sous Python 1.5.2, puis d'autres sous Python 1.6, Python 2.0, Python 2.1, Python 2.2 et enfin Python 2.3. Tous continuent cependant a fonctionner sans probleme sous cette derniere version, et ils continueront certainement a fonctionner sans modification majeure sur les versions futures. Installez done sur votre systeme la derniere version disponible, et amusez-vous bien ! Gerard Swinnen : Apprendre a programmer avec Python 7. Distribution de Python - Bibliographie Les differentes versions de Python (pour Windows, Unix, etc.), son tutoriel original, son manuel de reference, la documentation des bibliotheques de fonctions, etc. sont disponibles en telechargement gratuit depuis l'internet, a partir du site web officiel : http://www.python.org II existe egalement de tres bons ouvrages imprimes concernant Python. Si la plupart d'entre eux n' existent encore qu'en version anglaise, on peut cependant deja se procurer en traduction francaise les manuels ci-apres : • Python en concentre, par Alex Martelli, traduction d'Eric Jacoboni, Editions O'Reilly, Paris, 2004, 645 p., ISBN 2-84177-290-X. C'est le premier ouvrage de reference veritable edite en langue francaise. Une mine de renseignements essentielle. • Introduction a Python, par Mark Lutz & David Ascher, traduction de Sebastien Tanguy, Olivier Berger & Jerome Kalifa, Editions O'Reilly, Paris, 2000, 385 p., ISBN 2-84177-089-3. Cet ouvrage est une excellente initiation a Python pour ceux qui pratiquent deja d'autres langages. • L 'intro Python, par Ivan Van Laningham, traduction de Denis Frere, Karine Cottereaux et Noel Renard, Editions CampusPress, Paris, 2000, 484 p., ISBN 2-7440-0946-6 • Python precis & concis (il s'agit d'un petit aide-memoire bien pratique), par Mark Lutz, traduction de James Guerin, Editions O'Reilly, Paris, 2000, 80 p., ISBN 2-84177-1 1 1-3 En langue anglaise, le choix est evidemment beaucoup plus vaste. Nous apprecions personnellement beaucoup Python : How to program, par Deitel, Liperi & Wiedermann, Prentice Hall, Upper Saddle River - NJ 07458, 2002, 1300 p., ISBN 0-13-092361-3 , tres complet, tres clair, agreable a lire et qui utilise une methodologie eprouvee, Core Python programming, par Wesley J. Chun, Prentice Hall, 2001, 770 p., ISBN 0-13-026036-3 dont les explications sont limpides, et Learn to program using Python, par Alan Gauld, Addison- Wesley, Reading, MA, 2001, 270 p., ISBN 0-201-70938-4 , qui est un tres bon ouvrage pour debutants. Pour aller plus loin, notamment dans l'utilisation de la bibliotheque graphique Tkinter, on pourra utilement consulter Python and Tkinter Programming, par John E. Grayson, Manning publications co., Greenwich (USA), 2000, 658 p., ISBN 1-884777-81-3 , et surtout l'incontournable Programming Python (second edition) de Mark Lutz, Editions O'Reilly, Paris, 2001, 1255 p., ISBN 0-596-00085-5, qui est une extraordinaire mine de renseignements sur de multiples aspects de la programmation moderne (sur tous systemes). Si vous savez deja bien programmer, et que vous souhaiter progresser encore en utilisant les concepts les plus avances de l'algorithmique Pythonienne, procurez vous Python cookbook, par Alex Martelli et David Ascher, Editions O'Reilly, Paris, 2002, 575 p., ISBN 0-596-00167-3 , dont les recettes sont savoureuses. Si vous souhaitez plus particulierement exploiter aux mieux les ressources liees au systeme d'exploitation Windows, Python Programming on Win32, par Mark Hammond & Andy Robinson, Editions O'Reilly, Paris, 2000, 654 p., ISBN 1-56592-621-8 est un ouvrage precieux. Reference egalement fort utile, la Python Standard Library de Fredrik Lundh, Editions O'Reilly, Paris, 2001, 282 p., ISBN 0-596-00096-0 8. Gerard Swinnen : Apprendre a programmer avec Python Pour le professeur qui souhaite utiliser cet ouvrage comme support de cours Nous souhaitons avec ces notes ouvrir un maximum de portes. A notre niveau d'etudes, il nous parait important de montrer que la programmation d'un ordinateur est un vaste univers de concepts et de methodes, dans lequel chacun peut trouver son domaine de predilection. Nous ne pensons pas que tous nos etudiants doivent apprendre exactement les memes choses. Nous voudrions plutot qu'ils arrivent a developper chacun des competences quelque peu differentes, qui leur permettent de se valoriser a leurs propres yeux ainsi qu'a ceux de leurs condisciples, et egalement d'apporter leur contribution specifique lorsqu'on leur proposera de collaborer a des travaux d'envergure. De toute maniere, notre preoccupation primordiale doit etre d'arriver a susciter l'interet, ce qui est loin d'etre acquis d'avance pour un sujet aussi ardu que la programmation d'un ordinateur. Nous ne voulons pas feindre de croire que nos jeunes eleves vont se passionner d'emblee pour la construction de beaux algorithmes. Nous sommes plutot convaincus qu'un certain interet ne pourra durablement s'installer qu'a partir du moment ou ils commenceront a realiser qu'ils sont devenus capables de developper un projet personnel original, dans une certaine autonomie. Ce sont ces considerations qui nous ont amenes a developper une structure de cours que certains trouveront peut-etre un peu chaotique. Le principal fil conducteur en est l'excellent « How to think like a computer scientist », mais nous l'avons un peu eclate pour y inserer toute une serie d'elements concernant la gestion des entrees/sorties, et en particulier l'interface graphique Tkinter. Nous souhaiterions en effet que les eleves puissent deja realiser l'une ou l'autre petite application graphique des la fin de leur premiere annee d'etudes. Tres concretement, cela signifie que nous pensons pouvoir explorer les huit premiers chapitres de ces notes durant la premiere annee de cours. Cela suppose que Ton aborde d'abord toute une serie de concepts importants (types de donnees, variables, instructions de controle du flux, fonctions et boucles) d'une maniere assez rapide, sans trop se preoccuper de ce que chaque concept soit parfaitement compris avant de passer au suivant, en essayant plutot d'inculquer le gout de la recherche personnelle et de l'experimentation. II sera souvent plus efficace de reexpliquer les notions et les mecanismes essentiels en situation, dans des contextes varies. Dans notre esprit, c'est surtout en seconde annee que Ton cherchera a structurer les connaissances acquises, en les approfondissant. Les algorithmes seront davantage decortiques et commentes. Les projets, cahiers des charges et methodes d' analyse seront discutes en concertation. On exigera la tenue reguliere d'un cahier de notes et la redaction de rapports techniques pour certains travaux. L'objectif ultime sera pour chaque eleve de realiser un projet de programmation original d'une certaine importance. On s'efforcera done de boucler l'etude theorique des concepts essentiels suffisamment tot dans l'annee scolaire, afin que chacun puisse disposer du temps necessaire. II faut bien comprendre que les nombreuses informations fournies dans ces notes concernant une serie de domaines particuliers (gestion des interfaces graphiques, des communications, des bases de donnees, etc.) sont matieres facultatives. Ce sont seulement une serie de suggestions et de reperes que nous avons inclus pour aider les etudiants a choisir et a commencer leur projet personnel de fin d'etudes. Nous ne cherchons en aucune maniere a former des specialistes d'un certain langage ou d'un certain domaine technique : nous voulons simplement donner un petit apercu des immenses possibilites qui s'offrent a celui qui se donne la peine d'acquerir une competence de programmeur. Gerard Swinnen : Apprendre a programmer avec Python 9. Exemples du livre Le code source des exemples de ce livre peut etre telecharge a partir du site de l'auteur : http://www.ulg.ac.be/cifen/inforef/swi/python.htm Remerciements Ces notes sont pour une partie le resultat d'un travail personnel, mais pour une autre - bien plus importante - la compilation d'informations et d'idees mises a la disposition de tous par des professeurs et des chercheurs benevoles. Comme deja signale plus haut, l'une de mes sources les plus importantes a ete le cours de A.Downey, J.Elkner & C.Meyers : How to think like a computer scientist. Merci encore a ces professeurs enthousiastes. J'avoue aussi m'etre largement inspire du tutoriel original ecrit par Guido van Rossum lui-meme (l'auteur principal de Python), ainsi que d'exemples et de documents divers emanant de la (tres active) communaute des utilisateurs de Python. II ne m'est malheureusem*nt pas possible de preciser davantage les references de tous ces textes, mais je voudrais que leurs auteurs soient assures de toute ma reconnaissance. Merci egalement a tous ceux qui oeuvrent au developpement de Python, de ses accessoires et de sa documentation, a commencer par Guido van Rossum, bien sur, mais sans oublier non plus tous les autres (II sont (mal)heureusem*nt trop nombreux pour que je puisse les citer tous ici). Merci encore a mes collegues Freddy Klich, Christine Ghiot et David Carrera, professeurs a l'lnstitut St. Jean-Berchmans de Liege, qui ont accepte de se lancer dans l'aventure de ce nouveau cours avec leurs eleves, et ont egalement suggere de nombreuses ameliorations. Un merci tout particulier a Christophe Morvan, professeur a 1'IUT de Marne-la-Vallee, pour ses avis precieux et ses encouragements. Grand merci aussi a Florence Leroy, mon editrice chez O'Reilly, qui a corrige mes incoherences et mes belgicismes avec une competence sans faille. Merci enfin a mon epouse Suzel, pour sa patience et sa comprehension. 10. Gerard Swinnen : Apprendre a programmer avec Python Chapitre 1 : Penser comme un programmeur 3 Nous allons introduire dans ce chapitre quelques concepts qu'il vous faut connaitre avant de vous lancer dans l'apprentissage de la programmation. Nous avons volontairement limite nos explications afin de ne pas vous encombrer l'esprit. La programmation n'est pas difficile : il suffit d'un peu de methode et de perseverance. 1. 1 La demarche du programmeur Le but de ce cours est de vous apprendre a penser et d reflechir comme un analyste- programmeur. Ce mode de pensee combine des demarches intellectuelles complexes, similaires a celles qu'accomplissent les mathematiciens, les ingenieurs et les scientifiques. Comme le mathematicien, l'analyste-programmeur utilise des langages formels pour decrire des raisonnements (ou algorithmes). Comme l'ingenieur, il concoit des dispositifs, il assemble des composants pour realiser des mecanismes et il evalue leurs performances. Comme le scientifique, il observe le comportement de systemes complexes, il ebauche des hypotheses explicatives, il teste des predictions. L 'activite essentielle d'un analyste-programmeur est la resolution de problemes. II s'agit la d'une competence de haut niveau, qui implique des capacites et des connaissances diverses : etre capable de (re)formuler un probleme de plusieurs manieres differentes, etre capable d'imaginer des solutions innovantes et efficaces, etre capable d'exprimer ces solutions de maniere claire et complete. La programmation d'un ordinateur consiste en effet a « expliquer » en detail a une machine ce qu'elle doit faire, en sachant d'emblee qu'elle ne peut pas veritablement « comprendre » un langage humain, mais seulement effectuer un traitement automatique sur des sequences de caracteres. Un programme n'est rien d'autre qu'une suite destructions, encodees en respectant de maniere tres stricte un ensemble de conventions fixees a l'avance que Ton appelle un langage informatique. La machine est ainsi pourvue d'un mecanisme qui decode ces instructions en associant a chaque « mot » du langage une action precise. Vous allez done apprendre a programmer, activite deja interessante en elle-meme parce qu'elle contribue a developper votre intelligence. Mais vous serez aussi amene a utiliser la programmation pour realiser des projets concrets, ce qui vous procurera certainement de tres grandes satisfactions. 1.2 Langage machine, langage de programmation A strictement parler, un ordinateur n'est rien d'autre qu'une machine effectuant des operations simples sur des sequences de signaux electriques, lesquels sont conditionnes de maniere a ne pouvoir prendre que deux etats seulement (par exemple un potentiel electrique maximum ou minimum). Ces sequences de signaux obeissent a une logique du type « tout ou rien » et peuvent done etre consideres conventionnellement comme des suites de nombres ne prenant jamais que les deux valeurs 0 et 1 . Un systeme numerique ainsi limite a deux chiffres est appele systeme binaire. Sachez des a present que dans son fonctionnement interne, un ordinateur est totalement incapable de traiter autre chose que des nombres binaires. Toute information d'un autre type doit etre convertie, ou codee, en format binaire. Cela est vrai non seulement pour les donnees que Ton 3 Une part importante de ce chapitre est traduite d'un chapitre similaire de « How to think like a computer scientist » de Downey, Elkner & Meyers. Gerard Swinnen : Apprendre a programmer avec Python 11. souhaite traiter (les textes, les images, les sons, les nombres, etc.), mais aussi pour les programmes, c'est-a-dire les sequences d'instructions que Ton va fournir a la machine pour lui dire ce qu'elle doit faire avec ces donnees. Le seul « langage » que l'ordinateur puisse veritablement « comprendre » est done tres eloigne de ce que nous utilisons nous-memes. C'est une longue suite de 1 et de 0 (les "bits") souvent traites par groupes de 8 (les « octets »), 16, 32, ou meme 64. Ce « langage machine » est evidemment presqu'incomprehensible pour nous. Pour « parler » a un ordinateur, il nous faudra utiliser des systemes de traduction automatiques, capables de convertir en nombres binaires des suites de caracteres formant des mots-cles (anglais en general) qui seront plus significatifs pour nous. Ces systemes de traduction automatique seront etablis sur la base de toute une serie de conventions, dont il existera evidemment de nombreuses variantes. Le systeme de traduction proprement dit s'appellera interpreteur ou bien compilateur, suivant la methode utilisee pour effectuer la traduction (voir ci-apres). On appellera langage de programmation un ensemble de mots-cles (choisis arbitrairement) associe a un ensemble de regies tres precises indiquant comment on peut assembler ces mots pour former des « phrases » que l'interpreteur ou le compilateur puisse traduire en langage machine (binaire). Suivant son niveau d'abstraction, on pourra dire d'un langage qu'il est « de bas niveau » (ex : Assembler) ou « de haut niveau » (ex : Pascal, Perl, Smalltalk, Clarion, Java...). Un langage de bas niveau est constitute d'instructions tres elementaires, tres « proches de la machine ». Un langage de haut niveau comporte des instructions plus abstraites ou, plus « puissantes ». Cela signifie que chacune de ces instructions pourra etre traduite par l'interpreteur ou le compilateur en un grand nombre d'instructions machine elementaires. Le langage que vous allez apprendre en premier est Python. II s'agit d'un langage de haut niveau, dont la traduction en codes binaires est complexe et prend done toujours un certain temps. Cela pourrait paraitre un inconvenient. En fait, les avantages que presentent les langages de haut niveau sont enormes : il est beaucoup plus facile d'ecrire un programme dans un langage de haut niveau ; l'ecriture du programme prend done beaucoup moins de temps ; la probability d'y faire des fautes est nettement plus faible ; la maintenance (c'est-a-dire l'apport de modifications ulterieures) et la recherche des erreurs (les « bugs ») sont grandement facilities. De plus, un programme ecrit dans un langage de haut niveau sera souvent portable, c'est-a-dire que Ton pourra le faire fonctionner sans guere de modifications sur des machines ou des systemes d'exploitation differents. Un programme ecrit dans un langage de bas niveau ne peut jamais fonctionner que sur un seul type de machine : pour qu'une autre l'accepte, il faut le reecrire entierement. 12. Gerard Swinnen : Apprendre a programmer avec Python 1.3 Compilation et interpretation Le programme tel que nous l'ecrivons a l'aide d'un logiciel editeur (une sorte de traitement de texte specialise) sera appele desormais programme source (ou code source). Comme deja signale plus haut, il existe deux techniques principales pour effectuer la traduction d'un tel programme source en code binaire executable par la machine : Interpretation et la compilation. • Dans la technique appelee interpretation, le logiciel interpreteur doit etre utilise chaque fois que Ton veut faire fonctionner le programme. Dans cette technique en effet, chaque ligne du programme source analyse est traduite au fur et a mesure en quelques instructions du langage machine, qui sont ensuite directement executees. Aucun programme objet n'est genere. Code source Resultat L' interpreteur lit le code, source ... ... etle resultat apparait sur Vecran. La compilation consiste a traduire la totalite du texte source en une fois. Le logiciel compilateur lit toutes les lignes du programme source et produit une nouvelle suite de codes que Ton appelle programme objet (ou code objet). Celui-ci peut desormais etre execute independamment du compilateur et etre conserve tel quel dans un fichier (« fichier executable »). Code objet Le compilateur lit le code source ... ... et produit un code objet (binaire). On execute le code objet . Resultat ... et le resultat apparait a Vecran. Chacune de ces deux techniques a ses avantages et ses inconvenients : L'interpretation est ideale lorsque Ton est en phase d'apprentissage du langage, ou en cours d'experimentation sur un projet. Avec cette technique, on peut en effet tester immediatement toute modification apportee au programme source, sans passer par une phase de compilation qui demande toujours du temps. Par contre, lorsqu'un projet comporte des fonctionnalites complexes qui doivent s'executer rapidement, la compilation est preferable : il est clair en effet qu'un programme compile fonctionnera toujours nettement plus vite que son hom*ologue interprete, puisque dans cette technique l'ordinateur n'a plus a (re)traduire chaque instruction en code binaire avant qu'elle puisse etre executee. Gerard Swinnen : Apprendre a programmer avec Python 13. Certains langages modernes tentent de combiner les deux techniques afin de retirer le meilleur de chacune. C'est le cas de Python et aussi de Java. Lorsque vous lui fournissez un programme source, Python commence par le compiler pour produire un code intermediaire, similaire a un langage machine, que Ton appelle bytecode, lequel sera ensuite transmis a un interpreteur pour 1' execution finale. Du point de vue de l'ordinateur, le bytecode est tres facile a interpreter en langage machine. Cette interpretation sera done beaucoup plus rapide que celle d'un code source. Code i I rCompilateurJ I ^> ByteCode Resultat Le compilateur Python lit le code source ... ... et produit un pseudo- code intermediaire. U interpreteur Python ... et le resultat lit le pseudo-code ... apparait a I'ecran. Les avantages de cette methode sont appreciables : • Le fait de disposer en permanence d'un interpreteur permet de tester immediatement n'importe quel petit morceau de programme. On pourra done verifier le bon fonctionnement de chaque composant d'une application au fur et a mesure de sa construction. • L'interpretation du bytecode compile n'est pas aussi rapide que celle d'un veritable code binaire, mais elle est tres satisfaisante pour de tres nombreux programmes, y compris graphiques. • Le bytecode est portable. Pour qu'un programme Python ou Java puisse s'executer sur differentes machines, il suffit de disposer pour chacune d'elles d'un interpreteur adapte. Tout ceci peut vous paraitre un peu complique, mais la bonne nouvelle est que tout ceci est pris en charge automatiquement par l'environnement de developpement de Python. II vous suffira d'entrer vos commandes au clavier, de frapper , et Python se chargera de les compiler et de les interpreter pour vous. 14. Gerard Swinnen : Apprendre a programmer avec Python 1.4 Mise au point d'un programme - Recherche des erreurs (« debug ») La programmation est une demarche tres complexe, et comme c'est le cas dans toute activite humaine, on y commet de nombreuses erreurs. Pour des raisons anecdotiques, les erreurs de programmation s'appellent des « bugs » (ou « bogues », en France) 4 , et l'ensemble des techniques que Ton met en ceuvre pour les detecter et les corriger s'appelle « debug » (ou « deboguage »). En fait, il peut exister dans un programme trois types d'erreurs assez differentes, et il convient que vous appreniez a bien les distinguer : 1.4.1 Erreurs de syntaxe Python ne peut executer un programme que si sa syntaxe est parfaitement correcte. Dans le cas contraire, le processus s'arrete et vous obtenez un message d'erreur. Le terme syntaxe se refere aux regies que les auteurs du langage ont etablies pour la structure du programme. Tout langage comporte sa syntaxe. Dans la langue francaise, par exemple, une phrase doit toujours commencer par une majuscule et se terminer par un point, ainsi cette phrase comporte deux erreurs de syntaxe Dans les textes ordinaires, la presence de quelques petites fautes de syntaxe par-ci par-la n'a generalement pas d'importance. II peut meme arriver (en poesie, par exemple), que des fautes de syntaxe soient commises volontairement. Cela n'empeche pas que Ton puisse comprendre le texte. Dans un programme d'ordinateur, par contre, la moindre erreur de syntaxe produit invariablement un arret de fonctionnement (un « plantage ») ainsi que l'affichage d'un message d'erreur. Au cours des premieres semaines de votre carriere de programmeur, vous passerez certainement pas mal de temps a rechercher vos erreurs de syntaxe. Avec de l'experience, vous en commettrez beaucoup moins. Gardez a l'esprit que les mots et les symboles utilises n'ont aucune signification en eux-memes : ce ne sont que des suites de codes destines a etre convertis automatiquement en nombres binaires. Par consequent, il vous faudra etre tres attentifs a respecter scrupuleusem*nt la syntaxe du langage. II est heureux que vous fassiez vos debuts en programmation avec un langage interprets tel que Python. La recherche des erreurs y est facile et rapide. Avec les langages compiles (tel C++), il vous faudrait recompiler l'integralite du programme apres chaque modification, aussi minime soit- elle. 1.4.2 Erreurs semantiques Le second type d'erreur est l'erreur semantique ou erreur de logique. S'il existe une erreur de ce type dans un de vos programmes, celui-ci s'execute parfaitement, en ce sens que vous n'obtenez aucun message d'erreur, mais le resultat n'est pas celui que vous attendiez : vous obtenez autre chose. En realite, le programme fait exactement ce que vous lui avez dit de faire. Le probleme est que ce que vous lui avez dit de faire ne correspond pas a ce que vous vouliez qu'il fasse. La sequence d'instructions de votre programme ne correspond pas a l'objectif poursuivi. La semantique (la logique) est incorrecte. Rechercher des fautes de logique peut etre une tache ardue. II faut analyser ce qui sort de la machine et tacher de se representer une par une les operations qu'elle a effectuees, a la suite de 4 "bug" est a l'origine un terme anglais servant a designer de petit* insectes genants, tels les punaises. Les premiers ordinateurs fonctionnaient a l'aide de "lampes" radios qui necessitaient des tensions electriques assez elevees. II est arrive a plusieurs reprises que des petit* insectes s'introduisent dans cette circuiterie complexe et se fassent electrocuter, leurs cadavres calcines provoquant alors des court-circuits et done des pannes incomprehensibles. Le mot francais "bogue" a ete choisi par hom*onymie approximative. II designe la coque epineuse de la chataigne. Gerard Swinnen : Apprendre a programmer avec Python 15. chaque instruction. 1.4.3 Erreurs a I'execution Le troisieme type d'erreur est l'erreur en cours d'execution (Run-time error), qui apparait seulement lorsque votre programme fonctionne deja, mais que des circonstances particulieres se presentent (par exemple, votre programme essaie de lire un fichier qui n'existe plus). Ces erreurs sont egalement appelees des exceptions, parce qu'elles indiquent generalement que quelque chose d'exceptionnel s'est produit (et qui n'avait pas ete prevu). Vous rencontrerez davantage ce type d'erreur lorsque vous programmerez des projets de plus en plus volumineux. 1.5 Recherche des erreurs et experimentation L'une des competences les plus importantes a acquerir au cours de votre apprentissage est celle qui consiste a « deboguer » efficacement un programme. II s'agit d'une activite intellectuelle parfois enervante mais toujours tres riche, dans laquelle il faut faire montre de beaucoup de perspicacite. Ce travail ressemble par bien des aspects a une enquete policiere. Vous examinez un ensemble de faits, et vous devez emettre des hypotheses explicatives pour reconstituer les processus et les evenements qui ont logiquement entraine les resultats que vous constatez. Cette activite s'apparente aussi au travail experimental en sciences. Vous vous faites une premiere idee de ce qui ne va pas, vous modifiez votre programme et vous essayez a nouveau. Vous avez emis une hypothese, qui vous permet de predire ce que devra donner la modification. Si la prediction se verifie, alors vous avez progresse d'un pas sur la voie d'un programme qui fonctionne. Si la prediction se revele fausse, alors il vous faut emettre une nouvelle hypothese. Comme l'a bien dit Sherlock Holmes: « Lorsque vous avez elimine Vimpossible, ce qui reste, meme si c'est improbable, doit etre la verite » (A. Conan Doyle, Le signe des quatre). Pour certaines personnes, « programmer » et « deboguer » signifient exactement la meme chose. Ce qu'elles veulent dire par la est que l'activite de programmation consiste en fait a modifier, a corriger sans cesse un meme programme, jusqu'a ce qu'il se comporte finalement comme vous le vouliez. L'idee est que la construction d'un programme commence toujours par une ebauche qui fait deja quelque chose (et qui est done deja deboguee), a laquelle on ajoute couche par couche de petites modifications, en corrigeant au fur et a mesure les erreurs, afin d'avoir de toute facon a chaque etape du processus un programme qui fonctionne. Par exemple, vous savez que Linux est un systeme d'exploitation (et done un gros logiciel) qui comporte des milliers de lignes de code. Au depart, cependant, cela a commence par un petit programme simple que Linus Torvalds avait developpe pour tester les particularites du processeur Intel 80386. Suivant Larry GreenField (« The Linux user's guide », beta version 1) : «L'un des premiers projets de Linus etait un programme destine a convertir une chaine de caracteres AAAA en BBBB. C'est cela qui plus tard finit par devenir Linux I ». Ce qui precede ne signifie pas que nous voulions vous pousser a programmer par approximations successives, a partir d'une vague idee. Lorsque vous demarrerez un projet de programmation d'une certaine importance, il faudra au contraire vous efforcer d'etablir le mieux possible un cahier des charges detaille, lequel s'appuiera sur un plan solidement construit pour l'application envisagee. Diverses methodes existent pour effectuer cette tache ^analyse, mais leur etude sort du cadre de ces notes. Veuillez consulter votre professeur pour de plus amples informations et references. 16. Gerard Swinnen : Apprendre a programmer avec Python 1.6 Langages naturels et langages formels Les langages naturels sont ceux que les etres humains utilisent pour communiquer. Ces langages n'ont pas ete mis au point deliberement (encore que certaines instances tachent d'y mettre un peu d'ordre) : ils evoluent naturellement. Les langages formels sont des langages developpes en vue d' applications specifiques. Ainsi par exemple, le systeme de notation utilise par les mathematiciens est un langage formel particulierement efficace pour representer les relations entre nombres et grandeurs diverses. Les chimistes utilisent un langage formel pour representer la structure des molecules, etc. Les langages de programmation sont des langages formels qui ont ete developpes pour decrire des algorithmes et des structures de donnees. Comme on l'a deja signale plus haut, les langages formels sont dotes d'une syntaxe qui obeit a des regies tres strictes. Par exemple, 3+3=6 est une representation mathematique correcte, alors que $3=+ 6 ne Test pas. De meme, la formule chimique H 2 0 est correcte, mais non Zq 3 G2 Les regies de syntaxe s'appliquent non seulement aux symboles du langage (par exemple, le symbole chimique Zq est illegal parce qu'il ne correspond a aucun element), mais aussi a la maniere de les combiner. Ainsi l'equation mathematique 6+=+/5- ne contient que des symboles parfaitement autorises, mais leur arrangement incorrect ne signifie rien du tout. Lorsque vous lisez une phrase quelconque, vous devez arriver a vous representer la structure logique de la phrase (meme si vous faites cela inconsciemment la plupart du temps). Par exemple, lorsque vous lisez la phrase « la piece est tombee », vous comprenez que « la piece » en est le sujet et « est tombee » le verbe. L'analyse vous permet de comprendre la signification, la logique de la phrase (sa semantique). D'une maniere analogue, l'interpreteur Python devra analyser la structure de votre programme source pour en extraire la signification. Les langages naturels et formels ont done beaucoup de caracteristiques communes (des symboles, une syntaxe, une semantique), mais ils presentent aussi des differences tres importantes : Ambigui'te. Les langages naturels sont pleins d'ambigui'tes, que nous pouvons lever dans la plupart des cas en nous aidant du contexte. Par exemple, nous attribuons tout naturellement une signification differente au mot vaisseau, suivant que nous le trouvons dans une phrase qui traite de circulation sanguine ou de navigation a voiles. Dans un langage formel, il ne peut pas y avoir d'ambigui'te. Chaque instruction possede une seule signification, independante du contexte. Redondance. Pour compenser toutes ces ambigui'tes et aussi de nombreuses erreurs ou pertes dans la transmission de l'information, les langages naturels emploient beaucoup la redondance (dans nos phrases, nous repetons plusieurs fois la meme chose sous des formes differentes, pour etre surs de bien nous faire comprendre). Les langages formels sont beaucoup plus concis. Litteralite. Les langages naturels sont truffes d'images et de metaphores. Si je dis « la piece est tombee ! » dans un certain contexte, il se peut qu'il ne s'agisse en fait ni d'une veritable piece, ni de la chute de quoi que ce soit. Dans un langage formel, par contre, les expressions doivent etre prises pour ce qu'elles sont, « au pied de la lettre ». Gerard Swinnen : Apprendre a programmer avec Python 17. Habitues comme nous le sommes a utiliser des langages naturels, nous avons souvent bien du mal a nous adapter aux regies rigoureuses des langages formels. C'est l'une des difficultes que vous devrez surmonter pour arriver a penser comme un analyste-programmeur efficace. Pour bien nous faire comprendre, comparons encore differents types de textes : Un texte poetique : Les mots y sont utilises autant pour leur musicalite que pour leur signification, et l'effet recherche est surtout emotionnel. Les metaphores et les ambigui'tes y regnent en maitres. Un texte en prose : La signification litterale des mots y est plus importante, et les phrases sont structurees de maniere a lever les ambigui'tes, mais sans y parvenir toujours completement. Les redondances sont souvent necessaires. Un programme d'ordinateur : La signification du texte est unique et litterale. Elle peut etre comprise entierement par la seule analyse des symboles et de la structure. On peut done automatiser cette analyse. Pour conclure, voici quelques suggestions concernant la maniere de lire un programme d'ordinateur (ou tout autre texte ecrit en langage formel). Premierement, gardez a l'esprit que les langages formels sont beaucoup plus denses que les langages naturels, ce qui signifie qu'il faut davantage de temps pour les lire. De plus, la structure y est tres importante. Aussi, ce n'est generalement pas une bonne idee que d'essayer de lire un programme d'une traite, du debut a la fin. Au lieu de cela, entrainez-vous a analyser le programme dans votre tete, en identifiant les symboles et en interpretant la structure. Finalement, souvenez-vous que tous les details ont de l'importance. II faudra en particulier faire tres attention a la casse (e'est-a-dire l'emploi des majuscules et des minuscules) et a la ponctuation. Toute erreur a ce niveau (meme minime en apparence, tel l'oubli d'une virgule, par exemple) peut modifier considerablement la signification du code, et done le deroulement du programme. 18. Gerard Swinnen : Apprendre a programmer avec Python Chapitre 2 : Premiers pas II est temps de se mettre au travail. Plus exactement, nous allons demander a l'ordinateur de travailler a notre place, en lui donnant, par exemple, l'ordre d'effectuer une addition et d'afficher le resultat. Pour cela, nous allons devoir lui transmettre des « instructions », et egalement lui indiquer les « donnees » auxquelles nous voulons appliquer ces instructions. 2. 1 Calculer avec Python Python presente la particularite de pouvoir etre utilise de plusieurs manieres differentes. Vous allez d'abord l'utiliser en mode interactif, c'est-a-dire d'une maniere telle que vous pourrez dialoguer avec lui directement depuis le clavier. Cela vous permettra de decouvrir tres vite un grand nombre de fonctionnalites du langage. Dans un second temps, vous apprendrez comment creer vos premiers programmes (scripts) et les sauvegarder sur disque. L'interpreteur peut etre lance directement depuis la ligne de commande (dans un « shell » Linux, ou bien dans une fenetre DOS sous Windows) : il suffit d'y taper la commande "python" (en supposant que le logiciel lui-meme ait ete correctement installe). Si vous utilisez une interface graphique telle que Windows, Gnome, WindowMaker ou KDE, vous prefererez vraisemblablement travailler dans une « fenetre de terminal », ou encore dans un environnement de travail specialise tel que IDLE. Voici par exemple ce qui apparait dans une fenetre de terminal KDE (sous Linux) 5 : 5? gust@gromit:~ - Terminal - Konsole Session Edition Affichage Signets Configuration Aide gust@g romi t : ~> python Python 2.2.2 (#1. Mar 17 2003, 15:17:58) [GCC 3.3 20030226 (prerelease) (SuSE Linux)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> | ij*J Terminal I Nouveau 5 Sous Windows, vous aurez surtout le choix entre l'environnement IDLE developpe par Guido Van Rossum, auquel nous donnons nous-meme la preference, et PythonWin, une interface de developpement developpee par Mark Hammond. D'autres environnements de travail plus sophistiques existent aussi, tels l'excellent Boa Constructor par exemple (qui fonctionne de facon tres similaire a Delphi), mais nous estimons qu'ils ne conviennent guere aux debutants. Pour tout renseignement complementaire, veuillez consulter le site Web de Python. Sous Linux, nous preferons personnellement travailler dans l'environnement graphique WindowMaker (plutot que KDE ou Gnome trop gourmands en ressources), en ouvrant une simple fenetre de terminal pour lancer l'interpreteur Python ou l'execution des scripts, et en faisant appel a l'excellent logiciel Nedit pour l'edition de ces derniers. Gerard Swinnen : Apprendre a programmer avec Python 19. Avec IDLE sous Windows, votre environnement de travail ressemblera a celui-ci : -Python Shell' x| File Edit Debug Windows Help Python 2.2 (#28, Dec 21 2001, 12:21:22) Type "copyright", "credits" or "license" IDLE 0.8 — press Fl for help »>l [HSC 32 bit (Intel)] on Win32 Les trois caracteres « superieur a » constituent le signal d'invite, ou prompt principal, lequel vous indique que Python est pret a executer une commande. Par exemple, vous pouvez tout de suite utiliser l'interpreteur comme une simple calculatrice de bureau. Veuillez done vous-meme tester les commandes ci-dessous (Prenez l'habitude d'utiliser votre cahier d'exercices pour noter les resultats qui apparaissent a l'ecran) : »> 5+3 »> 2-9 # les espaces sont optionnels >>> 7+3*4 # la hierarchie des operations mathematiques # est-elle respectee ? »> (7+3) *4 »> 20/3 # surprise ! ! ! Comme vous pouvez le constater, les operateurs arithmetiques pour l'addition, la soustraction, la multiplication et la division sont respectivement +, -, * et /. Les parentheses sont fonctionnelles. Par defaut, la division est cependant une division entiere, ce qui signifie que si on lui fournit des arguments qui sont des nombres entiers, le resultat de la division est lui-meme un entier (tronque), comme dans le dernier exemple ci-dessus. Si vous voulez qu'un argument soit compris par Python comme etant un nombre reel, il faut le lui faire savoir, en fournissant au moins un point decimal 6 . Essayez par exemple : »> 20.0 / 3 # (comparez le resultat avec celui obtenu a l'exercice precedent) »> 8./5 Si une operation est effectuee avec des arguments de types melanges (entiers et reels), Python convertit automatiquement les operandes en reels avant d'effectuer l'operation. Essayez : »> 4 * 2.5 / 3.3 6 Dans tous les langages de programmation, les conventions mathematiques de base sont celles en vigueur dans les pays anglophones : le separateur decimal sera done toujours un point, et non une virgule comme chez nous. Dans le monde de l'informatique, les nombres reels sont souvent designes comme des nombres "a virgule flottante", ou encore des nombres "de type float". 20. Gerard Swinnen : Apprendre a programmer avec Python 2.2 Donnees et variables Nous aurons l'occasion de detailler plus loin les differents types de donnees numeriques. Mais avant cela, nous pouvons des a present aborder un concept de grande importance : L'essentiel du travail effectue par un programme d'ordinateur consiste a manipuler des donnees. Ces donnees peuvent etre tres diverses (tout ce qui est numerisable, en fait 7 ), mais dans la memoire de l'ordinateur elles se ramenent toujours en definitive a une suite finie de nombres binaires. Pour pouvoir acceder aux donnees, le programme d'ordinateur (quel que soit le langage dans lequel il est ecrit) fait abondamment usage d'un grand nombre de variables de differents types. Une variable apparait dans un langage de programmation sous un nom de variable a peu pres quelconque (voir ci-apres), mais pour l'ordinateur il s'agit d'une reference designant une adresse memoire, c'est-a-dire un emplacement precis dans la memoire vive. A cet emplacement est stocke une valeur bien determines C'est la donnee proprement dite, qui est done stockee sous la forme d'une suite de nombres binaires, mais qui n'est pas necessairement un nombre aux yeux du langage de programmation utilise. Cela peut etre en fait a peu pres n'importe quel « objet » susceptible d'etre place dans la memoire d'un ordinateur, par exemple : un nombre entier, un nombre reel, un nombre complexe, un vecteur, une chaine de caracteres typographiques, un tableau, une fonction, etc. Pour distinguer les uns des autres ces divers contenus possibles, le langage de programmation fait usage de differents types de variables, (le type 'entier', le type 'reel', le type 'chaine de caracteres', le type 'liste', etc.). Nous allons expliquer tout cela dans les pages suivantes. 7 Que peut-on numeriser au juste ? Voila une question tres importante, qu'il vous faudra debattre dans votre cours d'informatique generale. Gerard Swinnen : Apprendre a programmer avec Python 21. 2.3 Noms de variables et mots reserves Les noms de variables sont des noms que vous choisissez vous-meme assez librement. Efforcez- vous cependant de bien les choisir : de preference assez courts, mais aussi explicites que possible, de maniere a exprimer clairement ce que la variable est censee contenir. Par exemple, des noms de variables tel que altitude, altit ou alt conviennent mieux que jc pour exprimer une altitude. Un bon programmeur doit veiller a ce que ses lignes d' instructions soient faciles a lire. Sous Python, les noms de variables doivent en outre obeir a quelques regies simples : • Un nom de variable est une sequence de lettres (a — > z , A — > Z) et de chiffres (0 — > 9), qui doit toujours commencer par une lettre. • Seules les lettres ordinaires sont autorisees. Les lettres accentuees, les cedilles, les espaces, les caracteres speciaux tels que $, #, @, etc. sont interdits, a l'exception du caractere _ (souligne). • La casse est significative (les caracteres majuscules et minuscules sont distingues). Attention : Joseph, joseph, JOSEPH sont done des variables differentes. Soyez attentifs ! Prenez l'habitude d'ecrire l'essentiel des noms de variables en caracteres minuscules (y compris la premiere lettre 8 ). II s'agit d'une simple convention, mais elle est largement respectee. N'utilisez les majuscules qu'a l'interieur meme du nom, pour en augmenter eventuellement la lisibilite, comme dans tableDesMatieres, par exemple. En plus de ces regies, il faut encore ajouter que vous ne pouvez pas utiliser comme noms de variables les 29 « mots reserves » ci-dessous (ils sont utilises par le langage lui-meme) : and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while yield 8 Les noms commencant par une majuscule ne sont pas interdits, mais l'usage veut qu'on le reserve plutot aux variables qui designent des classes (le concept de classe sera aborde plus loin dans ces notes). Gerard Swinnen : Apprendre a programmer avec Python 22. 2.4 Affectation (ou assignation) Nous savons desormais comment choisir judicieusem*nt un nom de variable. Voyons a present comment nous pouvons en definir une et lui affecter une valeur. Les termes « affecter une valeur » ou « assigner une valeur » a une variable sont equivalents. lis designent l'operation par laquelle on etablit un lien entre le nom de la variable et sa valeur (son contenu). En Python comme dans de nombreux autres langages, l'operation d'affectation est representee par le signe egale 9 : »> n = 7 # donner a n la valeur 7 »> msg = "Quoi de neuf ?" # affecter la valeur "Quoi de neuf ?" a msg »> pi = 3.14159 # assigner sa valeur a la variable pi Les exemples ci-dessus illustrent des instructions d'affectation Python tout a fait classiques. Apres qu'on les ait executees, il existe dans la memoire de l'ordinateur, a des endroits differents : • trois noms de variables, a savoir n, msg et pi • trois sequences d'octets, ou sont encodees le nombre entier 7, la chaine de caracteres Quoi de neuf ? et le nombre reel 3,14159. Les trois instructions d'affectation ci-dessus ont eu pour effet chacune de realiser plusieurs operations dans la memoire de l'ordinateur : • creer et memoriser un nom de variable ; • lui attribuer un type bien determine (ce point sera explicite a la page suivante) ; • creer et memoriser une valeur particuliere ; • etablir un lien (par un systeme interne de pointeurs) entre le nom de la variable et l'emplacement memoire de la valeur correspondante. On peut mieux se representer tout cela par un diagramme d'etat tel que celui-ci : n msg pi ill 7 Quoi de neuf? 3.14159 Les trois noms de variables sont des references, memorisees dans une zone particuliere de la memoire que Ton appelle espace de noms, alors que les valeurs correspondantes sont situees ailleurs, dans des emplacements parfois fort eloignes les uns des autres. Nous aurons l'occasion de preciser ce concept plus loin dans ces pages. 9 II faut bien comprendre qu'il ne s'agit en aucune facon d'une egalite, et que Ton aurait tres bien pu choisir un autre symbolisme, tel que n <— 7 par exemple, comme on le fait souvent dans certains pseudo-langages servant a decrire des algorithmes, pour bien montrer qu'il s'agit de relier un contenu (la valeur 7) a un contenant (la variable n). Gerard Swinnen : Apprendre a programmer avec Python 23. 2.5 Afficher la valeur d'une variable A la suite de l'exercice ci-dessus, nous disposons done des trois variables n, msg et pi. Pour afficher leur valeur a l'ecran, il existe deux possibilites. La premiere consiste a entrer au clavier le nom de la variable, puis . Python repond en affichant la valeur correspondante : >» n 7 >>> msg "Quoi de neuf ?" »> pi 3.14159 II s'agit cependant la d'une fonctionnalite secondaire de l'interpreteur, qui est destinee a vous faciliter la vie lorsque vous faites de simples exercices a la ligne de commande. A l'interieur d'un programme, vous utiliserez toujours l'instruction print : >>> print msg Quoi de neuf ? Remarquez la subtile difference dans les affichages obtenus avec chacune des deux methodes. L'instruction print n'affiche strictement que la valeur de la variable, telle qu'elle a ete encodee, alors que l'autre methode (celle qui consiste a entrer seulement le nom de la variable) affiche aussi des guillemets (afin de vous rappeler le type de la variable : nous y reviendrons). 2.6 Typage des variables Sous Python, il n'est pas necessaire d'ecrire des lignes de programme specifiques pour definir le type des variables avant de pouvoir les utiliser. II vous suffit en effet d'assigner une valeur a un nom de variable pour que celle-ci soit automatiquement creee avec le type qui correspond au mieux a la valeur fournie. Dans l'exercice precedent, par exemple, les variables n, msg et pi ont ete creees automatiquement chacune avec un type different (« nombre entier » pour n, « chaine de caracteres » pour msg, « nombre a virgule flottante » (ou « float », en anglais) pour pi). Ceci constitue une particularity interessante de Python, qui le rattache a une famille particuliere de langages ou Ton trouve aussi par exemple Lisp, Scheme, et quelques autres. On dira a ce sujet que le typage des variables sous Python est un typage dynamique, par opposition au typage statique qui est de regie par exemple en C++ ou en Java. Dans ces langages, il faut toujours - par des instructions distinctes - d'abord declarer (definir) le nom et le type des variables, et ensuite seulement leur assigner un contenu, lequel doit bien entendu etre compatible avec le type declare. Le typage statique est preferable dans le cas des langages compiles, parce qu'il permet d'optimiser l'operation de compilation (dont le resultat est un code binaire « fige »). Le typage dynamique quant a lui permet d'ecrire plus aisem*nt des constructions logiques de niveau eleve (metaprogrammation, reflexivite), en particulier dans le contexte de la programmation orientee objet (polymorphisme). II facilite egalement l'utilisation de structures de donnees tres riches telles que les listes et les dictionnaires. 24. Gerard Swinnen : Apprendre a programmer avec Python 2.7 Affectations multiples Sous Python, on peut assigner une valeur a plusieurs variables simultanement. Exemple : »> x = y >>> x 7 »> y 7 = 7 On peut aussi effectuer des affectations paralleles a l'aide d'un seul operateur : »> a, b = 4, 8.33 »> a 4 »> b 8.33 Dans cet exemple, les variables a et b prennent simultanement les nouvelles valeurs 4 et 8,33. Attention : les francophones que nous sommes avons pour habitude d'utiliser la virgule comme separateur decimal, alors que les langages de programmation utilisent toujours la convention en vigueur dans les pays de langue anglaise, c'est-d-dire le point decimal. La virgule, quant a elle, est tres generalement utilisee pour separer differents elements (arguments, etc.) comme on le voit dans notre exemple, pour les variables elles-memes ainsi que pour les valeurs qu'on leur attribue. (2) Exercices 2.1. Decrivez le plus clairement et le plus completement possible ce qui se passe a chacune des trois lignes de l'exemple ci-dessous : »> largeur = 20 >» hauteur = 5 * 9.3 »> largeur * hauteur 930 2.2. Assignez les valeurs respectives 3, 5, 7 a trois variables a, b, c. Effectuez l'operation a - b/c . Le resultat est-il mathematiquement correct ? Si ce n'est pas le cas, comment devez-vous proceder pour qu'il le soit ? Gerard Swinnen : Apprendre a programmer avec Python 25. 2.8 Operateurs et expressions On manipule les valeurs et les variables qui les referencent, en les combinant avec des operateurs pour former des expressions. Exemple : a, b = 7.3, 12 y = 3*a + b/5 Dans cet exemple, nous commencons par affecter aux variables a et b les valeurs 7,3 et 12. Comme deja explique precedemment, Python assigne automatiquement le type « reel » a la variable a, et le type « entier » a la variable b. La seconde ligne de l'exemple consiste a affecter a une nouvelle variable y le resultat d'une expression qui combine les operateurs * , + et / avec les operandes a, b, 3 et 5. Les operateurs sont les symboles speciaux utilises pour representer des operations mathematiques simples, telles l'addition ou la multiplication. Les operandes sont les valeurs combinees a l'aide des operateurs. Python evalue chaque expression qu'on lui soumet, aussi compliquee soit-elle, et le resultat de cette evaluation est toujours lui-meme une valeur. A cette valeur, il attribue automatiquement un type, lequel depend de ce qu'il y a dans l'expression. Dans l'exemple ci-dessus, y sera du type reel, parce que l'expression evaluee pour determiner sa valeur contient elle-meme au moins un reel. Les operateurs Python ne sont pas seulement les quatre operateurs mathematiques de base. II faut leur ajouter l'operateur ** pour l'exponentiation, ainsi qu'un certain nombre d' operateurs logiques, des operateurs agissant sur les chaines de caracteres, des operateurs effectuant des tests d'identite ou d'appartenance, etc. Nous reparlerons de tout cela plus loin. Signalons au passage la disponibilite de l'operateur modulo, represents par le symbole %. Cet operateur fournit le reste de la division entier e d'un nombre par un autre. Essay ez par exemple : »> 10 % 3 (et prenez note de ce qui se passe ! ) »> 10 % 5 Cet operateur vous sera tres utile plus loin, notamment pour tester si un nombre a est divisible par un nombre b. II suffira en effet de verifier que a % b donne un resultat egal a zero. Exercice : 2.3. Testez les lignes d'instructions suivantes. Decrivez dans votre cahier ce qui se passe : »> r , pi = 12, 3.14159 »> s = pi * r**2 »> print s »> print type(r), type (pi), type(s) »> Quelle est, a votre avis, l'utilite de la fonction type() ? (Note : les fonctions seront decrites en detail, plus loin dans ce cours). 26. Gerard Swinnen : Apprendre a programmer avec Python 2.9 Priorite des operations Lorsqu'il y a plus d'un operateur dans une expression, l'ordre dans lequel les operations doivent etre effectuees depend de regies de priorite. Sous Python, les regies de priorite sont les memes que celles qui vous ont ete enseignees au cours de mathematique. Vous pouvez les memoriser aisem*nt a l'aide d'un « true » mnemotechnique, l'acronyme PEMDAS : • P pour parentheses. Ce sont elles qui ont la plus haute priorite. Elles vous permettent done de « forcer » revaluation d'une expression dans l'ordre que vous voulez. Ainsi 2* (3-1) = 4 , et (1+1)** (5-2) = 8. • E pour exposants. Les exposants sont evalues ensuite, avant les autres operations. Ainsi 2**1+1 = 3(etnon4), et 3*1**10 = 3 (et non 59049 !). • M et D pour multiplication et division, qui ont la meme priorite. Elles sont evaluees avant V addition A et la soustraction S, lesquelles sont done effectuees en dernier lieu. Ainsi 2*3-1 = 5 (plutot que 4), et 2/3-1 = -1 (Rappelez-vous que par defaut Python effectue une division entiere). • Si deux operateurs ont la meme priorite, revaluation est effectuee de gauche a droite. Ainsi dans l'expression 59*100/60, la multiplication est effectuee en premier, et la machine doit done ensuite effectuer 5900/60, ce qui donne 98. Si la division etait effectuee en premier, le resultat serait 59 (rappelez-vous ici encore qu'il s'agit d'une division entiere). Gerard Swinnen : Apprendre a programmer avec Python 27. 2.10 Composition Jusqu'ici nous avons examine les differents elements d'un langage de programmation, a savoir : les variables, les expressions et les instructions, mais sans traiter de la maniere dont nous pouvons les combiner les unes avec les autres. Or Tune des grandes forces d'un langage de programmation de haut niveau est qu'il permet de construire des instructions complexes par assemblage de fragments divers. Ainsi par exemple, si vous savez comment additionner deux nombres et comment afficher une valeur, vous pouvez combiner ces deux instructions en une seule : »> print 17 + 3 »> 20 Cela n'a fair de rien, mais cette fonctionnalite qui parait si evidente va vous permettre de programmer des algorithmes complexes de facon claire et concise. Exemple : »> h, m, s = 15, 27, 34 >>> print "nombre de secondes ecoulees depuis minuit = ", h*3600 + m*60 + s Attention cependant : il y a une limite a ce que vous pouvez combiner ainsi : Ce que vous placez a la gauche du signe egale dans une expression doit toujours etre une variable, et non une expression. Cela provient du fait que le signe egale n'a pas ici la meme signification qu'en mathematique : comme nous l'avons deja signale, il s'agit d'un symbole d'affectation (nous placons un certain contenu dans une variable) et non un symbole d'egalite. Le symbole d'egalite (dans un test conditionnel, par exemple) sera evoque un peu plus loin. Ainsi par exemple, l'instruction m + 1 = b est tout a fait illegale. Par contre, ecrire a = a + 1 est inacceptable en mathematique, alors que cette forme d'ecriture est tres frequente en programmation. L'instruction a = a + 1 signifie en l'occurrence « augmenter la valeur de la variable a d'une unite » (ou encore : « incrementer a »). Nous aurons l'occasion de revenir bientot sur ce sujet. Mais auparavant, il nous faut encore aborder un autre concept de grande importance. 28. Gerard Swinnen : Apprendre a programmer avec Python Chapitre 3 : Controle du flux d'instructions Dans notre premier chapitre, nous avons vu que l'activite essentielle d'un analyste-programmeur est la resolution de problemes. Or, pour resoudre un probleme informatique, il faut toujours effectuer une serie factions dans un certain ordre. La description structuree de ces actions et de l'ordre dans lequel il convient de les effectuer s'appelle un algorithme. Les structures de controle sont les groupes d'instructions qui determinent l'ordre dans lequel les actions sont effectuees. En programmation moderne, il en existe seulement trois : la sequence et la selection, que nous allons decrire dans ce chapitre, et la repetition que nous aborderons au chapitre suivant. 3. 1 Sequence 10 d'instructions Sauf mention explicite, les instructions d'un programme s'executent les unes apres les autres, dans l'ordre ou elles ont ete ecrites a I'interieur du script. Le « chemin » suivi par Python a travers un programme est appele un flux d'instructions, et les constructions qui le modifient sont appelees des instructions de controle de flux. Python execute normalement les instructions de la premiere a la derniere, sauf lorsqu'il rencontre une instruction conditionnelle comme l'instruction if decrite ci-apres (nous en rencontrerons d'autres plus loin, notamment a propos des boucles de repetition). Une telle instruction va permettre au programme de suivre differents chemins suivant les circonstances. 3.2 Selection ou execution conditionnelle Si nous voulons pouvoir ecrire des applications veritablement utiles, il nous faut des techniques permettant d'aiguiller le deroulement du programme dans differentes directions, en fonction des circonstances rencontrees. Pour ce faire, nous devons disposer d'instructions capables de tester une certaine condition et de modifier le comportement du programme en consequence. La plus simple de ces instructions conditionnelles est l'instruction if. Pour experimenter son fonctionnement, veuillez entrer dans votre editeur Python les deux lignes suivantes : »> a = 150 »> if (a > 100) : La premiere commande affecte la valeur 150 a la variable a. Jusqu'ici rien de nouveau. Lorsque vous finissez d'entrer la seconde ligne, par contre, vous constatez que Python reagit d'une nouvelle maniere. En effet, et a moins que vous n'ayez oublie le caractere « : » a la fin de la ligne, vous constatez que le prompt principal (»>) est maintenant remplace par un prompt secondaire constitute de trois points 11 . Si votre editeur ne le fait pas automatiquement, vous devez a present effectuer une tabulation (ou entrer 4 espaces) avant d'entrer la ligne suivante, de maniere a ce que celle-ci soit indentee (c'est-a- dire en retrait) par rapport a la precedente. Votre ecran devrait se presenter maintenant comme suit : 10 Tel qu'il est utilise ici, le terme de sequence designe done une serie d'instructions qui se suivent. Nous prefererons dans la suite de cet ouvrage reserver ce terme a un concept Python precis, lequel englobe les chatnes de caracteres, les tuples et les listes (voir plus loin). 1 1 Dans certaines versions de l'editeur Python pour Windows, le prompt secondaire n'apparait pas. Gerard Swinnen : Apprendre a programmer avec Python 29. »> a = 150 »> if (a > 100) : print "a depasse la centaine" Frappez encore une fois . Le programme s'execute, et vous obtenez : a depasse la centaine Recommencez le meme exercice, mais avec a = 20 en guise de premiere ligne : cette fois Python n'affiche plus rien du tout. L'expression que vous avez placee entre parentheses est ce que nous appellerons desormais une condition. L'instruction if permet de tester la validite de cette condition. Si la condition est vraie, alors l'instruction que nous avons indentee apres le « : » est executee. Si la condition est fausse, rien ne se passe. Notez que les parentheses utilisees ici sont optionnelles sous Python. Nous les avons utilisees pour ameliorer la lisibilite. Dans d'autres langages, il se peut qu'elles soient obligatoires. Recommencez encore, en ajoutant deux lignes comme indique ci-dessous. Veillez bien a ce que la quatrieme ligne debute tout a fait a gauche (pas d'indentation), mais que la cinquieme soit a nouveau indentee (de preference avec un retrait identique a celui de la troisieme) : »> a = 20 »> if (a > 100) : print "a depasse la centaine" . . . else : print "a ne depasse pas cent" Frappez encore une fois. Le programme s'execute, et affiche cette fois : a ne depasse pas cent Comme vous l'aurez certainement deja compris, l'instruction else (« sinon », en anglais) permet de programmer une execution alternative, dans laquelle le programme doit choisir entre deux possibilites. On peut faire mieux encore en utilisant aussi l'instruction elif (contraction de « else if»): »> a = 0 >» if a > 0 : print "a est positif " . . . elif a < 0 : print "a est negatif " . . . else : print "a est nul" 30. Gerard Swinnen : Apprendre a programmer avec Python 3.3 Operateurs de comparaison La condition evaluee apres l'instruction if peut contenir les operateurs de comparaison suivants : x == y # x est egal a y x != y # x est different de y x > y # x est plus grand que y x < y # x est plus petit que y x >= y # x est plus grand que, ou egal a y x <= y # x est plus petit que, ou egal a y Exemple : »> a = 7 »> if (a % 2 == 0) : print "a est pair" print "parce que le reste de sa division par 2 est nul" else : print "a est impair" Notez bien que l'operateur de comparaison pour l'egalite de deux valeurs est constitute de deux signes « egale » et non d'un seul 12 . (Le signe « egale » utilise seul est un operateur d'affectation, et non un operateur de comparaison. Vous retrouverez le meme symbolisme en C+ + et en Java). 3.4 Instructions composees - Blocs d'instructions La construction que vous avez utilisee avec l'instruction if est votre premier exemple ^instruction composee. Vous en rencontrerez bientot d'autres. Sous Python, toutes les instructions composees ont toujours la meme structure : une ligne d'en-tete terminee par un double point, suivie d'une ou de plusieurs instructions indentees sous cette ligne d'en-tete. Exemple : Ligne d ' en-tete : premiere instruction du bloc derniere instruction du bloc S'il y a plusieurs instructions indentees sous la ligne d'en-tete, elles doivent I'etre exactement au meme niveau (comptez un decalage de 4 caracteres, par exemple). Ces instructions indentees constituent ce que nous appellerons desormais un bloc d'instructions. Un bloc d'instructions est une suite d'instructions formant un ensemble logique, qui n'est execute que dans certaines conditions definies dans la ligne d'en-tete. Dans l'exemple du paragraphe precedent, les deux lignes d'instructions indentees sous la ligne contenant l'instruction if constituent un meme bloc logique : ces deux lignes ne sont executees - toutes les deux - que si la condition testee avec l'instruction if se revele vraie, c'est-a-dire si le reste de la division de a par 2 est nul. 12 Rappel : l'operateur % est l'operateur modulo : il calcule le reste d'une division entiere. Ainsi par exemple, a % 2 fournit le reste de la division de a par 2. Gerard Swinnen : Apprendre a programmer avec Python 31. 3.5 Instructions imbriquees II est parfaitement possible d'imbriquer les unes dans les autres plusieurs instructions composees, de maniere a realiser des structures de decision complexes. Exemple : if embranchement == "vertebres" : # 1 if classe == "mammi feres" : # 2 if ordre == "carnivores": # 3 if famille == "felins" : # 4 print "c'est peut-etre un chat" # 5 print "c'est en tous cas un mammi fere" # 6 elif classe == 'oiseaux': # 7 print "c'est peut-etre un canari" # 8 prinf'la classification des animaux est complexe" # 9 Analysez cet exemple. Ce fragment de programme n'imprime la phrase « c'est peut-etre un chat » que dans le cas ou les quatre premieres conditions testees sont vraies. Pour que la phrase « c'est en tous cas un mammifere » soit affichee, il faut et il suffit que les deux premieres conditions soient vraies. L'instruction d'affichage de cette phrase (ligne 4) se trouve en effet au meme niveau d'indentation que l'instruction : if ordre == "carnivores": (ligne 3). Les deux font done partie d'un meme bloc, lequel est entierement execute si les conditions testees aux lignes 1 & 2 sont vraies. Pour que la phrase « c'est peut-etre un canari » soit affichee, il faut que la variable embranchement contienne « vertebres », et que la variable classe contienne « oiseaux ». Quant a la phrase de la ligne 9, elle est affichee dans tous les cas, parce qu'elle fait partie du meme bloc d'instructions que la ligne 1 . 3.6 Quelques regies de syntaxe Python Tout ce qui precede nous amene a faire le point sur quelques regies de syntaxe : 3.6.1 Les limites des instructions et des blocs sont definies par la mise en page Dans de nombreux langages de programmation, il faut terminer chaque ligne d'instructions par un caractere special (souvent le point-virgule). Sous Python, c'est le caractere de fin de ligne 13 qui joue ce role. (Nous verrons plus loin comment outrepasser cette regie pour etendre une instruction complexe sur plusieurs lignes). On peut egalement terminer une ligne d'instructions par un commentaire. Un commentaire Python commence toujours par le caractere special # . Tout ce qui est inclus entre ce caractere et le saut a la ligne suivant est completement ignore par le compilateur. Dans la plupart des autres langages, un bloc d'instructions doit etre delimite par des symboles specifiques (parfois meme par des instructions, telles que begin et end). En C+ + et en Java, par exemple, un bloc d'instructions doit etre delimite par des accolades. Cela permet d'ecrire les blocs d'instructions les uns a la suite des autres, sans se preoccuper d'indentation ni de sauts a la ligne, mais cela peut conduire a l'ecriture de programmes confus, difficiles a relire pour les pauvres humains que nous sommes. On conseille done a tous les programmeurs qui utilisent ces langages de se servir aussi des sauts a la ligne et de l'indentation pour bien delimiter visuellement les blocs. 13 Ce caractere n'apparait ni a l'ecran, ni sur les listings imprimes. II est cependant bien present, a un point tel qu'il fait meme probleme dans certains cas, parce qu'il n'est pas encode de la meme maniere par tous les systemes d'exploitation. Nous en reparlerons plus loin, a l'occasion de notre etude des fichiers texte (page 115). 32. Gerard Swinnen : Apprendre a programmer avec Python Avec Python, vous devez utiliser les sauts a la ligne et l'indentation, mais en contrepartie vous n'avez pas a vous preoccuper d'autres symboles delimiteurs de blocs. En definitive, Python vous force done a ecrire du code lisible, et a prendre de bonnes habitudes que vous conserverez lorsque vous utiliserez d'autres langages. 3.6.2 Instruction composee = En-tete , double point , bloc constructions indente Bloc 1 Ligne d' en-tete Nous aurons de nombreuses occasions d'approfondir le concept de « bloc destructions » et de faire des exercices a ce sujet, des le chapitre suivant. Le schema ci-contre en resume le principe. • Les blocs d'instructions sont toujours associes a une ligne d'en-tete contenant une instruction bien specifique (if, elif, else, while, def, ...) se terminant par un double point. ' Les blocs sont delimites par l'indentation : toutes les lignes d'un meme bloc doivent etre indentees exactement de la meme maniere (e'est-a-dire decalees vers la droite d'un meme nombre d'espaces 14 ). Le nombre d'espaces a utiliser pour l'indentation est quelconque, mais la plupart des programmeurs utilisent des multiples de 4. • Notez que le code du bloc le plus externe (bloc 1) ne peut pas lui-meme etre ecarte de la marge de gauche (II n'est imbrique dans rien). Bloc 2 Ligne d'en-tete : Bloc 3 Bloc 2 (suite) Bloc 1 (suite) 3.6.3 Les espaces et les commentaires sont normalement ignores A part ceux qui servent a l'indentation, en debut de ligne, les espaces places a l'interieur des instructions et des expressions sont presque toujours ignores (sauf s'ils font partie d'une chaine de caracteres). II en va de meme pour les commentaires : ceux-ci commencent toujours par un caractere diese (#) et s'etendent jusqu'a la fin de la ligne courante. 14 Vous pouvez aussi indenter a l'aide de tabulations, mais alors vous devrez faire tres attention a ne pas utiliser tantot des espaces, tantot des tabulations pour indenter les lignes d'un meme bloc. En effet, et meme si le resultat parait identique a l'ecran, espaces et tabulations sont des codes binaires distincts : Python considerera done que ces lignes indentees differemment font partie de blocs differents. II peut en resulter des erreurs difficiles a deboguer. En consequence, la plupart des programmeurs preferent se passer des tabulations. Si vous utilisez un editeur "intelligent", vous pouvez escamoter le probleme en activant l'option "Remplacer les tabulations par des espaces". Gerard Swinnen : Apprendre a programmer avec Python 33. Chapitre 4 : Instructions repetitives. L'une des taches que les machines font le mieux est la repetition sans erreur de taches identiques. II existe bien des methodes pour programmer ces taches repetitives. Nous allons commencer par l'une des plus fondamentales : la boucle de repetition construite autour de l'instruction while. 4.1 Re-affectation Nous ne l'avions pas encore signale explicitement : il est permis de re-affecter une nouvelle valeur a une meme variable, autant de fois qu'on le souhaite. L'effet d'une re-affectation est de remplacer l'ancienne valeur d'une variable par une nouvelle. »> altitude = 320 >>> print altitude 320 »> altitude = 375 >>> print altitude 375 Ceci nous amene a attirer une nouvelle fois votre attention sur le fait que le symbole egale utilise sous Python pour realiser une affectation ne doit en aucun cas etre confondu avec un symbole d'egalite tel qu'il est compris en mathematique. II est tentant d'interpreter l'instruction altitude = 320 comme une affirmation d'egalite, mais ce n'en n'est pas une ! • Premierement, l'egalite est commutative, alors que l'affectation ne Test pas. Ainsi, en mathematique, les ecritures a = 7 et 7 = a sont equivalentes, alors qu'une instruction de programmation telle que 375 = altitude serait illegale. • Deuxiemement, l'egalite est permanente, alors que l'affectation peut etre remplacee comme nous venons de le voir. Lorsqu'en mathematique, nous affirmons une egalite telle que a = b au debut d'un raisonnement, alors a continue a etre egal a b durant tout le developpement qui suit. En programmation, une premiere instruction d'affectation peut rendre egales les valeurs de deux variables, et une instruction ulterieure en changer ensuite l'une ou l'autre. Exemple : »> a = 5 >» b = a # a et b contiennent des valeurs egales >>> b = 2 # a et b sont maintenant differentes Rappelons ici que Python permet d'affecter leurs valeurs a plusieurs variables simultanement : »> a, b, c, d = 3, 4, 5, 7 Cette fonctionnalite de Python est bien plus interessante encore qu'elle n'en a fair a premiere vue. Supposons par exemple que nous voulions maintenant echanger les valeurs des variables a et c. (Actuellement, a contient la valeur 3, et c la valeur 5. Nous voudrions que ce soit l'inverse). Comment faire ? (4) Exercice 4.1. Ecrivez les lignes d' instructions necessaires pour obtenir ce resultat. 34. Gerard Swinnen : Apprendre a programmer avec Python A la suite de l'exercice propose ci-dessus, vous aurez certainement trouve une methode, et votre professeur vous demandera probablement de la commenter en classe. Comme il s'agit d'une operation courante, les langages de programmation proposent souvent des raccourcis pour l'effectuer (par exemple des instructions specialisees, telle l'instruction SWAP du langage Basic). Sous Python, / 'affectation multiple permet de programmer l'echange d'une maniere particulierement elegante : »> a, b = b, a (On pourrait bien entendu echanger d'autres variables en meme temps, dans la meme instruction). 4.2 Repetitions en boucle - l'instruction while L'une des choses que les machines font le mieux est la repetition sans erreur de taches identiques. II existe bien des methodes pour programmer ces taches repetitives. Nous allons commencer par l'une des plus fondamentales : la boucle construite a partir de l'instruction while. Veuillez done entrer les commandes ci-dessous : »> a = 0 »> while (a < 7) : # (n'oubliez pas le double point !) ... a = a + 1 # (n'oubliez pas 1 ' indentation !) print a Frappez encore une fois . Que se passe-t-il ? Avant de lire les commentaires de la page suivante, prenez le temps d'ouvrir votre cahier et d'y noter cette serie de commandes. Decrivez aussi le resultat obtenu, et essayez de l'expliquer de la maniere la plus detaillee possible. Gerard Swinnen : Apprendre a programmer avec Python 35. Commentaires Le mot while signifie « tant que » en anglais. Cette instruction utilisee a la seconde ligne indique a Python qu'il lui faut repeter continuellement le bloc d 'instructions qui suit, tant que le contenu de la variable a reste inferieur a 7. Comme l'instruction if abordee au chapitre precedent, l'instruction while amorce une instruction composee. Le double point a la fin de la ligne introduit le bloc d'instructions a repeter, lequel doit obligatoirement se trouver en retrait. Comme vous l'avez appris au chapitre precedent, toutes les instructions d'un meme bloc doivent etre indentees exactement au meme niveau (c'est-a-dire decalees a droite d'un meme nombre d'espaces). Nous avons ainsi construit notre premiere boucle de progr animation, laquelle repete un certain nombre de fois le bloc d'instructions indentees. Voici comment cela fonctionne : • Avec l'instruction while, Python commence par evaluer la validite de la condition fournie entre parentheses (Celles-ci sont optionnelles. Nous ne les avons utilisees que pour clarifier notre explication). • Si la condition se revele fausse, alors tout le bloc qui suit est ignore et l'execution du programme se termine 15 . • Si la condition est vraie, alors Python execute tout le bloc d'instructions constituant le corps de la boucle, c'est-a-dire : • l'instruction a = a + 1 qui incremente d'une unite le contenu de la variable a (ce qui signifie que Ton affecte a la variable a une nouvelle valeur, qui est egale a la valeur precedente augmentee d'une unite). • l'instruction print qui affiche la valeur courante de la variable a • lorsque ces deux instructions ont ete executees, nous avons assiste a une premiere iteration, et le programme boucle, c'est-a-dire que l'execution reprend a la ligne contenant l'instruction while. La condition qui s'y trouve est a nouveau evaluee, et ainsi de suite. Dans notre exemple, si la condition a<7 est encore vraie, le corps de la boucle est execute une nouvelle fois et le bouclage se poursuit. Remarques : • La variable evaluee dans la condition doit exister au prealable (II faut qu'on lui ait deja affecte au moins une valeur) • Si la condition est fausse au depart, le corps de la boucle n'est jamais execute • Si la condition reste toujours vraie, alors le corps de la boucle est repete indefiniment (tout au moins tant que Python lui-meme continue a fonctionner). II faut done veiller a ce que le corps de la boucle contienne au moins une instruction qui change la valeur d'une variable intervenant dans la condition evaluee par while, de maniere a ce que cette condition puisse devenir fausse et la boucle se terminer. Exemple de boucle sans fin (a eviter) : »> n = 3 »> while n < 5: print "hello ! " 15 ... du moins dans cet exemple. Nous verrons un peu plus loin qu'en fait l'execution continue avec la premiere instruction qui suit le bloc indente, et qui fait partie du meme bloc que l'instruction while elle-meme. 36. Gerard Swinnen : Apprendre a programmer avec Python 4.3 Elaboration de tables Recommencez a present le premier exercice, mais avec la petite modification ci-dessous : »> a = 0 »> while a < 12 : a = a +1 print a , a**2 , a**3 Vous devriez obtenir la liste des carres et des cubes des nombres de 1 a 12. Notez au passage que l'instruction print permet d'afficher plusieurs expressions l'une a la suite de l'autre sur la meme ligne : il suffit de les separer par des virgules. Python insere automatiquement un espace entre les elements affiches. 4.4 Construction d'une suite mathematique Le petit programme ci-dessous permet d'afficher les dix premiers termes d'une suite appelee « Suite de Fibonacci ». II s'agit d'une suite de nombres, dont chaque terme est egal a la somme des deux termes qui le precedent. Analysez ce programme (qui utilise judicieusem*nt {'affectation multiple). Decrivez le mieux possible le role de chacune des instructions. »> a, b, c = 1, 1, 1 »> while c < 11 : print b, ... a, b, c = b, a+b, c+1 Lorsque vous lancez l'execution de ce programme, vous obtenez : 1 2 3 5 8 13 21 34 55 89 Les termes de la suite de Fibonacci sont affiches sur la meme ligne. Vous obtenez ce resultat grace a la virgule placee a la fin de la ligne qui contient l'instruction print. Si vous supprimez cette virgule, les nombres seront affiches l'un en-dessous de l'autre. Dans vos programmes futurs, vous serez tres souvent amenes a mettre au point des boucles de repetition comme celle que nous analysons ici. II s'agit d'une question essentielle, que vous devez apprendre a maitriser parfaitement. Soyez sur que vous y arriverez progressivement, a force d'exercices. Lorsque vous examinez un probleme de cette nature, vous devez considerer les lignes d'instruction, bien entendu, mais surtout decortiquer les etats successifs des differentes variables impliquees dans la boucle. Cela n'est pas toujours facile, loin de la. Pour vous aider a y voir plus clair, prenez la peine de dessiner sur papier une table d'etats similaire a celle que nous reproduisons ci-dessous pour notre programme « suite de Fibonacci » : Variables a b c Valeurs initiales 1 1 1 Valeurs prises 1 2 2 successivement, au 2 3 3 cours des iterations 3 5 4 5 8 5 Expression de b a+b c+1 remplacement Gerard Swinnen : Apprendre a programmer avec Python 37. Dans une telle table, on effectue en quelque sorte « a la main » le travail de l'ordinateur, en indiquant ligne par ligne les valeurs que prendront chacune des variables au fur et a mesure des iterations successives. On commence par inscrire en haut du tableau les noms des variables concernees. Sur la ligne suivante, les valeurs initiales de ces variables (valeurs qu'elles possedent avant le demarrage de la boucle). Enfin, tout en bas du tableau, les expressions utilisees dans la boucle pour modifier l'etat de chaque variable a chaque iteration. On remplit alors quelques lignes correspondant aux premieres iterations. Pour etablir les valeurs d'une ligne, il suffit d'appliquer a celles de la ligne precedente, l'expression de remplacement qui se trouve en bas de chaque colonne. On verifie ainsi que Ton obtient bien la suite recherchee. Si ce n'est pas le cas, il faut essayer d'autres expressions de remplacement. Exercices : 4.2. Ecrivez un programme qui affiche les 20 premiers termes de la table de multiplication par 7. 4.3. Ecrivez un programme qui affiche une table de conversion de sommes d' argent exprimees en euros, en dollars canadiens. La progression des sommes de la table sera « geometrique », comme dans l'exemple ci-dessous : 1 euro(s) =1.65 dollar (s) 2 euro(s) =3.30 dollar (s) 4 euro(s) = 6.60 dollar (s) 8 euro(s) = 13.20 dollar (s) etc. (S'arreter a 16384 euros) 4.4. Ecrivez un programme qui affiche une suite de 12 nombres dont chaque terme soit egal au triple du terme precedent. 4.5 Premiers scripts, ou : Comment conserver nos programmes ? Jusqu'a present, vous avez toujours utilise Python en mode interactif (c'cst-a-divc que vous avez a chaque fois entre les commandes directement dans l'interpreteur, sans les sauvegarder au prealable dans un fichier). Cela vous a permis d'apprendre tres rapidement les bases du langage, par experimentation directe. Cette facon de faire presente toutefois un gros inconvenient : toutes les sequences destructions que vous avez ecrites disparaissent irremediablement des que vous fermez l'interpreteur. Avant de poursuivre plus avant votre etude, il est done temps que vous appreniez a sauvegarder vos programmes dans des fichiers, sur disque dur ou disquette, de maniere a pouvoir les retravailler par etapes successives, les transferer sur d'autres machines, etc. Pour ce faire, vous allez desormais rediger vos sequences destructions dans un editeur de textes quelconque (par exemple Joe, Nedit, Kate ... sous Linux, Edit sous MS-DOS, Wordpad sous Windows, ou mieux encore l'editeur incorpore dans une interface de developpement telle que IDLE ou PythonWin). Ainsi vous ecrirez un script, que vous pourrez ensuite sauvegarder, modifier, copier, etc. comme n'importe quel autre texte traite par ordinateur 16 . La figure ci-dessous illustre l'utilisation de l'editeur Nedit sous Gnome (Linux) : 16 II serait parfaitement possible d'utiliser un systeme de traitement de textes, a la condition d'effectuer la sauvegarde sous un format "texte pur" (sans balises de mise en page). II est cependant preferable d'utiliser un veritable editeur ANSI "intelligent" tel que nedit ou IDLE, muni d'une fonction de coloration syntaxique pour Python, qui vous aide a eviter les fautes de syntaxe. Avec IDLE, suivez le menu : File — > New window (ou frappez CTRL-N) pour ouvrir une nouvelle fenetre dans laquelle vous ecrirez votre script. Pour l'executer, il vous suffira (apres sauvegarde), de suivre le menu : Edit -> Run script (ou de frapper CTRL-F5). 38. Gerard Swinnen : Apprendre a programmer avec Python File Edit Search Preferences Shell Macro Windows Help /dos_data/python/essais/fibo1.py DOS 496 bytes # Premier essai de script Python # petit programme simple affichant une suite de Fibonacci , c.a.d. une suite # de nombres dont chaque terme est egal a la somme des deux precedents . print "Suite de Fibonacci :" a / b / c= 1,1,1 # a & b servent au calcul des termes successifs # c est un simple compteur print. 1 # affichage du premier terme while c<15 : # nous afficherons 15 termes au total a,b,c = b,a+b,c+l print b Par la suite, lorsque vous voudrez tester l'execution de votre programme, il vous suffira de lancer l'interpreteur Python en lui fournissant (comme argument) le nom du fichier qui contient le script. Par exemple, si vous avez place un script dans un fichier nomme « MonScript », il suffira d'entrer la commande suivante dans une fenetre de terminal pour que ce script s'execute : python MonScript Pour faire mieux encore, veillez a donner au fichier un nom qui se termine par l'extension .py Si vous respectez cette convention, vous pourrez (sous Windows, KDE, Gnome, ...) lancer l'execution du script, simplement en cliquant sur son nom ou sur l'icone correspondante dans le gestionnaire de fichiers (c'est-a-dire l'explorateur, sous Windows, ou Konqueror, sous KDE). Ces gestionnaires graphiques « savent » en effet qu'il doivent lancer l'interpreteur Python chaque fois que leur utilisateur essaye d'ouvrir un fichier dont le nom se termine par .py. (Cela suppose bien entendu qu'ils aient ete correctement configures). La meme convention permet en outre aux editeurs « intelligents » de reconnaitre automatiquement les scripts Python et d'adapter leur coloration syntaxique en consequence. Un script Python contiendra des sequences destructions identiques a celles que vous avez experimentees jusqu'a present. Puisque ces sequences sont destinees a etre conservees et relues plus tard par vous-meme ou par d'autres, il vous est tres fortement recommande d'expliciter vos scripts le mieux possible, en y incorporant de nombreux commentaires. La principale difficulty de la programmation consiste en effet a mettre au point des algorithmes corrects. Afin que ces algorithmes puissent etre verifies, corriges, modifies, etc. dans de bonnes conditions, il est essentiel que leur auteur les decrive le plus completement et le plus clairement possible. Et le meilleur emplacement pour cette description est le corps meme du script (ainsi elle ne peut pas s'egarer). Un bon programmeur veille toujours a inserer un grand nombre de commentaires dans ses scripts. En procedant ainsi, non seulement il facilite la comprehension de ses algorithmes pour d'autres lecteurs eventuels, mais encore il se force lui-meme a avoir les idees plus claires. On peut inserer des commentaires quelconques a peu pres n'importe ou dans un script. II suffit de les faire preceder d'un caractere #. Lorsqu'il rencontre ce caractere, l'interpreteur Python ignore tout ce qui suit, jusqu'a la fin de la ligne courante. Comprenez bien qu'il est important d'inclure des commentaires au fur et d mesure de l'avancement de votre travail de programmation. N'attendez pas que votre script soit termine pour les aj outer « apres coup ». Vous vous rendrez progressivement compte qu'un programmeur passe enormement de temps a relire son propre code (pour le modifier, y rechercher des erreurs, etc). Cette relecture sera grandement facilitee si le code comporte de nombreuses explications et Gerard Swinnen : Apprendre a programmer avec Python 39. remarques. Ouvrez done un editeur de texte, et redigez le script ci-dessous # Premier essai de script Python # petit programme simple affichant une suite de Fibonacci, c.a.d. une suite # de nombres dont chaque terme est egal a la somme des deux precedents . a, b, c = 1, 1, 1 #a&b servent au calcul des termes successifs # c est un simple compteur print 1 # affichage du premier terme while c<15: # nous afficherons 15 termes au total a, b, c = b, a+b, c+1 print b Afin de vous montrer tout de suite le bon exemple, nous commencons ce script par trois lignes de commentaires, qui contiennent une courte description de la fonctionnalite du programme. Prenez l'habitude de faire de meme dans vos propres scripts. Les lignes de code elle-memes sont documentees. Si vous procedez comme nous l'avons fait, e'est-a-dire en inserant des commentaires a la droite des instructions correspondantes, veillez a les ecarter suffisamment de celles-ci, afin de ne pas gener leur lisibilite. Lorsque vous aurez bien verifie votre texte, sauvegardez-le et executez-le. Notes : Bien que ce ne soit pas indispensable, nous vous recommandons une fois encore de choisir pour vos scripts des noms de fichiers se terminant par l'extension .py Cela aide beaucoup a les identifier comme tels dans un repertoire. Les gestionnaires graphiques de fichiers {explorateur Windows, Konqueror) se servent d'ailleurs de cette extension pour leur associer une icone specifique. Evitez cependant de choisir des noms qui risqueraient d'etre deja attribues a des modules python existants : des noms tels que math.py ou Tkinter.py, par exemple, sont a proscrire ! Si vous travaillez en mode texte sous Linux, ou dans une fenetre MSDOS, vous pouvez executer votre script a l'aide de la commande python suivie du nom du script. Si vous travaillez en mode graphique sous Linux, vous pouvez ouvrir une fenetre de terminal et faire la meme chose. Dans Vexplorateur Windows ou dans Konqueror, vous pouvez lancer l'execution de votre script en effectuant un simple clic de souris sur l'icone correspondante. Si vous travaillez avec IDLE, vous pouvez lancer l'execution du script en cours d'edition, directement a l'aide de la combinaison de touches . Consultez votre professeur concernant les autres possibilites de lancement eventuelles sur differents systemes d' exploitation. 4.6 Remarque concernant les caracteres accentues et speciaux : A partir de la version 2.3, il est vivement recommande aux francophones d'inclure l'un des pseudo-commentaires suivants au debut de tous leurs scripts Python (obligatoirement a la l e ou a la 2 e ligne) : # -*- coding :Latin-l -*- Ou bien : # _*_ coding :Utf-8 -*- Ces pseudo-commentaires indiquent a Python que vous utiliserez dans votre script : # soit le jeu de caracteres accentues correspondant aux principales langues de l'Europe occidentale (Francais, Italien, Portugais, etc.), code sur un seul octet suivant la norme ISO-8859 ; 40. Gerard Swinnen : Apprendre d programmer avec Python • soit le systeme de codage mondial sur deux octets appele Unicode (dont la variante Utf-8 ne code que les caracteres « speciaux » sur deux octets, les caracteres du jeu ASCII standard restant codes sur un seul octet). Ce dernier systeme commence a se repandre de plus en plus, car il presente l'avantage de permettre la coexistence de caracteres de toutes origines dans le meme document (caracteres grecs, arabes, cyrilliques, japonais, etc.). Python peut utiliser les deux systemes, mais vous devez lui signaler lequel vous utilisez. Si votre systeme d'exploitation est configure de telle maniere que les frappes clavier generent des codes Utf- 8, configurez votre editeur de textes pour qu'il utilise lui aussi ce codage, et placez le second des pseudo-commentaires indiques ci-dessus au debut de chacun de vos scripts. Si votre systeme d'exploitation fonctionne suivant la norme ancienne (ISO-8859), vous devrez utiliser plutot le premier pseudo-commentaire. Si vous n'en indiquez aucun, vous recevrez de temps a autre des messages d'avertissem*nt de la part de l'interpreteur, et vous eprouverez peut-etre meme quelques difficultes a editer correctement vos scripts dans l'environnement IDLE (en particulier sous Windows). Que vous utilisiez une norme ou l'autre, ou aucune, vos scripts s'executeront correctement. C'est seulement pour pouvoir les rediger sur votre propre systeme qu'il faut choisir l'option adequate. Exercices : 4.5. Ecrivez un programme qui calcule le volume d'un parallelepipede rectangle dont sont fournis au depart la largeur, la hauteur et la profondeur. 4.6. Ecrivez un programme qui convertisse un nombre entier de secondes fourni au depart, en un nombre d'annees, de mois, de jours, de minutes et de secondes. (Utilisez l'operateur modulo : % ). 4.7. Ecrivez un programme qui affiche les 20 premiers termes de la table de multiplication par 7, en signalant au passage (a l'aide d'une asterisque) ceux qui sont des multiples de 3. Exemple : 7 14 21 * 28 35 42 * 49 4.8. Ecrivez un programme qui calcule les 50 premiers termes de la table de multiplication par 13, mais n'affiche que ceux qui sont des multiples de 7. 4.9. Ecrivez un programme qui affiche la suite de symboles suivante : ** *** **** Gerard Swinnen : Apprendre a programmer avec Python 41. Chapitre 5 : Principaux types de donnees Dans le chapitre 2, nous avons deja manipule des donnees de differents types : des nombres entiers ou reels, et des chaines de caracteres. II est temps a present d'examiner d'un peu plus pres ces types de donnees, et egalement de vous en faire decouvrir d'autres. 5. 1 Les donnees numeriques Dans les exercices realises jusqu'a present, nous avons deja utilise des donnees de deux types : les nombres entiers ordinaires et les nombres reels (aussi appeles nombres a virgule flottante). Tactions de mettre en evidence les caracteristiques (et les limites) de ces concepts : 5.1.1 Les types « integer » et « long » Supposons que nous voulions modifier legerement notre precedent exercice sur la suite de Fibonacci, de maniere a obtenir l'affichage d'un plus grand nombre de termes. A priori, il suffit de modifier la condition de bouclage, dans la deuxieme ligne. Avec « while c<49 : » , nous devrions obtenir quarante-huit termes. Modifions done legerement l'exercice, de maniere a afficher aussi le type de la variable principale : >» a, b, c = 1, 1, 1 »> while c<49: print c, " : ", b, type (b) a, b, c = b, a+b, c+1 (affichage des 43 premiers termes) 44 1134903170 45 1836311903 46 2971215073 47 4807526976 48 7778742049 Que pouvons-nous constater ? Si nous n'avions pas utilise la fonction type(), qui nous permet de verifier a chaque iteration le type de la variable b, nous n'aurions rien remarque du tout : la suite des nombres de Fibonacci s'affiche sans probleme (et nous pourrions encore l'allonger de nombreux termes supplementaires). II semble done que Python soit capable de traiter des nombres entiers de taille illimitee. L'exercice que nous venons de realiser indique cependant qu'il se passe « quelque chose » lorsque ces nombres deviennent tres grands. Au debut du programme, les variables a, b et c sont definies implicitement comme etant du type integer. C'est ce qui se passe toujours avec Python lorsqu'on affecte une valeur entiere a une variable, a condition que cette valeur ne soit pas trop grande. Dans la memoire de l'ordinateur, ce type de donnee est en effet encode sous la forme d'un bloc de 4 octets (ou 32 bits). Or la gamme de valeurs decimales qu'il est possible d' encoder sur 4 octets seulement s'etend de -2147483648 a + 2147483647 (Voir cours d'informatique generale). Les calculs effectues avec ce type de variable sont toujours tres rapides, parce que le processeur de l'ordinateur est capable de traiter directement par lui-meme de tels nombres entiers a 32 bits. En revanche, lorsqu'il est question de traiter des nombres entiers plus grands, ou encore des nombres reels (nombres « a virgule flottante »), les logiciels que sont les interpreteurs et compilateurs doivent effectuer un gros travail de codage/decodage, afin de ne presenter en definitive au processeur que des operations binaires sur des nombres entiers de 32 bits au maximum. 42. Gerard Swinnen : Apprendre a programmer avec Python Vous savez deja que le type des variables Python est defini de maniere dynamique. Puisqu'il s'agit du type le plus performant (aussi bien en termes de vitesse de calcul qu'en termes d'occupation de place dans la memoire), Python utilise le type integer par defaut, chaque fois que cela est possible, c'est-a-dire tant que les valeurs traitees sont des entiers compris entre les limites deja mentionnees plus haut (environ 2 milliards, en positif ou en negatif). Lorsque les valeurs traitees sont des nombres entiers se situant au-dela de ces limites, leur encodage dans la memoire de l'ordinateur devient plus complexe. Les variables auxquelles on affecte de tels nombres sont alors automatiquement definies comme appartenant au type « entier long » (lequel est designe par long dans la terminologie Python). Ce type long permet l'encodage de valeurs entieres avec une precision quasi infinie : une valeur definie sous cette forme peut en effet posseder un nombre de chiffres significatifs quelconque, ce nombre n 'e'tant limite que par la taille de la memoire disponible sur l'ordinateur utilise ! Exemple : »> a, b, c = 3, 2, 1 »> while c < 15: print c, ": ", b a, b, c = b, a*b, c+1 1 : 2 2 : 6 3 : 12 4 : 72 5 : 864 6 : 62208 7 : 53747712 8 : 3343537668096 9 : 179707499645975396352 10 : 600858794305667322270155425185792 11 : 107978831564966913814384922944738457859243070439030784 12 : 64880030544660752790736837369104977695001034284228042891827649456186234 582611607420928 13 : 70056698901118320029237641399576216921624545057972697917383692313271754 88362123506443467340026896520469610300883250624900843742470237847552 14 : 45452807645626579985636294048249351205168239870722946151401655655658398 64222761633581512382578246019698020614153674711609417355051422794795300591700 96950422693079038247634055829175296831946224503933501754776033004012758368256 »> Dans l'exemple ci-dessus, la valeur des nombres affiches augmente tres rapidement, car chacun d'eux est egal au produit des deux termes precedents. Au depart, les variables a, b et c sont du type integer, puisqu'on leur affecte des petites valeurs numeriques entieres : 3, 2 et 1. A partir de la 8 e iteration, cependant, les variables b et a sont automatiquement converties l'une apres l'autre dans le type long : le resultat de la multiplication des termes 6 et 7 est en effet deja bien superieur a la limite des 2 milliards evoquee plus haut. La progression continue avec des nombres de plus en plus gigantesques, mais la vitesse de calcul diminue. Les nombres memorises sous le type long occupent une place variable dans la memoire de l'ordinateur, en fonction de leur taille. Gerard Swinnen : Apprendre a programmer avec Python 43. 5.1.2 Le type « float » Vous avez deja rencontre precedemment cet autre type de donnee numerique : le type « nombre reel », ou « nombre a virgule flottante », designe en anglais par l'expression « floating point number », et que pour cette raison on appellera type float sous Python. Ce type autorise les calculs sur de tres grands ou tres petit* nombres (donnees scientifiques, par exemple), avec un degre de precision constant. Pour qu'une donnee numerique soit consideree par Python comme etant du type float, il suffit qu'elle contienne dans sa formulation un element tel qu'un point decimal ou un exposant de 10. Par exemple, les donnees : 3.14 10. .001 lelOO 3.14e-10 sont automatiquement interpretees par Python comme etant du type float. Essayons done ce type de donnees dans un nouveau petit programme (inspire du precedent) : >» a, b, c = 1 . , 2 . , 1 # => a et b seront du type 'float' »> while c <18: ... a, b, c = b, b*a, c+1 print b 2.0 4.0 8.0 32.0 256.0 8192.0 2097152.0 17179869184.0 3.6028797019e+16 6.18970019643e+26 2.23007451985e+43 1.38034926936e+70 3.07828173409e+113 4.24910394253e+183 1.30799390526e+297 Inf Inf Comme vous l'aurez certainement bien compris, nous affichons cette fois encore une serie dont les termes augmentent extremement vite, chacun d'eux etant egal au produit des deux precedents. Au huitieme terme, nous depassons deja largement la capacite d'un integer. Au neuvieme terme, Python passe automatiquement a la notation scientifique (« e+n » signifie en fait : « fois dix a l'exposant n »). Apres le quinzieme terme, nous assistons a nouveau a un depassem*nt de capacite (sans message d'erreur) : les nombres vraiment trop grands sont tout simplement notes « inf » (pour « infini »). Le type float utilise dans notre exemple permet de manipuler des nombres (positifs ou negatifs) compris entre 10" 308 et 10 308 avec une precision de 12 chiffres significatifs. Ces nombres sont encodes d'une maniere particuliere sur 8 octets (64 bits) dans la memoire de la machine : une partie du code correspond aux 12 chiffres significatifs, et une autre a l'ordre de grandeur (exposant de 10). 44. Gerard Swinnen : Apprendre a programmer avec Python (5) Exercices : 5.1. Ecrivez un programme qui convertisse en radians un angle fourni au depart en degres, minutes, secondes. 5.2. Ecrivez un programme qui convertisse en degres, minutes, secondes un angle fourni au depart en radians. 5.3. Ecrivez un programme qui convertisse en degres Celsius une temperature exprimee au depart en degres Fahrenheit, ou l'inverse. La formule de conversion est : T F — T c X 1,8 + 32 . 5.4. Ecrivez un programme qui calcule les interets accumules chaque annee pendant 20 ans, par capitalisation d'une somme de 100 euros placee en banque au taux fixe de 4,3 % 5.5. Une legende de l'lnde ancienne raconte que le jeu d'echecs a ete invente par un vieux sage, que son roi voulut remercier en lui affirmant qu'il lui accorderait n'importe quel cadeau en recompense. Le vieux sage demanda qu'on lui fournisse simplement un peu de riz pour ses vieux jours, et plus precisem*nt un nombre de grains de riz suffisant pour que Ton puisse en deposer 1 seul sur la premiere case du jeu qu'il venait d'inventer, deux sur la suivante, quatre sur la troisieme, et ainsi de suite jusqu'a la 64 e case. Ecrivez un programme Python qui affiche le nombre de grains a deposer sur chacune des 64 cases du jeu. Calculez ce nombre de deux manieres : - le nombre exact de grains (nombre entier) - le nombre de grains en notation scientifique (nombre reel) Gerard Swinnen : Apprendre a programmer avec Python 45. 5.2 Les donnees alphanumeriques Jusqu'a present nous n'avons manipule que des nombres. Mais un programme d'ordinateur peut egalement traiter des caracteres alphabetiques, des mots, des phrases, ou des suites de symboles quelconques. Dans la plupart des langages de programmation, il existe pour cet usage une structure de donnees que Ton appelle chaine de caracteres (ou string en anglais). 5.2.1 Le type « string » (chaine de caracteres) Sous Python, une donnee de type string est une suite quelconque de caracteres delimitee soit par des apostrophes (simple quotes), soit par des guillemets (double quotes). Exemples : >>> phrasel = ' les oeuf s durs . ' »> phrase2 = '"Oui", repondit-il, ' >>> phrase3 = "j'aime bien" >>> print phrase2, phrase3, phrasel "Oui", repondit-il, j'aime bien les oeufs durs. Les 3 variables phrasel, phrase2, phrase3 sont done des variables de type string. Remarquez l'utilisation des guillemets pour delimiter une chaine dans laquelle il y a des apostrophes, ou l'utilisation d'apostrophes pour delimiter une chaine qui contient des guillemets. Remarquez aussi encore une fois que l'instruction print insere un espace entre les elements affiches. Le caractere special « \ » (antislash) permet quelques subtilites complementaires : • En premier lieu, il permet d'ecrire sur plusieurs lignes une commande qui serait trop longue pour tenir sur une seule (cela vaut pour n'importe quel type de commande). • A l'interieur d'une chaine de caracteres, Yantislash permet d'inserer un certain nombre de codes speciaux (sauts a la ligne, apostrophes, guillemets, etc.). Exemples : »> txt3 = "'N\'est-ce pas ?" repondit-elle. ' »> print txt3 "N'est-ce pas ?" repondit-elle. »> Salut = "Ceci est une chaine plutot longue\n contenant plusieurs lignes \ ... de texte (Ceci fonctionne\n de la meme facon en C/C++. \n\ ... Notez que les blancs en debut\n de ligne sont signif icatif s . \n" »> print Salut Ceci est une chaine plutot longue contenant plusieurs lignes de texte (Ceci fonctionne de la meme f aeon en C/C++ . Notez que les blancs en debut de ligne sont signif icatif s . Remarques : • La sequence \n dans une chaine provoque un saut a la ligne. • La sequence V permet d'inserer une apostrophe dans une chaine delimitee par des apostrophes • Rappelons encore ici que la casse est significative dans les noms de variables (II faut respecter scrupuleusem*nt le choix initial de majuscules ou minuscules). 46. Gerard Swinnen : Apprendre a programmer avec Python « Triple quotes » : Pour inserer plus aisem*nt des caracteres speciaux ou « exotiques » dans une chaine, sans faire usage de Vantislash, ou pour faire accepter Yantislash lui-meme dans la chaine, on peut encore delimiter la chaine a l'aide de triples guillemets ou de triples apostrophes : »> al = """ ... Usage: trucmuche [OPTIONS] ... { -h -H hote J I! II II »> print al Usage: trucmuche [OPTIONS] { -h -H hote } 5.2.2 Acces aux caracteres individuels d'une chaine Les chaines de caracteres constituent un cas particulier d'un type de donnees plus general que Ton appelle des donnees composites. Une donnee composite est une entite qui rassemble dans une seule structure un ensemble d'entites plus simples : dans le cas d'une chaine de caracteres, par exemple, ces entries plus simples sont evidemment les caracteres eux-memes. En fonction des circonstances, nous souhaiterons traiter la chaine de caracteres, tantot comme un seul objet, tantot comme une collection de caracteres distincts. Un langage de programmation tel que Python doit done etre pourvu de mecanismes qui permettent d'acceder separement a chacun des caracteres d'une chaine. Comme vous allez le voir, cela n'est pas bien complique : Python considere qu'une chaine de caracteres est un objet de la categorie des sequences, lesquelles sont des collections ordonnees d'elements. Cela signifie simplement que les caracteres d'une chaine sont toujours disposes dans un certain ordre. Par consequent, chaque caractere de la chaine peut etre designe par sa place dans la sequence, a l'aide d'un index. Pour acceder a un caractere bien determine, on utilise le nom de la variable qui contient la chaine, et on lui accole entre deux crochets l'index numerique qui correspond a la position du caractere dans la chaine. Attention, cependant : comme vous aurez l'occasion de le verifier par ailleurs, les donnees informatiques sont presque toujours numerotees d partir de zero (et non a partir de un). C'est le cas pour les caracteres d'une chaine. Exemple : »> ch = "Stephanie" »> print ch[0], ch[3] S p Gerard Swinnen : Apprendre a programmer avec Python 47. 5.2.3 Operations elementaires sur les chatnes Python integre de nombreuses fonctions qui permettent d'effectuer divers traitements sur les chaines de caracteres (conversions majuscules/minuscules, decoupage en chaines plus petites, recherche de mots, etc.). Nous approfondirons ce sujet un peu plus loin (voir page 121). Pour l'instant, nous pouvons nous contenter de savoir qu'il est possible d'acceder individuellement a chacun des caracteres d'une chaine, comme cela a ete explique ci-dessus. Sachons en outre que Ton peut aussi : • assembler plusieurs petites chaines pour en construire de plus grandes. Cette operation s'appelle concatenation et on la realise sous Python a l'aide de l'operateur + (Cet operateur realise done l'operation d'addition lorsqu'on l'applique a des nombres, et l'operation de concatenation lorsqu'on l'applique a des chaines de caracteres. Exemple : a = 'Petit poisson' b = ' deviendra grand' c = a + b print c petit poisson deviendra grand • determiner la longueur (e'est-a-dire le nombre de caracteres) d'une chaine, en faisant appel a la fonction integree len() : »> print len(c) 29 • Convertir en nombre veritable une chaine de caracteres qui represente un nombre. Exemple : »> ch = '8647' »> print ch + 45 ==> *** erreur *** on ne peut pas additionner une chaine et un nombre »> n = int(ch) »> print n + 65 8712 # OK : on peut additionner 2 nombres Dans cet exemple, la fonction integree int() convertit la chaine en nombre entier. II serait egalement possible de convertir une chaine en nombre reel a l'aide de la fonction float(). 48. Gerard Swinnen : Apprendre a programmer avec Python Exercices : 5.6. Ecrivez un script qui determine si une chaine contient ou non le caractere « e ». 5.7. Ecrivez un script qui compte le nombre d'occurrences du caractere « e » dans une chaine. 5.8. Ecrivez un script qui recopie une chaine (dans une nouvelle variable), en inserant des asterisques entre les caracteres. Ainsi par exemple, « gaston » devra devenir « g*a*s*t*o*n » 5.9. Ecrivez un script qui recopie une chaine (dans une nouvelle variable) en l'inversant. Ainsi par exemple, « zorglub » deviendra « bulgroz ». 5.10. En partant de l'exercice precedent, ecrivez un script qui determine si une chaine de caracteres donnee est un palindrome (c'est-a-dire une chaine qui peut se lire indifferemment dans les deux sens), comme par exemple « radar » ou « s.o.s ». Gerard Swinnen : Apprendre a programmer avec Python 49. 5.3 Les listes (premiere approche) Les chaines que nous avons abordees a la rubrique precedente constituaient un premier exemple de donnees composites, lesquelles sont utilisees pour regrouper de maniere structuree des ensembles de valeurs. Vous apprendrez progressivement a utiliser plusieurs autres types de donnees composites, parmi lesquelles les listes, les tuples et les dictionnaires. 17 Nous n'allons cependant aborder ici que le premier de ces trois types, et ce de facon assez sommaire. II s'agit la en effet d'un sujet fort vaste, sur lequel nous devrons revenir a plusieurs reprises. Sous Python, on peut definir une liste comme une collection d'elements separes par des virgules, V ensemble etant enferme dans des crochets. Exemple : »> jour = ['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi'] >>> print jour ['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi'] Dans cet exemple, la valeur de la variable jour est une liste. Comme on peut le constater dans l'exemple choisi, les elements qui constituent une liste peuvent etre de types varies. Dans cet exemple, en effet, les trois premiers elements sont des chaines de caracteres, le quatrieme element est un entier, le cinquieme un reel, etc. (Nous verrons plus loin qu'un element d'une liste peut lui-meme etre une liste !). A cet egard, le concept de liste est done assez different du concept de « tableau » {array) ou de « variable indicee » que Ton rencontre dans d'autres langages de programmation. Remarquons aussi que comme les chaines de caracteres, les listes sont des sequences, e'est-a-dire des collections ordonnees d'objets. Les divers elements qui constituent une liste sont en effet toujours disposes dans le meme ordre, et Ton peut done acceder a chacun d'entre eux individuellement si Ton connait son index dans la liste. Comme e'etait deja le cas pour les caracteres dans une chaine, il faut cependant retenir que la numerotation de ces index commence a partir de zero, et non a partir de un. Exemples : »> jour = ['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi'] >>> print jour [2] mercredi >>> print jour [4] 20.357 A la difference de ce qui se passe pour les chaines, qui constituent un type de donnees non- modifiables (nous aurons plus loin diverses occasions de revenir la-dessus), il est possible de changer les elements individuels d'une liste : >>> print jour ['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi'] »> jour [3] = jour [3] +47 >>> print jour ['lundi', 'mardi', 'mercredi', 1847, 20.357, 'jeudi', 'vendredi'] 17 Vous pourrez meme creer vos propres types de donnees composites, lorsque vous aurez assimile le concept de classe (voir page 152). 50. Gerard Swinnen : Apprendre a programmer avec Python On peut done remplacer certains elements d'une liste par d'autres, comme ci-dessous : »> jour [3] = 'Juillet' >» print jour ['lundi', 'mardi', 'mercredi', 'Juillet', 20.357, 'jeudi', 'vendredi'] La fonction integree len() , que nous avons deja rencontree a propos des chaines, s'applique aussi aux listes. Elle renvoie le nombre d'elements presents dans la liste : »> len(jour) 7 Une autre fonction integree permet de supprimer d'une liste un element quelconque (a partir de son index). II s'agit de la fonction del() 18 : »> del (jour [4] ) >» print jour [ ' lundi ' , ' mardi ' , ' mercredi ' , ' juillet ' , ' jeudi ' , ' vendredi ' ] II est egalement tout a fait possible d'ajouter un element a une liste, mais pour ce faire, il faut considerer que la liste est un objet, dont on va utiliser l'une des methodes. Les concepts informatiques d'objet et de methode ne seront expliques qu'un peu plus loin dans ces notes, mais nous pouvons des a present montrer « comment 9a marche » dans le cas particulier d'une liste : »> jour . append (' samedi ' ) »> print jour [ ' lundi ' , ' mardi ' , ' mercredi ' , ' juillet ' , ' jeudi ' , ' vendredi ' , ' samedi ' ] »> Dans la premiere ligne de l'exemple ci-dessus, nous avons applique la methode append() a I'objet jour , avec I'argument 'samedi'. Si Ton se rappelle que le mot append signifie « ajouter » en anglais, on peut comprendre que la methode append() est une sorte de fonction qui est en quelque maniere attachee ou integree aux objets du type « liste ». L'argument que Ton utilise avec cette fonction est bien entendu l'element que Ton veut ajouter a la fin de la liste. Nous verrons plus loin qu'il existe ainsi toute une serie de ces methodes (e'est-a-dire des fonctions integrees, ou plutot « encapsulees » dans les objets de type « liste »). Notons simplement au passage que Yon applique une methode a un objet en reliant les deux a Vaide d'un point. (D'abord le nom de la variable qui reference I'objet, puis le point, puis le nom de la methode, cette derniere toujours accompagnee d'une paire de parentheses). 18 II existe en fait tout un ensemble de techniques qui permettent de decouper une liste en tranches, d'y inserer des groupes d'elements, d'en enlever d'autres, etc., en utilisant une syntaxe particuliere ou n'interviennent que les index. Cet ensemble de techniques (qui peuvent aussi s'appliquer aux chaines de caracteres) porte le nom generique de slicing (tranchage). On le met en oeuvre en placant plusieurs indices au lieu d'un seul entre les crochets que Ton accole au nom de la variable. Ainsi jour[l:3] designe le sous-ensemble ['mardi', 'mercredi']. Ces techniques un peu particulieres sont decrites plus loin (voir pages 121 et suivantes). Gerard Swinnen : Apprendre a programmer avec Python 51. Comme les chaines de caracteres, les listes seront approfondies plus loin dans ces notes (voir page 132). Nous en savons cependant assez pour commencer a les utiliser dans nos programmes. Veuillez par exemple analyser le petit script ci-dessous et commenter son fonctionnement : jour = [ ' dimanche ' , ' lundi ' , 'mardi ' , 'mercredi ' , ' jeudi ' , ' vendredi ' , ' samedi ' ] a, b = 0, 0 while a<25: a = a + 1 b = a % 7 print a, jourfb] La 5 e ligne de cet exemple fait usage de l'operateur « modulo » deja rencontre precedemment et qui peut rendre de grands services en programmation. On le represente par % dans de nombreux langages (dont Python). Quelle est l'operation effectuee par cet operateur ? Exercices : 5.1 1. Soient les listes suivantes : tl = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] t2 = ['Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre' , 'Decembre'] Ecrivez un petit programme qui cree une nouvelle liste t3. Celle-ci devra contenir tous les elements des deux listes en les alternant, de telle maniere que chaque nom de mois soit suivi du nombre de jours COrrespondant : [ 'Janvier' ,31, 'Fevrier' ,28, 'Mars' ,31, etc. . . ] . 5.12. Ecrivez un programme qui affiche « proprement » tous les elements d'une liste. Si on l'appliquait par exemple a la liste t2 de l'exercice ci-dessus, on devrait obtenir : Janvier Fevrier Mars Avril Mai Juin Juillet Aout Septembre Octobre Novembre Decembre 5.13. Ecrivez un programme qui recherche le plus grand element present dans une liste donnee. Par exemple, si on l'appliquait a la liste [32, 5, 12, 8, 3, 75, 2, 15] , ce programme devrait afficher : le plus grand element de cette liste a la valeur 75. 5.14. Ecrivez un programme qui analyse un par un tous les elements d'une liste de nombres (par exemple celle de l'exercice precedent) pour generer deux nouvelles listes. L'une contiendra seulement les nombres pairs de la liste initiale, et l'autre les nombres impairs. Par exemple, si la liste initiale est celle de l'exercice precedent, le programme devra construire une liste pairs qui contiendra [32, 12, 8, 2], et une liste impairs qui contiendra [5, 3, 75, 15] . Astuce : pensez a utiliser l'operateur modulo (%) deja cite precedemment. 5.15. Ecrivez un programme qui analyse un par un tous les elements d'une liste de mots (par exemple : ['Jean', 'Maximilien', 'Brigitte', 'Sonia', 'Jean-Pierre', 'Sandra'] pour generer deux nouvelles listes. L'une contiendra les mots comportant moins de 6 caracteres, l'autre les mots comportant 6 caracteres ou davantage. 52. Gerard Swinnen : Apprendre a programmer avec Python Chapitre 6 : Fonctions predefinies L'un des concepts les plus importants en programmation est celui de fonction 19 . Les fonctions permettent en effet de decomposer un programme complexe en une serie de sous-programmes plus simples, lesquels peuvent a leur tour etre decomposes eux-memes en fragments plus petit*, et ainsi de suite. D'autre part, les fonctions sont reutilisables : si nous disposons d'une fonction capable de calculer une racine carree, par exemple, nous pouvons l'utiliser un peu partout dans nos programmes sans avoir a la re-ecrire a chaque fois. 6. 1 Interaction avec I'utilisateur : la fonction inputQ La plupart des scripts elabores necessitent a un moment ou l'autre une intervention de I'utilisateur (entree d'un parametre, clic de souris sur un bouton, etc.). Dans un script simple en mode texte (comme ceux que nous avons crees jusqu'a present), la methode la plus simple consiste a employer la fonction integree input(). Cette fonction provoque une interruption dans le programme courant. L'utilisateur est invite a entrer des caracteres au clavier et a terminer avec . Lorsque cette touche est enfoncee, l'execution du programme se poursuit, et la fonction fournit en retour une valeur correspondant a ce que I'utilisateur a entre. Cette valeur peut alors etre assignee a une variable quelconque. On peut invoquer la fonction input() en laissant les parentheses vides. On peut aussi y placer en argument un message explicatif destine a I'utilisateur. Exemple : print 'Veuillez entrer un nombre posit if quelconque : ' , nn = input ( ) print 'Le carre de ' , nn, 'vaut', nn**2 ou encore : prenom = input (' Entrez votre prenom (entre guillemets) : ') print 'Bon jour, ', prenom Remarques importantes : • La fonction input() renvoie une valeur dont le type correspond a ce que I'utilisateur a entre. Dans notre exemple, la variable nn contiendra done un entier, une chaine de caracteres, un reel, etc. suivant ce que I'utilisateur aura decide. Si I'utilisateur souhaite entrer une chaine de caracteres, il doit l'entrer comme telle, e'est-a-dire incluse entre des apostrophes ou des guillemets. Nous verrons plus loin qu'un bon script doit toujours verifier si le type ainsi entre correspond bien a ce que Ton attend pour la suite du programme. • Pour cette raison, il sera souvent preferable d'utiliser dans vos scripts la fonction similaire raw_input(), laquelle renvoie toujours une chaine de caracteres. Vous pouvez ensuite convertir cette chaine en nombre a l'aide de int() ou de float(). Exemple : »> a = raw_input ( ' Entrez une donnee : ' ) Entrez une donnee : 52 . 37 >» type (a) »> b = float (a) # conversion en valeur numerique »> type (b) 19 Sous Python, le terme de "fonction" est utilise indifferemment pour designer a la fois de veritables fonctions mais egalement des procedures. Nous indiquerons plus loin la distinction entre ces deux concepts proches. Gerard Swinnen : Apprendre a programmer avec Python 53. 6.2 Importer un module de fonctions Vous avez deja rencontre des fonctions integrees au langage lui-meme, comme la fonction len(), par exemple, qui permet de connaitre la longueur d'une chaine de caracteres. II va de soi cependant qu'il n'est pas possible d'integrer toutes les fonctions imaginables dans le corps standard de Python, car il en existe virtuellement une infinite : vous apprendrez d'ailleurs tres bientot comment en creer vous-meme de nouvelles. Les fonctions integrees au langage sont relativement peu nombreuses : ce sont seulement celles qui sont susceptibles d'etre utilisees tres frequemment. Les autres sont regroupees dans des fichiers separes que Ton appelle des modules. Les modules sont done des fichiers qui regroupent des ensembles de fonctions. Vous verrez plus loin comme il est commode de decouper un programme important en plusieurs fichiers de taille modeste pour en faciliter la maintenance. Une application Python typique sera alors constitute d'un programme principal accompagne de un ou plusieurs modules contenant chacun les definitions d'un certain nombre de fonctions accessoires. II existe un grand nombre de modules pre -programmes qui sont fournis d'office avec Python. Vous pouvez en trouver d' autres chez divers fournisseurs. Souvent on essaie de regrouper dans un meme module des ensembles de fonctions apparentees que Ton appelle des bibliotheques. Le module math, par exemple, contient les definitions de nombreuses fonctions mathematiques telles que sinus, cosinus, tangente, racine carree, etc. Pour pouvoir utiliser ces fonctions, il vous suffit d'incorporer la ligne suivante au debut de votre script : from math import * Cette ligne indique a Python qu'il lui faut inclure dans le programme courant toutes les fonctions (e'est la la signification du symbole *) du module math, lequel contient une bibliotheque de fonctions mathematiques pre-programmees. Dans le corps du script lui-meme, vous ecrirez par exemple : racine = sqrt (nombre) pour assigner a la variable racine la racine carree de nombre, sinusx = sin (angle) pour assigner a la variable sinusx le sinus de angle (en radians !), etc. Exemple : # Demo : utilisation des fonctions du module