Tut Oriel Python

download Tut Oriel Python

of 114

Transcript of Tut Oriel Python

Tutoriel PythonRelease 2.4.3

Guido van Rossum Fred L. Drake, Jr., editor

19 juillet 2006Traduction franaise dirige par Olivier Berger Mise jour par Henri Garreta

Python Software Foundation E-mail: [email protected]

Copyright c 2001-2005 Python Software Foundation. All Rights Reserved. Copyright c 2000 BeOpen.com. All Rights Reserved. Copyright c 1995-2000 Corporation for National Research Initiatives. All Rights Reserved. Copyright c 1991-1995 Stichting Mathematisch Centrum. All Rights Reserved. See the end of this document for complete license and permissions information.

Rsum Python est un langage de programmation facile utiliser et puissant. Il offre des structures de donnes puissantes de haut niveau et une approche simple mais relle de la programmation oriente-objet. La syntaxe lgante de python et le typage dynamique, ajouts sa nature interprte, en font un langage idal pour crire des scripts et pour le dveloppement rapide dapplications dans de nombreux domaines et sur la plupart des plates-formes. Linterprteur python et la vaste librairie standard sont librement disponible pour toutes les plates-formes principales sous forme de sources ou de binaires partir du site Web de Python, http ://www.python.org/, et peuvent tre distribus librement. Le mme site contient aussi des distributions et des pointeurs vers de nombreux modules Python provenant dautres fournisseurs, des programmes et des outils, et de la documentation supplmentaire. Linterprteur Python est facilement extensible par de nouvelles fonctions et de nouveaux types de donnes implments en C ou en C++ (ou dautres langages appelables depuis le C). Python convient galement comme langage dextension pour des logiciels congurables. Ce tutoriel introduit le lecteur de faon informelle aux concepts et caractristiques de base du langage et du systme Python. Il est utile davoir un interprteur Python disponible pour exprimenter directement, mais tous les exemples sont auto-porteurs, donc le tutoriel peut galement tre lu sans interprteur sous la main. Pour une description des objets et modules standards, voir le document Python Library Reference. Le Python Reference Manual donne une dnition plus formelle du langage. Pour crire des extensions en C ou C++, lire les manuels Extending and Embedding et Python/C API Reference. Il existe aussi plusieurs livres dcrivant Python en profondeur. Ce tutoriel nessaye pas dtre complet et de traiter chaque possibilit, ou mme toutes les caractristiques utilises couramment. A la place, il prsente bon nombre des caractristiques les plus remarquables de Python, et vous donnera une bonne ide de la couleur et du style du langage. Aprs lavoir lu, vous serez capable de lire et dcrire des programmes ou des modules en Python, et vous serez prts en apprendre plus sur les diffrents modules de bibliothques Python dcrits dans le Python Library Reference.

TABLE DES MATIRES

1 2

Pour vous mettre en apptit Utilisation de linterprteur Python 2.1 Lancement de linterprteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Linterprteur et son environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Une introduction informelle Python 3.1 Utiliser Python comme calculatrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Premiers pas vers la programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dautres outils de contrle dexcution 4.1 Instructions if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Instructions for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 La fonction range() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 Les instructions break et continue, et les clauses else dans les boucles 4.5 LInstruction pass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6 Dnition de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7 Encore plus sur la dnition de fonctions . . . . . . . . . . . . . . . . . . . Structures de donnes 5.1 Plus de dtails sur les listes . . . . . . . 5.2 Linstruction del . . . . . . . . . . . . 5.3 N-uplets (tuples) et squences . . . . . . 5.4 Ensembles . . . . . . . . . . . . . . . . 5.5 Dictionnaires . . . . . . . . . . . . . . . 5.6 Techniques de boucles . . . . . . . . . . 5.7 Plus de dtails sur les conditions . . . . 5.8 Comparer les squences et dautres types Modules 6.1 Encore plus sur les modules 6.2 Modules standard . . . . . 6.3 La fonction dir() . . . . 6.4 Paquetages . . . . . . . . .

7 9 9 10 13 13 22 25 25 25 26 26 27 27 29 35 35 39 39 40 41 42 43 43 45 46 47 48 49 53 53 56 59 59 59 60 62

3

4

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

5

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

6

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

7

Entres et sorties 7.1 Un formatage de sortie plus fantaisiste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Lire et crire des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erreurs et exceptions 8.1 Erreurs de syntaxe . . . . 8.2 Exceptions . . . . . . . . 8.3 Gestion des exceptions . 8.4 Dclencher des exceptions

8

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

i

8.5 8.6 9

Exceptions dnies par lutilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dnir les actions de nettoyage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62 64 65 65 65 67 69 71 72 72 73 74 75 76 77 77 77 78 78 78 78 79 79 80 80 81 81 83 83 84 85 85 86 87 87 88 91 93 93 93 93 95 97 99

Classes 9.1 Un mot sur la terminologie . . . . . . . . . 9.2 Les portes et les espaces de noms en Python 9.3 Une premire approche des classes . . . . . 9.4 Quelques remarques . . . . . . . . . . . . . 9.5 Hritage . . . . . . . . . . . . . . . . . . . 9.6 Variables prives . . . . . . . . . . . . . . . 9.7 En vrac . . . . . . . . . . . . . . . . . . . . 9.8 Les exceptions sont des classes aussi . . . . 9.9 Itrateurs . . . . . . . . . . . . . . . . . . . 9.10 Gnrateurs . . . . . . . . . . . . . . . . . . 9.11 Expressions gnrateurs . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

10 Petit tour dans la bibliothque standard 10.1 Interface avec le systme dexploitation . . . . . . . . 10.2 Fichiers et jokers . . . . . . . . . . . . . . . . . . . . 10.3 Arguments de la ligne de commande . . . . . . . . . 10.4 Redirection de la sortie et terminaison du programme . 10.5 Appariement de chanes . . . . . . . . . . . . . . . . 10.6 Mathmatiques . . . . . . . . . . . . . . . . . . . . . 10.7 Accs Internet . . . . . . . . . . . . . . . . . . . . 10.8 Dates et heures . . . . . . . . . . . . . . . . . . . . . 10.9 Compression de donnes . . . . . . . . . . . . . . . . 10.10 Mesure des performances . . . . . . . . . . . . . . . 10.11 Contrle de qualit . . . . . . . . . . . . . . . . . . . 10.12 Les piles sont fournies avec lappareil . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

11 Petit tour dans la bibliothque standard - Deuxime partie 11.1 Mise en forme des sorties . . . . . . . . . . . . . . . . 11.2 Modles . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Travail avec des enregistrements binaires . . . . . . . . 11.4 Multi-threading . . . . . . . . . . . . . . . . . . . . . . 11.5 Journalisation . . . . . . . . . . . . . . . . . . . . . . . 11.6 Rfrences faibles . . . . . . . . . . . . . . . . . . . . 11.7 Outils pour travailler avec des listes . . . . . . . . . . . 11.8 Arithmtique dcimale virgule ottante . . . . . . . . 12 Et maintenant ? A Edition dentre interactive et substitution historique A.1 Edition de ligne . . . . . . . . . . . . . . . . . . A.2 Substitution historique . . . . . . . . . . . . . . . A.3 Dnition des touches . . . . . . . . . . . . . . . A.4 Commentaire . . . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

B Arithmtique virgule ottante : problmes et limites B.1 Erreur de reprsentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

C Historique et licence 101 C.1 Histoire de Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 C.2 Terms and conditions for accessing or otherwise using Python . . . . . . . . . . . . . . . . . . . 102 C.3 Licenses and Acknowledgements for Incorporated Software . . . . . . . . . . . . . . . . . . . . 104 D Glossaire 111

ii

CHAPITRE

UN

Pour vous mettre en apptitSi vous avez jamais crit un long script shell, vous connaissez probablement ce sentiment : vous aimeriez ajouter encore une autre fonctionnalit, mais il est dj tellement lent, et tellement gros, et si compliqu ; ou bien la fonctionnalit requiert un appel systme ou une autre fonction qui est accessible seulement en C. . . Habituellement, le problme rsoudre nest pas sufsamment grave pour justier une rcriture du script en C ; peut-tre que le problme requiert des chanes de caractres de longueur variable ou dautres types de donnes (comme des listes tries de noms de chiers) qui sont faciles faire en shell mais ncessitent beaucoup deffort dimplmentation en C, ou peut-tre ntes-vous pas sufsamment familier avec le C. Une autre situation : peut-tre devez-vous travailler avec plusieurs bibliothques C, et le cycle habituel en C crire, compiler, tester, re-compiler est trop lent. Vous avez besoin de dvelopper du logiciel plus rapidement. Ou alors, peut-tre avez-vous crit un programme qui pourrait utiliser un langage dextension, et vous ne voulez pas dnir un langage, crire et mettre au point un interprteur pour lui, puis le lier votre application. Dans toutes ces situations, Python pourrait tre le langage quil vous faut. Python est simple demploi, mais cest un vrai langage de programmation, qui offre bien plus de structure et de de possibilits que le shell pour des programmes volumineux. Dautre part, il offre galement beaucoup plus de vrication derreurs que le C, et, tant un langage de trs haut niveau, il contient des types de donnes de haut niveau intgrs, comme des tableaux redimensionnables et des dictionnaires, qui vous demanderaient des jours implmenter efcacement en C. Grce ses types de donnes plus gnraux, Python est applicable un domaine de problmes beaucoup plus large que Awk ou mme Perl, et de nombreuses choses sont au moins aussi faciles en Python que dans ces langages. Python vous permet de sparer vos programmes en modules qui peuvent tre rutiliss dans dautres programmes en Python. Il est fourni avec une vaste collection de modules standard que vous pouvez utiliser comme base pour vos programmes ou comme exemples pour sinitier la programmation en Python. Il y a aussi des modules intgrs qui fournissent des fonctionnalits comme les entres/sorties vers les chiers, les appels systmes, les sockets, et mme des interfaces avec les toolkits dInterface Homme Machine comme Tk. Python est un langage interprt, ce qui peut vous faire gagner un temps considrable pendant la ralisation de programmes car aucune compilation ou dition de liens nest ncessaire. Linterprteur peut tre utilis de faon interactive, ce qui facilite lexprimentation avec les possibilits du langage, lcriture de programmes jetables, ou le test de fonctions pendant le dveloppement ascendant de vos logiciels. Cest aussi une calculatrice de bureau assez pratique. Python permet dcrire des programmes trs compacts et lisibles. Les programmes crits en Python sont typiquement beaucoup plus courts que leurs quivalents en C, pour plusieurs raisons : les types de donnes de haut niveau vous permettent de raliser des oprations complexes en une seule instruction ; le regroupement des instructions se fait par indentation, sans accolades de dbut/n ; il nest pas ncessaire de dclarer les variables ou les arguments. Python est extensible : si vous savez programmer en C, il est facile dajouter une nouvelle fonction intgre ou un module dans linterprteur, soit pour raliser les oprations critiques vitesse maximum, soit pour linker les programmes en Python des bibliothques qui ne sont disponibles que sous forme binaire (comme une bibliothque graphique propritaire). Une fois que vous serez accro, vous pourrez linker linterprteur Python dans votre application crite en C et lutiliser comme langage dextension ou de commande pour cette application.

7

Au passage, le langage est nomm daprs lmission de la BBC Monty Pythons Flying Circus et na rien voir avec de vilains reptiles. Faire rfrence des dialogues des Monty Python dans la documentation nest pas seulement autoris, cest encourag ! Maintenant que vous tes tout excit par Python, vous voudrez lexaminer plus en dtail. Puisque la meilleure faon dapprendre un langage est de lutiliser, vous tes invit le faire ds maintenant. Dans le chapitre suivant, les lments ncessaires lutilisation de linterprteur sont expliqus. Ce sont des informations plutt rbarbatives, mais essentielles pour pouvoir tester les exemples donns plus loin. Le reste de ce tutoriel introduit les diffrentes caractristiques du langage et du systme Python travers des exemples, en commenant par les expressions, instructions et types de donnes simples, puis les fonctions et modules, et enn en survolant des concepts avancs comme les exceptions et les classes dnies par lutilisateur.

8

Chapitre 1. Pour vous mettre en apptit

CHAPITRE

DEUX

Utilisation de linterprteur Python2.1 Lancement de linterprteur

Linterprteur Python est habituellement install lemplacement /usr/local/bin/python sur les machines Unix sur lesquelles il est disponible ; placer /usr/local/bin dans le path de votre shell U NIX permet de le lancer en tapant la commandepython

sous le shell. Puisque le choix du rpertoire dans lequel est install linterprteur est une option dinstallation, dautres endroits sont possibles ; vriez avec votre gourou Python local ou votre administrateur systme. (Par exemple, /usr/local/python est un autre emplacement populaire.) Tapez le caractre de n-de-chier (Control-D sur U NIX, Control-Z sur DOS ou Windows) linvite (prompt) principale pour quitter linterprteur avec un code de retour de zro. Si a ne marche pas, vous pouvez quitter linterprteur en tapant les commandes suivantes : import sys ; sys.exit(). Les fonctions ddition de ligne de linterprteur ne sont habituellement pas trs sophistiques. Sur U NIX, celui qui a install linterprteur peut avoir activ le support de la bibliothque GNU Readline, qui ajoute une dition interactive plus labore et des fonctions dhistorique. Peut-tre la vrication la plus rapide pour savoir si ldition de ligne de commande est supporte consiste taper Control-P au premier prompt afch par Python. Si a fait un bip, vous disposez de ldition de ligne de commande ; voir lAnnexe A pour une introduction aux touches. Si rien ne semble se passer, ou si ^P est afch, ldition de ligne de commande nest pas disponible ; vous pourrez seulement utiliser backspace pour enlever des caractres de la ligne courante. Linterprteur fonctionne en quelque sorte comme le shell U NIX : lorsquil est lanc avec lentre standard connecte un priphrique tty, il lit et excute les commandes interactivement ; lorsquil est lanc avec un nom de chier en argument ou avec un chier comme entre standard, il lit et excute un script depuis ce chier. Une deuxime faon de lancer linterprteur est python -c commande [arg] ..., ce qui excute les instructions dans commande, de faon analogue loption -c du shell. Puisque les instructions en Python contiennent souvent des espaces ou dautres caractres qui sont spciaux pour le shell, il est conseill de mettre entirement entre guillemets (doubles quotes) la commande. Notez quil y a une diffrence entre python fichier et python >> ; pour les lignes de continuation, il questionne avec le prompt secondaire, par dfaut trois points (... ). Linterprteur imprime un message de bienvenue spciant son numro de version et une notice de copyright avant dafcher le prompt principal :python Python 1.5.2b2 (#1, Feb 28 1999, 00:02:06) [GCC 2.8.1] on sunos5 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>>

Les lignes de continuation sont ncessaires lorsquon saisit une construction sur plusieurs lignes. Comme exemple, voici une instruction if :>>> le_monde_est_plat = 1 >>> if le_monde_est_plat: ... print "Gaffe pas tomber par dessus bord!" ... Gaffe pas tomber par dessus bord!

2.22.2.1

Linterprteur et son environnementGestion des erreurs

Quand une erreur survient, linterprteur imprime un message derreur et une trace de ltat de la pile. En mode interactif, il retourne alors au prompt principal ; lorsque lentre se fait depuis un chier, il termine lexcution avec un code de sortie diffrent de zro aprs avoir imprim la trace de pile. (Les exceptions gres par une clause except dans une instruction try ne sont pas des erreurs dans ce contexte ; voir 8.2.) Certaines erreurs sont fatales dans tous les cas et causent une sortie avec un code diffrent de zro ; cela se produit pour les aberrations internes et certains cas de saturation mmoire. Tous les messages derreur sont crits sur la sortie derreur standard ; lafchage normal des commandes excutes est effectu sur la sortie standard. Taper le caractre dinterruption (habituellement Control-C ou DEL) au prompt principal ou secondaire annule la saisie et revient au prompt principal.1 Taper le caractre dinterruption pendant lexcution dune commande dclenche lexception KeyboardInterrupt, qui peut tre gre par une instruction try.

2.2.2

Scripts Python excutables

Sur les systmes U NIX la BSD, les scripts Python peuvent tre rendus directement excutables, comme les scripts shell, en plaant la ligne1 Un

problme avec la bibliothque GNU Readline peut empcher cela.

10

Chapitre 2. Utilisation de linterprteur Python

#! /usr/bin/env python

(en supposant que linterprteur est dans le PATH de lutilisateur au lancement du script) et rendant le chier excutable. Le # ! doit correspondre aux deux premiers caractres du chier.

2.2.3

Encodage du chier source

Dans les chiers sources Python il est possible dutiliser des encodages diffrents de lASCII. La meilleure faon de le faire consiste mettre une ligne de commentaire spciale aprs la ligne #! pour dnir lencodage du chier source : # -*- coding: encoding -*Avec cette dclaration, tous les caractres dans le chier source seront traits comme ayant lencodage encoding, et il sera possibe dcrire directement des chanes littrales Unicode dans lencodage choisi. La liste des encodages possibles peut tre trouve dans Python Library Reference, dans la section sur les codecs. Par exemple, pour crire des chanes littrales Unicode incluant le symbole montaire Euro, lencodage ISO-885915 peut tre utilis, le symbole de Euro ayant le valeur ordinale 164. Le script suivant imprime la valeur 8364 (le code Unicode correspondant au symbole Euro) puis termine : # -*- coding: iso-8859-15 -*currency = u"= " C print ord(currency) Si votre diteur est capable denregistrer des chiers en UTF-8 avec une marque UTF-8 byte order mark (ou BOM), vous pouvez utiliser cela au lieu dune dclaration dencodage. IDLE accepte cette possibilit si la case Options/General/Default Source Encoding/UTF-8 est coche. Notez que cette signature nest pas comprise dans les anciennes livraisons de Python (2.2 et plus anciennes), et nest pas non plus comprise par le systme dexploitation pour les chiers script avec des lignes #! (utilises uniquement sur des systmes U NIX). En utilisant UTF-8 (soit travers cette signature, soit au moyen dune dclaration dencodage), les caractres de la plupart des langues du monde peuvent gurer simultanment dans les chanes littrales et les commentaires. Lemploi de caractres non ASCII dans les identicateurs nest pas autoris. Pour afcher tous ces caractres correctement votre diteur doit reconnatre que le chier est UTF-8 et il doit utiliser une police de caractres qui supporte tous les caractres dans le chier.

2.2.4

Le chier de dmarrage interactif

Quand vous utilisez Python de faon interactive, il est souvent pratique que certaines commandes standard soient excutes chaque fois que linterprteur est lanc. Vous pouvez faire cela en donnant la variable denvironnement PYTHONSTARTUP la valeur du nom dun chier contenant vos commandes de dmarrage. Cela est analogue lutilisation du .prole pour les shells U NIX. Ce chier est seulement lu avant les sessions interactives, non pas lorsque Python lit ses commandes dans un script, ni lorsque /dev/tty est fourni comme source explicite pour les commandes (ce qui pour le reste se comporte comme une session interactive). Il est excut dans le mme espace de noms que celui o sont excutes les commandes interactives, de sorte que les objets quil dnit ou importe peuvent tre utiliss directement dans la session interactive. Vous pouvez aussi changer les invites sys.ps1 et sys.ps2 dans ce chier. Si vous voulez lire un chier de lancement additionnel depuis le rpertoire courant, vous pouvez programmer cela dans le chier de dmarrage global en utilisant du code similaire if os.path.isfile(.pythonrc.py) : execfile(.pythonrc.py). Si vous voulez utiliser le chier de dmarrage dans un script, vous devez le faire explicitement dans le script :

2.2. Linterprteur et son environnement

11

import os filename = os.environ.get(PYTHONSTARTUP) if filename and os.path.isfile(filename): execfile(filename)

12

Chapitre 2. Utilisation de linterprteur Python

CHAPITRE

TROIS

Une introduction informelle PythonDans les exemples suivants, la saisie et lafchage seront distingus par la prsence ou labsence dinvites (>>> et ... ) : pour reproduire lexemple, vous devez taper tout ce qui suit linvite, quand celle-ci apparat ; les lignes qui ne commencent pas par une invite correspondent lafchage effectu par linterprteur. Notez quune invite secondaire seule sur une ligne signie que vous devez taper une ligne vide ; cela marque la n des commandes sur plusieurs lignes. De nombreux exemples de ce manuel, mme ceux qui sont saisis linvite interactive, contiennent des commentaires. Les commentaires en Python commencent par un caractre dise, #, et continuent jusqu la n de la ligne physique. Un commentaire peut se trouver au dbut dune ligne derrire un espace ou du code, mais pas lintrieur dune chane de caractres litrale. Un caractre dise lintrieur dune chane est juste un caractre dise. Quelques exemples :# voici le premier commentaire SPAM = 1 # et voici le deuxime commentaire # ... et maintenant un troisime! STRING = "# Ceci nest pas un commentaire."

3.1

Utiliser Python comme calculatrice

Essayons quelques commandes Python simples. Lancez linterprteur et attendez lapparition du prompt principal, >>>. (a ne devrait pas tre trs long.)

3.1.1

Nombres

Linterprteur fonctionne comme une simple calculatrice : vous pouvez y taper une expression et il va en afcher la valeur. La syntaxe des expression est naturelle : les oprateurs +, -, * et / marchent exactement comme dans la plupart des langages (par exemple Pascal ou C) ; les parenthses peuvent tre utilises pour les regrouper. Par exemple :

13

>>> 4 >>> ... 4 >>> 4 >>> 5 >>> ... 2 >>> -3

2+2 # Ceci est un commentaire 2+2 2+2 # et un commentaire sur la mme ligne que le code

(50-5*6)/4 # La division des entiers retourne lentier immdiatement infrieur: 7/3 7/-3

Comme en C, le signe gale (=) est utilis pour affecter une valeur une variable. La valeur dune affectation nest pas afche :>>> largeur = 20 >>> hauteur = 5*9 >>> largeur * hauteur 900

Une valeur peut tre affecte plusieurs variables simultanment :>>> >>> 0 >>> 0 >>> 0 x = y = z = 0 x y z # Mettre zro x, y et z

Il y a un support complet des nombres virgule ottante ; les oprateurs en prsence de types doprandes mlangs convertissent les oprandes entiers en virgule ottante :>>> 3 * 3.75 / 1.5 7.5 >>> 7.0 / 2 3.5

>>> 1j * 1J (-1+0j) >>> 1j * complex(0,1) (-1+0j) >>> 3+1j*3 (3+3j) >>> (3+1j)*3 (9+3j) >>> (1+2j)/(1+1j) (1.5+0.5j)

Les nombres complexes sont toujours reprsents comme deux nombres en virgule ottante, les parties relle et imaginaire. Pour extraire ces parties dun nombre complexe z, utilisez z.real et z.imag.

14

Chapitre 3. Une introduction informelle Python

>>> a=1.5+0.5j >>> a.real 1.5 >>> a.imag 0.5

Les fonctions de conversion en virgule ottante et en entier (float(), int() et long()) ne marchent pas pour les nombres complexes il ny a pas une faon correcte et unique de convertir un nombre complexe en un nombre rel. Utilisez abs(z) pour obtenir sa norme (en ottant) ou z.real pour sa partie relle.>>> a=3.0+4.0j >>> float(a) Traceback (most recent call last): File "", line 1, in ? TypeError: cant convert complex to float; use e.g. abs(z) >>> a.real 3.0 >>> a.imag 4.0 >>> abs(a) # sqrt(a.real**2 + a.imag**2) 5.0 >>>

En mode interactif, la dernire expression afche est affecte la variable _. Quand vous voulez utiliser Python comme calculatrice, cest plus pratique pour continuer les calculs, par exemple :>>> tva = 12.5 / 100 >>> prix = 100.50 >>> prix * tva 12.5625 >>> prix + _ 113.0625 >>> round(_, 2) 113.06 >>>

Cette variable doit tre utilise en lecture seule par lutilisateur. Ne lui affectez pas une valeur de faon explicite vous auriez alors cr une variable locale indpendante, avec le mme nom, masquant la variable intgre et son comportement magique.

3.1.2

Chanes de caractres

En plus des nombres, Python peut aussi manipuler des chanes, qui peuvent tre exprimes de diffrentes faons. Elles peuvent tre incluses entre simples quotes (apostrophes) ou doubles quotes (guillemets) :>>> spam eggs spam eggs >>> n\est-ce pas "nest-ce pas" >>> "nest-ce pas" "nest-ce pas" >>> "Oui," dit-il. "Oui," dit-il. >>> "\"Oui,\" dit-il." "Oui," dit-il. >>> "N\est-ce pas," repondit-elle. "N\est-ce pas," repondit-elle.

3.1. Utiliser Python comme calculatrice

15

Notez1 que les chanes admettent ou non les caractres accentus en mode intractif suivant votre plate-forme. Si les commandes sont lues depuis un chier, la situation est lgrement diffrente : en gnral vous pourrez, mais les caractres accentus risquent dtre interprts diffremment si vous transfrez vos chiers entre des plate-formes diffrentes. Pour ces questions de portabilit, les identicateurs en Python sont limits au code ASCII 7 bits. Vous ne pourrez pas (en mode intractif ou pas) utiliser des lettres accentues dans les noms de variables, fonctions, modules, classes, etc. Les textes dans les chanes peuvent se poursuivre sur plusieurs lignes de plusieurs faons. Des lignes de continuation peuvent tre utilises, avec un antislash comme dernier caractre sur la ligne pour indiquer que la prochaine ligne est une continuation logique de la ligne :salut = "Ceci est une chane plutot longue contenant\n\ plusieurs lignes de texte exactement comme on le ferait en C.\n\ Notez que les blancs au dbut de la ligne sont\ significatifs." print salut

Notez que les retours chariot ncessiteraient toujours dtre intgrs dans la chane en utilisant \n ; le retour chariot qui suit lantislash de n est supprim. Cet exemple safcherait de la faon suivante :Ceci est une chane plutot longue contenant plusieurs lignes de texte excatement comme on le ferait en C. Notez que les blancs au dbut de la ligne sont significatifs.

Si nous dnissons les caractres de la chane comme une chane raw (brute), par contre, les squences \n ne sont pas converties en caractres de retour chariot, mais lantislash de n de ligne, et le retour chariot du source sont tous les deux inclus dans la chane comme donnes. Ainsi, lexemple :salut = r"Ceci est une chaine assez longue contenant\n\ plusieurs lignes de texte comme vous pourriez vraiment le faire en C." print salut

afcherait :Ceci est une chaine assez longue contenant\n\ plusieurs lignes de texte comme vous pourriez vraiment le faire en C.

Ou bien, les chanes peuvent tre entoures par un couple de triple-quotes correspondantes : """ ou . Les ns de lignes nont pas besoin dtre prxes lorsquon utilise les triple-quotes, mais elles seront incluses dans la chane.print """ Usage: trucmuche [OPTIONS] -h -H hte """

Affiche cette notice dusage hte auquel il faut se connecter

produit lafchage suivant :1 NDT : Ce paragraphe absent de ldition originale a t ajout par Daniel Calvelo Aros lintention des utilisateurs de Python francophones.

16

Chapitre 3. Une introduction informelle Python

Usage: trucmuche [OPTIONS] -h -H hte

Affiche cette notice dusage hte auquel il faut se connecter

Linterprteur afche le rsultat des oprations sur les chanes de la mme faon qu la saisie : entre quotes, et avec quotes et autres caractres bizarres prxs par un antislash, pour afcher leur valeur exacte. La chane sera dlimite par des doubles quotes si elle contient une simple quote et aucune double quote, sinon, elle sera dlimite par des simples quotes. (Linstruction print, dcrite plus loin, peut tre utilise pour crire des chanes sans quotes ni caractres prxs.) Les chanes peuvent tre concatnes (accoles) avec loprateur +, et rptes avec * :>>> word = Help + A >>> word HelpA >>>

Deux chanes de texte cte cte sont automatiquement concatnes ; la premire ligne ci-dessus aurait pu tre crite mot = Help A ; cela fonctionne seulement avec deux chanes de texte, pas avec des expressions quelconques de type chane.>>> import string >>> cha ine chaine >>> string.strip(cha) + ine chaine >>> string.strip(cha) ine File "", line 1, in ? string.strip(cha) ine ^ SyntaxError: invalid syntax

# # #

mot[4] A >>> mot[0:2] He >>> mot[2:4] lp

A la diffrence des chanes de caractres en C, les chanes Python ne peuvent tre modies. Faire une affectation lemplacement dun indice dans la chane aboutit une erreur :

3.1. Utiliser Python comme calculatrice

17

>>> mot[0] = x Traceback (most recent call last): File "", line 1, in ? TypeError: object doesnt support item assignment >>> mot[:1] = Splat Traceback (most recent call last): File "", line 1, in ? TypeError: object doesnt support slice assignment

Cependant, il est facile et efcace de crer une nouvelle chane avec un contenu combin :>>> x + mot[1:] xelpA >>> Splat + mot[4] SplatA

Les indices de dcoupage ont des valeurs par dfaut utiles ; un premier index non-dni prend pour valeur par dfaut zro, un second index omis prend pour valeur par dfaut la taille de la chane quon est en train de dcouper.>>> mot[:2] He >>> mot[2:] lpA # Les deux premiers caractres # Tout sauf les deux premiers caractres

Voici un invariant utile des oprations de dcoupage : s[ :i] + s[i :] gale s.>>> mot[:2] + mot[2:] HelpA >>> mot[:3] + mot[3:] HelpA

Les indices de dcoupage errons sont grs de faon lgante : un index qui est trop grand est remplac par la taille de la chane, un index de n infrieur lindice de dbut retourne une chane vide.>>> mot[1:100] elpA >>> mot[10:] >>> mot[2:1]

Les indices peuvent tre des nombres ngatifs, pour compter partir de la droite. Par exemple :>>> mot[-1] A >>> mot[-2] p >>> mot[-2:] pA >>> mot[:-2] Hel # Le dernier caractre # Lavant dernier caractre # Les deux derniers caractres # Tout sauf les deux derniers caractres

Mais notez que -0 est vraiment la mme chose que 0, donc a ne compte pas partir de la droite !

18

Chapitre 3. Une introduction informelle Python

>>> mot[-0] H

# (puisque -0 gale 0)

Les indices de dcoupage ngatifs hors limites sont tronqus, mais nessayez pas ceci avec des indices daccs des lments uniques (sans dcoupage) :>>> mot[-100:] HelpA >>> mot[-10] # erreur Traceback (most recent call last): File "", line 1, in ? IndexError: string index out of range

La meilleure faon de se rappeler comment marchent les dcoupages est de penser aux indices comme pointant entre les caractres, avec le bord gauche du premier caractre numrot 0. Alors le bord droit du dernier caractre dune chane de n caractres porte lindex n, par exemple :+---+---+---+---+---+ | H | e | l | p | A | +---+---+---+---+---+ 0 1 2 3 4 5 -5 -4 -3 -2 -1

La premire ligne de nombres donne la position des indices 0...5 dans la chane ; la seconde ligne donne les indice ngatifs correspondants. Le dcoupage de i j consiste en tous les caractres entre les extrmits tiquetes i et j, respectivement. Pour les indices non ngatifs, la longueur dune tranche est la diffrence entre ses indices, si les deux sont lintrieur des limites. Par exemple, la longueur de mot[1:3] est 2. La fonction intgre len() retourne la longueur dune chane :>>> s = supercalifragilisticexpialidocious >>> len(s) 34

Voir aussi : Types squences (http://docs.python.org/lib/typesseq.html) Les chanes et les chanes Unicode dcrites la prochaine section sont des exemples de types squences et supportent les oprations communes supportes par de tels types. Mthodes des chanes (http://docs.python.org/lib/string-methods.html) Les chanes et les chanes Unicode disposent dun nombre important de mthodes effectuant des transformations basiques et des recherches. Mise en forme de chanes (http://docs.python.org/lib/typesseq-strings.html) Les oprations de mise en forme appeles lorsque des chanes et des chanes Unicode sont les oprandes gauches de loprateur % sont dcrites plus en dtail dans cette page.

3.1.3

Chanes Unicode

A partir de Python 2.0, un nouveau type de donnes destin stocker du texte est disponible pour les programmeurs : lobjet Unicode. Il peut tre utilis pour stocker et manipuler des donnes Unicode (voir http ://www.unicode.org/) et sintgre bien avec les objets chanes en fournissant des conversions automatiques l o cest ncessaire. Unicode offre lavantage de fournir un numro pour chaque caractre de chaque criture utilise dans les textes 3.1. Utiliser Python comme calculatrice 19

modernes et anciens. Auparavant, il ny avait que 256 numros possibles pour les caractres dcriture et les textes taient donc typiquement associs une page de codes qui ralisait lassociation entre le numros et les caractres dcriture. Cela conduisait beaucoup de confusion, spcialement en ce qui concerne linternationalisation (crite dhabitude comme i18n i + caractres 18 + n) des logiciels. Unicode rsout ces problmes en dnissant une page de codes pour toutes les critures. Crer des chanes Unicode en Python est exactement aussi simple que de crer des chanes normales :>>> uBonjour ! uBonjour !

Le u minuscule devant les guillemets indique quon souhaite crer une chane Unicode. Si vous dsirez placer des caractres spciaux dans la chane, vous pouvez le faire en utilisant lencodage Python Echappement-Unicode. Lexemple suivant montre comment faire :>>> uSalut\u0020tout le monde ! uSalut tout le monde !

La squence dchappement \u0020 indique quil faut insrer le caractre Unicode dont la valeur ordinale est 0x0020 (le caractre espace) lendroit indiqu. Les autres caractres sont interprts en utilisant leurs valeurs numriques respectives directement comme des numros Unicode. Si vous avez des textes de chanes en encodage standard Latin-1 qui est utilis dans de nombreux pays occidentaux, vous trouverez pratique que les 256 premiers caractres de lUnicode soient les mmes que les 256 caractres de Latin-1. Pour les experts, il y a aussi un mode brut exactement comme pour les chanes normales. Vous devez insrer ur avant louverture de la chane pour que Python utilise lencodage Raw-Unicode-Escape (chappement brutUnicode). Il nappliquera la conversion \uXXXX ci-dessus que sil y a un nombre impair dantislash avant le petit u.>>> urSalut\u0020tout le monde ! uSalut tout le monde ! >>> urSalut\\u0020tout le monde ! uSalut\\\\u0020tout le monde !

Le mode brut est extrmement utile lorsquil sagit de saisir de nombreux antislash, comme a peut tre ncessaire dans les expressions rationnelles. En dehors de ces encodages standards, Python fournit tout un ensemble dautres moyens de crer des chanes Unicode sur la base dun encodage connu. La fonction unicode() intgre fournit un accs tous les codecs (COdeurs et DECodeurs) Unicode enregistrs. Certains des encodages les mieux connus que ces codecs peuvent convertir sont Latin-1, ASCII, UTF-8 et UTF-16. Les deux derniers sont des encodages longueur variable qui permettent de stocker chaque caractres Unicode sur un ou plusieurs octets. Lencodage par dfaut est normalement dni ASCII, ce qui utilise les caractres de lintervale 0 127 et rejette tout autre caractre avec une erreur. Quand une chane Unicode est afche, crite dans un chier, ou convertie avec str(), la conversion survient en utilisant lencodage par dfaut.

20

Chapitre 3. Une introduction informelle Python

>>> u"abc" uabc >>> str(u"abc") abc >>> u"" u\xe4\xf6\xfc >>> str(u"") Traceback (most recent call last): File "", line 1, in ? UnicodeError: ASCII encoding error: ordinal not in range(128)

Pour convertir une chane Unicode vers une chane 8-bit en utilisant un encodage spcique, les objets Unicode fournissent une mthode encode() qui prend un argument, le nom de lencodage. Les noms en minuscules sont prfrs pour les encodages.>>> u"".encode(utf-8) \xc3\xa4\xc3\xb6\xc3\xbc

Si vous avez des donnes dans un encodage spcique et souhaitez produire une chane Unicode correspondante, vous pouvez utiliser la fonction unicode() avec le nom de lencodage comme second argument.>>> unicode(\xc3\xa4\xc3\xb6\xc3\xbc, utf-8) u\xe4\xf6\xfc

3.1.4

Listes

Python connat un grand nombre de types de donnes composites, utilises pour regrouper un ensemble de valeurs. La plus riche en possibilits est la liste, qui peut tre crite comme une liste de valeurs (lments) entre crochets et spars par des virgules. Les lments dune liste nont pas ncessairement le mme type.>>> a = [spam, eggs, 100, 1234] >>> a [spam, eggs, 100, 1234]

Comme les indices des chanes, les indices des listes commencent 0, et les listes peuvent tre dcoupes, concatnes, et ainsi de suite :>>> a[0] spam >>> a[3] 1234 >>> a[-2] 100 >>> a[1:-1] [eggs, 100] >>> a[:2] + [bacon, 2*2] [spam, eggs, bacon, 4] >>> 3*a[:3] + [Boe!] [spam, eggs, 100, spam, eggs, 100, spam, eggs, 100, Boe!]

A la diffrence des chanes, qui sont non-modiables, il est possible de changer les lments individuels dune liste :

3.1. Utiliser Python comme calculatrice

21

>>> a [spam, eggs, 100, 1234] >>> a[2] = a[2] + 23 >>> a [spam, eggs, 123, 1234]

Laffectation dans des tranches est aussi possible, et cela peut mme changer la taille de la liste :>>> # Remplacer certains lments: ... a[0:2] = [1, 12] >>> a [1, 12, 123, 1234] >>> # En enlever certains: ... a[0:2] = [] >>> a [123, 1234] >>> # En insrer ... a[1:1] = [bletch, xyzzy] >>> a [123, bletch, xyzzy, 1234] >>> a[:0] = a # Insre (une copie de) soi-mme au dbut >>> a [123, bletch, xyzzy, 1234, 123, bletch, xyzzy, 1234]

La fonction intgre len() sapplique aussi aux listes :>>> len(a) 8

Il est possible demboter des listes (crer des listes contenant dautres listes), par exemple :>>> >>> >>> 3 >>> [2, >>> 2 >>> >>> [1, >>> [2, q = [2, 3] p = [1, q, 4] len(p) p[1] 3] p[1][0] p[1].append(xtra) p [2, 3, xtra], 4] q 3, xtra] # See section 5.1

Notez que dans lexemple prcdent, p[1] et q se rfrent rellement au mme objet ! Nous reviendrons plus tard sur la smantique des objets.

3.2

Premiers pas vers la programmation

Bien sr, nous pouvons utiliser Python pour des tches plus compliques que dajouter deux et deux. Par exemple, nous pouvons crire une sous-squence de la suite de Fibonacci de la faon suivante :

22

Chapitre 3. Une introduction informelle Python

>>> ... ... >>> ... ... ... 1 1 2 3 5 8

# Suite de Fibonacci # La somme de deux lments dfinit le suivant a, b = 0, 1 while b < 10: print b a, b = b, a+b

Cet exemple introduit plusieurs fonctionnalits nouvelles. La premire ligne contient une affectation multiple : les variables a et b prennent simultanment les nouvelles valeurs 0 et 1. Sur la dernire ligne laffectation multiple est utilise nouveau, montrant que les expressions en partie droite sont dabord toutes values avant quaucune affectation ne se fasse. La boucle while sexcute tant que la condition (ici : b < 10) reste vraie. En Python, comme en C, toute valeur entire diffrente de zro est vraie ; zro est faux. La condition pourrait aussi tre une chane ou une valeur de type liste, en fait nimporte quelle squence ; nimporte quoi avec une longueur diffrente de zro est vrai, les squences vides correspondent faux. Le test utilis dans lexemple est une simple comparaison. Les oprateurs de comparaison standard sont crits de la mme faon quen C : , ==, = et !=. Le corps de la boucle est indent : lindentation est le moyen par lequel Python regroupe les instructions. Python ne fournit pas (encore) une fonction ddition de ligne intelligente, donc vous devez insrer une tabulation ou un espace pour chaque ligne indente. En pratique vous prparerez les saisies plus compliques avec un diteur de texte ; la plupart des diteurs de texte ont une fonction dauto-indentation. Lorsquune instruction compose est entre en mode interactif, elle doit tre suivie dune ligne vide pour indiquer quelle est termine (car linterprteur ne peut pas deviner si vous avez tap la dernire ligne). Linstruction print crit la valeur de la ou des expressions qui lui sont donnes. Elle diffre de la simple criture de lexpression (comme tout--lheure dans les exemples de la calculatrice) dans la mesure o elle accepte plusieurs expressions et chanes. Les chanes sont imprimes sans quotes, et un espace est insr entre les lments, ce qui vous permet de les afcher dans un format plus sympathique, comme ceci :>>> i = 256*256 >>> print La valeur de i est, i La valeur de i est 65536

Une virgule nale empche le retour chariot aprs lafchage :>>> a, b = 0, 1 >>> while b < 1000: ... print b, ... a, b = b, a+b ... 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Notez que linterprteur insre un retour chariot avant dimprimer le prompt suivant si la ligne na pas t complte.

3.2. Premiers pas vers la programmation

23

24

CHAPITRE

QUATRE

Dautres outils de contrle dexcutionA part linstruction while que lon vient de dcouvrir, Python comprend les instructions de contrle dexcution habituelles connues dans dautres langages, avec quelques adaptations.

4.1

Instructions if

Peut-tre linstruction la plus connue est-elle linstruction if. Par exemple :>>> >>> ... ... ... ... ... ... ... ... ... x = int(raw_input("Entrez un entier : ")) if x < 0: x = 0 print Ngatif chang en zro elif x == 0: print Zro elif x == 1: print Un seul else: print Plus

Il peut y avoir aucune ou plusieurs sections elif, et la section else est optionnelle. Le mot-cl elif est une abrviation de else if, et est utile pour viter une indentation excessive. Une squence if . . . elif . . . elif . . . est un substitut pour les instructions switch ou case quon trouve dans dautres langages.

4.2

Instructions for

Linstruction for en Python diffre un petit peu de ce que vous avez pu utiliser en C ou en Pascal. Au lieu ditrer toujours dans une progression arithmtique de nombres (comme en Pascal), ou de laisser lutilisateur compltement libre dans les tests et les pas ditration (comme en C), linstruction for de Python itre parmi les lments de nimporte quelle squence (une liste ou une chane), dans lordre o ils apparaissent dans la squence. Par exemple (aucun jeu de mots volontaire) :>>> # Mesurer quelques chanes: ... a = [chat, fentre, dfenestrer] >>> for x in a: ... print x, len(x) ... chat 4 fentre 7 dfenestrer 11

Il nest pas prudent de modier la squence sur laquelle on itre dans la boucle (cela peut seulement arriver pour 25

les types de squences modiables, tels que les listes). Si vous avez besoin de modier la liste sur laquelle vous itrez (par exemple, pour dupliquer des lments slectionns), vous devez itrer sur une copie. La notation de dcoupage rend cela particulirement pratique :>>> for x in a[:]: # fait une copie de la liste entire par dcoupage ... if len(x) > 8: a.insert(0, x) ... >>> a [dfenestrer, chat, fentre, dfenestrer]

4.3

La fonction range()

Si vous avez besoin ditrer sur une squence de nombres, la fonction intgre range() vient point. Elle gnre des listes contenant des progressions arithmtiques :>>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Le nombre de n qui lui est pass nest jamais dans la liste gnre ; range(10) gnre une liste de 10 valeurs, exactement les indices des lments dune squence de longueur 10. Il est possible de faire commencer lintervalle un autre nombre, ou de spcier un incrment diffrent (mme ngatif) :>>> range(5, 10) [5, 6, 7, 8, 9] >>> range(0, 10, 3) [0, 3, 6, 9] >>> range(-10, -100, -30) [-10, -40, -70]

Pour parcourir les indices dune squence, combinez range() et len() comme ci-dessous :>>> a = [Marie, avait, un, petit, mouton] >>> for i in range(len(a)): ... print i, a[i] ... 0 Marie 1 avait 2 un 3 petit 4 mouton

4.4

Les instructions break et continue, et les clauses else dans les boucles

Linstruction break, comme en C, sort de la plus petite boucle for ou while englobante. Linstruction continue, galement emprunte au C, continue sur la prochaine itration de la boucle. Les instructions de boucle ont une clause else ; elle est excute lorsque la boucle se termine par puisement de la liste (avec for) ou quand la condition devient fausse (avec while), mais pas quand la boucle est interrompue par une instruction break. Cela est expliqu dans la boucle suivante, qui recherche des nombres premiers :

26

Chapitre 4. Dautres outils de contrle dexcution

>>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print n, gale, x, *, n/x ... break ... else: ... # la boucle sest termine sans trouver de facteur ... print n, est un nombre premier ... 2 est un nombre premier 3 est un nombre premier 4 gale 2 * 2 5 est un nombre premier 6 gale 2 * 3 7 est un nombre premier 8 gale 2 * 4 9 gale 3 * 3

4.5

LInstruction pass

Linstruction pass ne fait rien. Elle peut tre utilise lorsquune instruction est requise syntaxiquement mais que le programme ne ncessite aucune action. Par exemple :>>> while 1: ... pass # Attente active dune interruption au clavier ...

4.6

Dnition de fonctions

Nous pouvons crer une fonction qui crit la srie de Fibonacci jusqu une limite quelconque :>>> ... ... ... ... ... ... >>> ... 1 1 def fib(n): # crit la srie de Fibonacci jusqu n """Affiche une suite de Fibonacci jusqu n.""" a, b = 0, 1 while b < n: print b, a, b = b, a+b # Maintenant on appelle la fonction qui vient juste dtre dfinie fib(2000) 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

Le mot-cl def dbute la dnition dune fonction. Il doit tre suivi par le nom de la fonction et une liste entre parenthses de paramtres formels. Les instructions qui forment le corps de la fonction commencent sur la ligne suivante, indente par une tabulation. La premire instruction du corps de la fonction peut ventuellement tre un texte dans une chane de caractres ; cette chane est la chane de documentation de la fonction, ou docstring. Il y a des outils qui utilisent les docstrings pour gnrer automatiquement de la documentation papier, ou pour permettre lutilisateur de naviguer interactivement dans le code ; cest une bonne technique que dinclure les docstrings dans le code que vous crivez, donc essayez de vous y habituer. Lexcution dune fonction gnre une nouvelle table de symboles, utilise pour les variables locales de la fonction. Plus prcisment, toutes les affectations de variables dans une fonction stockent la valeur dans la table de symboles locale ; alors que les rfrences des variables regardent en premier dans la table de symboles locale, puis dans

4.5. LInstruction pass

27

la table de symboles globale, et enn dans la table des noms intgrs. Ainsi, on ne peut affecter directement une valeur aux variables globales lintrieur dune fonction ( moins de les dclarer avec une instruction global), bien quon puisse y faire rfrence. Les vrais paramtres (arguments) dun appel de fonction sont introduits dans la table de symboles locale de la fonction appele quand elle est appele ; ainsi, les arguments sont passs en utilisant un passage par valeur.1 Quand une fonction appele appelle son tour une autre fonction, une nouvelle table de symboles locaux est cre pour cet appel. La dnition dune fonction introduit le nom de la fonction dans la table de symboles courante. La valeur du nom de la fonction a un type qui est reconnu par linterprteur comme une fonction dnie par lutilisateur. Cette valeur peut tre affecte un autre nom qui peut alors tre utilis aussi comme une fonction. Cela permet de disposer dun mcanisme gnral de renommage :>>> fib >>> f = fib >>> f(100) 1 1 2 3 5 8 13 21 34 55 89

Vous pourriez objecter que fib nest pas une fonction mais une procdure. En Python, comme en C, les procdures sont juste des fonctions qui ne retournent pas de valeur. En fait, techniquement parlant, les procdures retournent bien une valeur, bien quelle soit plutt dcevante. Cette valeur est appele None (cest un nom intgr). La valeur None nest normalement pas afche par linterprteur si elle devait tre la seule valeur crite. Vous pouvez le vrier si vous y tenez vraiment :>>> print fib(0) None

Ecrire une fonction qui retourne une liste des nombres de la suite de Fibonacci, au lieu de les imprimer, est trs simple :>>> ... ... ... ... ... ... ... ... >>> >>> [1, def fib2(n): # retourne la srie de Fibonacci jusqu n """Retourne une liste contenant la srie de Fibonacci jusqu n""" resultat = [] a, b = 0, 1 while b < n: resultat.append(b) # voir ci-dessous a, b = b, a+b return resultat f100 = fib2(100) # on lappelle f100 # crire le rsultat 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Cet exemple, comme dhabitude, dmontre quelques nouvelles caractristiques de Python : Linstruction return termine une fonction en renvoyant une valeur. return sans une expression en argument renvoie None. Parvenir jusquau bout de la procdure renvoie galement None. Linstruction result.append(b) appelle une mthode de lobjet result. Une mthode est une fonction qui appartient un objet et est nomme obj.nommethode, o obj est un objet (cela pourrait tre une expression), et nommethode est le nom dune mthode qui est dnie daprs le type de lobjet. Diffrents types dnissent diffrentes mthodes. Les mthodes de types diffrents peuvent avoir le mme nom sans que cela soit source dambiguts. (Il est possible de1 En ralit, passage par rfrence dobjet serait une meilleure description, puisque si un objet modiable est pass, lappelant verra tous les changements que lappel y effectue (les lments insrs dans une liste).

28

Chapitre 4. Dautres outils de contrle dexcution

dnir vos propres types dobjets et mthodes, en utilisant des classes, de la faon dcrite en 9.) La mthode append() montre prcdemment, est dnie pour les objets listes ; elle ajoute un nouvel lment la n de la liste. Dans cet exemple, cest quivalent result = result + [b], mais en plus performant.

4.7

Encore plus sur la dnition de fonctions

Il est aussi possible de dnir des fonctions nombre darguments variable. Il y a trois faons de faire, qui peuvent tre combines.

4.7.1

Valeurs dargument par dfaut

La technique la plus utile consiste spcier une valeur par dfaut pour un ou plusieurs arguments. Cela cre une fonction qui peut tre appele avec moins darguments quil nen a t dni.def demande_ok(question, tentatives=4, plainte=Oui ou non, svp!): while 1: ok = raw_input(question) if ok in (o, ou, oui): return 1 if ok in (n, no, non, niet): return 0 tentatives = tentatives - 1 if tentatives < 0: raise IOError, utilisateur refusenik print plainte

Cette fonction peut tre appele soit comme ceci : demande_ok(Etes vous sr de vouloir quitter ?) ou comme ceci : demande_ok(OK pour crasement du fichier ?, 2). Les valeurs par dfaut sont values au moment de la dnition de la fonction dans la porte de dnition, ainsii = 5 def f(arg=i): print arg i = 6 f()

afchera 5. Avertissement important : La valeur par dfaut est value seulement une fois. Cela est important lorsque la valeur par dfaut est un objet modiable comme une liste ou un dictionnaire. Par exemple, la fonction suivante accumule les arguments qui lui sont passs au fur et mesure des appels :def f(a, L=[]): L.append(a) return L print f(1) print f(2) print f(3)

Cela afchera[1] [1, 2] [1, 2, 3]

4.7. Encore plus sur la dnition de fonctions

29

Si vous ne voulez pas que la valeur par dfaut soit partage entre des appels successifs, vous pouvez plutt crire la fonction comme ceci :def f(a, L=None): if L is None: L = [] L.append(a) return L

4.7.2

Arguments mot-cl

Les fonctions peuvent aussi tre appeles en utilisant des arguments mots-cls de la forme motcle = valeur. Par exemple, la fonction suivante :def perroquet(voltage, etat=c\est du solide, action=voom, type=Bleu Norvgien): print "-- Ce perroquet ne fera pas", action, print "si vous le mettez sous", voltage, "Volts." print "-- Beau plumage, le", type print "-- Ca", etat, "!"

pourrait tre appele de lune des faons suivantes :perroquet(1000) perroquet(action = VOOOOOM, voltage = 1000000) perroquet(un millier, etat = fait bouffer les pissenlits par la racine) perroquet(un milion, vous dgoute de la vie, de bonds)

mais les appels suivants seraient tous invalides :perroquet() perroquet(voltage=5.0, rend mort) perroquet(110, voltage=220) perroquet(acteur=John Cleese) # # # # manque un argument obligatoire un argument non-mot-cl suit un mot-cl doublon de valeurs pour un argument mot-cl inconnu

En gnral, une liste darguments doit tre constitue de tous les arguments de position, suivis de tous les arguments mots-cls, o ces mots-cls doivent tre choisis parmi les noms des paramtres formels. Il nest pas important quun paramtre formel ait une valeur par dfaut ou non. Aucun argument ne peut recevoir une valeur plus dune fois les noms de paramtre formel correspondant aux arguments de position ne peuvent tre utiliss comme mots-cls dans les mmes appels.>>> def function(a): ... pass ... >>> function(0, a=0) Traceback (most recent call last): File "", line 1, in ? TypeError: keyword parameter redefined

Quand un paramtre formel de la forme **nom est prsent en dernire position, il reoit un dictionnaire contenant tous les arguments mots-cls dont les mots-cls ne correspondent pas un paramtre formel. Cela peut tre combin avec un paramtre formel de la forme *nom (dcrit dans la sous-section suivante) qui reoit un tuple contenant les arguments positionnels au-del de la liste de paramtres formels. (*nom doit tre plac avant **nom.) Par exemple, nous dnissons une fonction comme ceci : 30 Chapitre 4. Dautres outils de contrle dexcution

def fromagerie(type, *arguments, **motcles): print "-- Avez-vous du", type, ? print "-- Je suis dsol, plus personne na de", type for arg in arguments: print arg print -*40 cles = motcles.keys() cles.sort() for mc in cles : print mc, :, motcles[mc]

Elle pourrait tre appele comme ceci :fromagerie(Camembert, "Il est trs coulant, monsieur.", "Il est vraiment trs, TRES coulant, monsieur.", client=John Cleese, proprietaire=Michael Palin, sketch=Sketch de la Fromagerie )

et bien sr, elle crirait :-- Avez-vous du Camembert ? -- Je suis dsol, plus personne na de Camembert Il est trs coulant, monsieur. Il est vraiment trs, TRES coulant, monsieur. ---------------------------------------client : John Cleese proprietaire : Michael Palin sketch : Sketch de la Fromagerie

Notez que la mthode sort() de la liste de des mots-cls des noms darguments est appele avant dimprimer le contenu du dictionnaire motcles ; si cela nest pas fait, lordre dans lequel les arguments sont imprims nest pas dni.

4.7.3

Listes darguments arbitraires

Finalement, loption la moins frquemment utilise est de spcier quune fonction peut tre appele avec un nombre darguments arbitraire. Ces arguments seront rcuprs dans un tuple. Avant le nombre variable darguments, zro ou plus arguments normaux pourraient tre prsents.def fprintf(fichier, format, *args): fichier.write(format % args)

4.7.4

Listes darguments dballer

La situation inverse se produit lorsque les arguments sont dans une liste ou un n-uplet mais doivent tre dballs en vue dune fonction qui requiert des arguments positionnels spars. Par exemple, la fonction intgre range() attend deux arguments spars start et stop. Si ces derniers ne sont pas disponibles sparment, crivez lappel de la fonction avec loprateur * an de dballer les arguments depuis une liste ou un n-uplet :>>> [3, >>> >>> [3, range(3, 6) 4, 5] args = [3, 6] range(*args) 4, 5] # appel normal avec des arguments spars

# appel avec des arguments dballs depuis une liste

4.7. Encore plus sur la dnition de fonctions

31

De la mme manire, les dictionnaires peuvent fournir des arguments mot-cl si on utilise loprateur ** :>>> def parrot(voltage, state=a stiff, action=voom): ... print "-- This parrot wouldnt", action, ... print "if you put", voltage, "volts through it.", ... print "Es", state, "!" ... >>> d = {"voltage": "four million", "state": "bleedin demised", "action": "VOOM"} >>> parrot(**d) -- This parrot wouldnt VOOM if you put four million volts through it. Es bleedin demised !

4.7.5

Les formes lambda

Suite la demande populaire, quelques caractristiques trouves habituellement dans les langages de programmation fonctionnelle et dans Lisp ont t ajoutes Python. Avec le mot-cl lambda, de petites fonctions anonymes peuvent tre cres. Voici une fonction qui retourne la somme de ses deux arguments : lambda a, b : a+b. Les formes Lambda peuvent tre utilises chaque fois quun objet fonction est requis. Elles sont limites syntaxiquement une expression unique. Smantiquement, elles sont juste de lenrobage syntaxique pour une dnition de fonction normale. Comme les dnitions de fonctions imbriques, les formes lambda peuvent faire rfrence des variables de la porte qui les contient :>>> ... ... >>> >>> 42 >>> 43 def fabrique_incrementeur(n): return lambda x, incr=n: x+incr f = fabrique_incrementeur(42) f(0) f(1)

4.7.6

Chanes de documentation (Docstrings)

Il existe des conventions mergentes propos du contenu et du formatage des chanes de documentation. La premire ligne devrait toujours tre un rsum concis des objectifs de lobjet. An dtre bref, il ne devrait pas rpter explicitement le nom ou le type de lobjet, puisque ces informations sont disponibles par dautres moyens (sauf si le nom se trouve tre un verbe dcrivant lutilisation dune fonction). Cette ligne devrait toujours commencer par une lettre majuscule et nir par une virgule. Sil y a dautres lignes dans la chane de documentation, la deuxime ligne devrait tre vide, sparant visuellement le rsum du reste de la description. Les lignes suivantes devraient constituer un ou plusieurs paragraphes dcrivant les conventions dappel des objets, ses effets de bord, etc. Linterprteur python ne supprime pas lindentation des chanes de texte multilignes en Python, donc les outils qui traitent la documentation doivent supprimer lindentation. Cela peut se faire en utilisant la convention suivante. La premire ligne non-vide aprs la premire ligne de la chane dtermine la quantit dindentation pour toute la chane de documentation. (On ne peut pas utiliser la premire ligne puisquelle est gnralement adjacente aux quotes ouvrantes de la chane donc son indentation nest pas apparente dans le texte de la chane.) Les espaces quivalents cette indentation sont ensuite supprims du dbut de toutes les lignes de la chane. Des lignes indentes de faon moins importante ne devraient pas apparatre, mais si elles le font, tous leurs espaces en dbut de ligne devraient tre supprims. Lquivalence de lespacement devrait tre teste aprs lexpansion des tabulations ( 8 espaces, normalement). Voici un exemple de docstring multi-ligne :

32

Chapitre 4. Dautres outils de contrle dexcution

>>> def ma_fonction(): ... """Ne fait rien, mais le documente. ... ... Non, vraiment, elle ne fait rien. ... """ ... pass ... >>> print ma_fonction.__doc__ Ne fait rien, mais le documente. Non, vraiment, elle ne fait rien.

4.7. Encore plus sur la dnition de fonctions

33

34

CHAPITRE

CINQ

Structures de donnesCe chapitre dcrit avec plus de dtail quelques lments que vous avez dj tudi, et ajoute aussi quelques nouveauts.

5.1

Plus de dtails sur les listes

Le type de donnes liste possde dautres mthodes. Voici toutes les mthodes des objets listes : append(x) Equivalent a.insert(len(a), x). extend(L) Rallonge la liste en ajoutant la n tous les lments de la liste donne ; quivaut a[len(a):] = L. insert(i, x) Insre un lment une position donne. Le premier argument est lindice de llment avant lequel il faut insrer, donc a.insert(0, x) insre au dbut de la liste, et a.insert(len(a), x) est quivalent a.append(x). remove(x) Enlve le premier lment de la liste dont la valeur est x. Il y a erreur si cet lment nexiste pas. pop([i ]) Enlve llment prsent la position donne dans la liste, et le renvoie. Si aucun indice nest spci, a.pop() renvoie le dernier lment de la liste. Llment est aussi supprim de la liste. index(x) Retourne lindice dans la liste du premier lment dont la valeur est x. Il y a erreur si cet lment nexiste pas. count(x) Renvoie le nombre de fois que x apparat dans la liste. sort() Trie les lments lintrieur de la liste. reverse() Renverse lordre des lments lintrieur de la liste. Un exemple qui utilise toutes les mthodes des listes :

35

>>> a = [66.6, 333, 333, 1, 1234.5] >>> print a.count(333), a.count(66.6), a.count(x) 2 1 0 >>> a.insert(2, -1) >>> a.append(333) >>> a [66.6, 333, -1, 333, 1, 1234.5, 333] >>> a.index(333) 1 >>> a.remove(333) >>> a [66.6, -1, 333, 1, 1234.5, 333] >>> a.reverse() >>> a [333, 1234.5, 1, 333, -1, 66.6] >>> a.sort() >>> a [-1, 1, 66.6, 333, 333, 1234.5]

5.1.1

Utiliser les listes comme des piles

Les mthodes des listes rendent trs facile lutilisation dune liste comme une pile, o le dernier lment ajout est le premier lment rcupr (LIFO, last-in, rst-out). Pour ajouter un lment au sommet de la pile, utilisez la mthode append(). Pour rcuprer un lment du sommet de la pile, utilisez pop() sans indice explicite. Par exemple :>>> >>> >>> >>> [3, >>> 7 >>> [3, >>> 6 >>> 5 >>> [3, pile = [3, 4, 5] pile.append(6) pile.append(7) pile 4, 5, 6, 7] pile.pop() pile 4, 5, 6] pile.pop() pile.pop() pile 4]

5.1.2

Utiliser les listes comme des les

Vous pouvez aussi utiliser facilement une liste comme une le, o le premier lment ajout est le premier lment retir (FIFO, rst-in, rst-out). Pour ajouter un lment la n de la le, utiliser append(). Pour rcuprer un lment du devant de la le, utilisez pop() avec 0 pour indice. Par exemple ;

36

Chapitre 5. Structures de donnes

>>> file = ["Eric", "John", "Michael"] >>> file.append("Terry") # Terry arrive >>> file.append("Graham") # Graham arrive >>> file.pop(0) Eric >>> file.pop(0) John >>> file [Michael, Terry, Graham]

5.1.3

Outils de programmation fonctionnelle

Il y a trois fonctions intgres qui sont trs pratiques avec les listes : filter(), map(), et reduce(). filter(fonction, sequence) renvoit une liste (du mme type, si possible) contenant les seul lments de la squence pour lesquels fonction(element) est vraie. Par exemple, pour calculer quelques nombres premiers :>>> def f(x): return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]

map(fonction, sequence) appelle fonction(element) pour chacun des lments de la squence et renvoie la liste des valeurs de retour. Par exemple, pour calculer les cubes :>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

Plusieurs squences peuvent tre passes en paramtre ; la fonction doit alors avoir autant darguments quil y a de squences et est appele avec les lments correspondants de chacune des squences (ou None si lune des squences est plus courte que lautre). Si None est pass en tant que fonction, une fonction retournant ses arguments lui est substitue. En combinant ces deux cas spciaux, on voit que map(None, liste1, liste2) est une faon pratique de transformer un couple de liste en une liste de couples. Par exemple :>>> seq = range(8) >>> def carre(x): return x*x ... >>> map(None, seq, map(carre, seq)) [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]

reduce(fonction, sequence) renvoie une valeur unique construite par lappel de la fonction binaire fonction sur les deux premiers lments de la squence, puis sur le rsultat et llment suivant, et ainsi de suite. Par exemple, pour calculer la somme des nombres de 1 10 :>>> def ajoute(x,y): return x+y ... >>> reduce(ajoute, range(1, 11)) 55

5.1. Plus de dtails sur les listes

37

Sil y a seulement un lment dans la squence, sa valeur est renvoye ; si la squence est vide, une exception est dclenche. Un troisime argument peut tre transmis pour indiquer la valeur de dpart. Dans ce cas, la valeur de dpart est renvoye pour une squence vide, et la fonction est dabord applique la valeur de dpart et au premier lment de la squence, puis au rsultat et llment suivant, et ainsi de suite. Par exemple,>>> def somme(seq): ... def ajoute(x,y): return x+y ... return reduce(ajoute, seq, 0) ... >>> somme(range(1, 11)) 55 >>> somme([]) 0

5.1.4

List Comprehensions

Les list comprehensions fournissent une faon concise de crer des listes sans avoir recours map(), filter() et/ou lambda. La dnition de liste qui en rsulte a souvent tendance tre plus claire que des listes construites avec ces outils. Chaque list comprehension consiste en une expression suivie dune clause for, puis zro ou plus clauses for ou if. Le rsultat sera une liste rsultant de lvaluation de lexpression dans le contexte des clauses for et if qui la suivent. Si lexpression svalue en un tuple, elle doit tre mise entre parenthses.>>> fruitfrais = [ banane, myrtille , fruit de la passion ] >>> [projectile.strip() for projectile in fruitfrais] [banane, myrtille, fruit de la passion] >>> vec = [2, 4, 6] >>> [3*x for x in vec] [6, 12, 18] >>> [3*x for x in vec if x > 3] [12, 18] >>> [3*x for x in vec if x < 2] [] >>> [{x: x**2} for x in vec] [{2: 4}, {4: 16}, {6: 36}] >>> [[x,x**2] for x in vec] [[2, 4], [4, 16], [6, 36]] >>> [x, x**2 for x in vec] # erreur - parenthses obligatoires pour les tuples File "", line 1, in ? [x, x**2 for x in vec] ^ SyntaxError: invalid syntax >>> [(x, x**2) for x in vec] [(2, 4), (4, 16), (6, 36)] >>> vec1 = [2, 4, 6] >>> vec2 = [4, 3, -9] >>> [x*y for x in vec1 for y in vec2] [8, 6, -18, 16, 12, -36, 24, 18, -54] >>> [x+y for x in vec1 for y in vec2] [6, 5, -7, 8, 7, -5, 10, 9, -3] >>> [vec1[i]*vec2[i] for i in range(len(vec1))] [8, 12, -54]

38

Chapitre 5. Structures de donnes

5.2

Linstruction del

Il y a un moyen denlever un lment dune liste en ayant son indice au lieu de sa valeur : linstruction del. Cela peut aussi tre utilis pour enlever des tranches dans une liste (ce que lon a fait prcdemment par remplacement de la tranche par une liste vide). Par exemple :>>> a [-1, 1, 66.6, 333, 333, 1234.5] >>> del a[0] >>> a [1, 66.6, 333, 333, 1234.5] >>> del a[2:4] >>> a [1, 66.6, 1234.5]

del peut aussi tre utilis pour supprimer des variables compltes :>>> del a

Faire par la suite rfrence au nom a est une erreur (au moins jusqu ce quune autre valeur ne lui soit affecte). Nous trouverons dautres utilisations de del plus tard.

5.3

N-uplets (tuples) et squences

Nous avons vu que les listes et les chanes ont plusieurs proprits communes, telles que lindexation et les oprations de dcoupage. Elles sont deux exemples de types de donnes de type squence. Puisque Python est un langage qui volue, dautres types de donnes de type squence pourraient tre ajouts. Il y a aussi un autre type de donnes de type squence standard : le tuple (n-uplet). Un n-uplet consiste en un ensemble de valeurs spares par des virgules, par exemple :>>> t = 12345, 54321, salut! >>> t[0] 12345 >>> t (12345, 54321, salut!) >>> # Les Tuples peuvent tre imbriqus: ... u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, salut!), (1, 2, 3, 4, 5))

Comme vous pouvez le voir, lafchage, les tuples sont toujours entre parenthses, de faon ce que des tuples de tuples puissent tre interprts correctement ; ils peuvent tre saisis avec ou sans parenthses, bien que des parenthses soient souvent ncessaires (si le tuple fait partie dune expression plus complexe). Les tuples ont plein dutilisations. Par exemple, les couples de coordonnes (x, y), les enregistrements des employs dune base de donnes, etc. Les tuples, comme les chanes, sont non-modiables : il est impossible daffecter individuellement une valeur aux lments dun tuple (bien que vous puissiez simuler quasiment cela avec le dcoupage et la concatnation). Un problme particulier consiste crer des tuples contenant 0 ou 1 lment : la syntaxe reconnat quelques subtilits pour y arriver. Les tuples vides sont construits grce des parenthses vides ; un tuple avec un lment est construit en faisant suivre une valeur dune virgule (il ne suft pas de mettre une valeur seule entre parenthses). Moche, mais efcace. Par exemple :

5.2. Linstruction del

39

>>> empty = () >>> singleton = salut, >>> len(empty) 0 >>> len(singleton) 1 >>> singleton (salut,)

# >> x, y, z = t

Cela est appel, fort judicieusement, dballage de tuple (tuple unpacking). Le dballage dun tuple ncessite que la liste des variables gauche ait un nombre dlments gal la longueur du tuple. Notez que des affectations multiples ne sont en ralit quune combinaison demballage et dballage de tuples !

5.4

Ensembles

Python comporte galement un type de donnes pour reprsenter des ensembles. Un set est une collection (non range) sans lments dupliqus. Les emplois basiques sont le test dappartenance et llimination des entre dupliques. Les objets ensembles supportent les oprations mathmatiques comme lunion, lintersection, la diffrence et la diffrence symtrique. Voici une dmonstration succincte :>>> basket = [apple, orange, apple, pear, orange, banana] >>> fruits = set(basket) # create a set without duplicates >>> fruits set([orange, pear, apple, banana]) >>> orange in fruits # fast membership testing True >>> crabgrass in fruits False >>> # Demonstrate set operations on unique letters from two words ... >>> a = set(abracadabra) >>> b = set(alacazam) >>> a # unique letters in a set([a, r, b, c, d]) >>> a - b # letters in a but not in b set([r, d, b]) >>> a | b # letters in either a or b set([a, c, r, d, b, m, z, l]) >>> a & b # letters in both a and b set([a, c]) >>> a ^ b # letters in a or b but not both set([r, d, b, m, z, l])

40

Chapitre 5. Structures de donnes

5.5

Dictionnaires

Un autre type de donnes intgr Python est le dictionnaire. Les dictionnaires sont parfois trouvs dans dautres langages sous le nom de mmoires associatives ou tableaux associatifs. A la diffrence des squences, qui sont indexes par un intervalle numrique, les dictionnaires sont indexs par des cls, qui peuvent tre de nimporte quel type non-modiable ; les chanes et les nombres peuvent toujours tre des cls. Les tuples peuvent tre utiliss comme cls sils ne contiennent que des chanes, des nombres ou des tuples. Vous ne pouvez pas utiliser des listes comme cls, puisque les listes peuvent tre modies en utilisant leur mthode append(). Il est prfrable de considrer les dictionnaires comme des ensembles non ordonns de couples cl :valeur, avec la contrainte que les cls soient uniques ( lintrieur dun mme dictionnaire). Un couple daccolades cre un dictionnaire vide : {}. Placer une liste de couples cl :valeur spars par des virgules lintrieur des accolades ajoute les couples initiaux cl :valeur au dictionnaire ; cest aussi de cette faon que les dictionnaires sont afchs. Les oprations principales sur un dictionnaire sont le stockage dune valeur laide dune certaine cl et lextraction de la valeur en donnant la cl. Il est aussi possible de dtruire des couples cl :valeur avec del. Si vous stockez avec une cl dj utilise, lancienne valeur associe cette cl est oublie. Cest une erreur dextraire une valeur en utilisant une cl qui nexiste pas. La mthode keys() dun objet de type dictionnaire retourne une liste de toutes les cls utilises dans le dictionnaire, dans un ordre quelconque (si vous voulez quelle soit trie, appliquez juste la mthode sort() la liste des cls). Pour savoir si une cl particulire est dans le dictionnaire, utilisez la mthode has_key() du dictionnaire. Voici un petit exemple utilisant un dictionnaire :>>> tel = {jack: 4098, sape: 4139} >>> tel[guido] = 4127 >>> tel {sape: 4139, guido: 4127, jack: 4098} >>> tel[jack] 4098 >>> del tel[sape] >>> tel[irv] = 4127 >>> tel {guido: 4127, irv: 4127, jack: 4098} >>> tel.keys() [guido, irv, jack] >>> tel.has_key(guido) True

Le constructeur dict() construit des dictionnaires directement partir de listes de paires cl-valeur ranges comme des n-uplets. Lorsque les paires forment un motif, les list list comprehensions peuvent spcier de manire compacte la liste de cls-valeurs.>>> dict([(sape, 4139), (guido, 4127), (jack, 4098)]) {sape: 4139, jack: 4098, guido: 4127} >>> dict([(x, x**2) for x in (2, 4, 6)]) # use a list comprehension {2: 4, 4: 16, 6: 36}

Plus loin dans ce tutoriel nous tudierons les expressions gnrateurs qui sont loutil idal pour fournir des paires cl-valeur au constructeur dict(). Lorsque les cls sont de simples chanes il est parfois plus simple de spcier les paires en utilisant des arguments mot-cl :>>> dict(sape=4139, guido=4127, jack=4098) {sape: 4139, jack: 4098, guido: 4127}

5.5. Dictionnaires

41

5.6

Techniques de boucles

Lorsquon boucle sur un dictionnaire, les cls et les valeurs correspondantes peuvent tre obtenues en mme temps en utilisant la mthode iteritems()>>> knights = {gallahad: the pure, robin: the brave} >>> for k, v in knights.iteritems(): ... print k, v ... gallahad the pure robin the brave

Lorsquon boucle sur une squence, lindice donnant la position et la valeur correspondante peuvent tre obtenus en mme temps en utilisant la fonction enumerate().>>> for i, v in enumerate([tic, tac, toe]): ... print i, v ... 0 tic 1 tac 2 toe

Pour boucler sur deux squences, ou plus, en mme temps, les lments peuvent tre apparis avec la fonction zip().>>> questions = [name, quest, favorite color] >>> answers = [lancelot, the holy grail, blue] >>> for q, a in zip(questions, answers): ... print What is your %s? It is %s. % (q, a) ... What is your name? It is lancelot. What is your quest? It is the holy grail. What is your favorite color? It is blue.

Pour boucler lenvers sur une squence, spciez dabord la squence lendroit, ensuite appelez la fonction reversed().>>> for i in reversed(xrange(1,10,2)): ... print i ... 9 7 5 3 1

Pour boucler sur une squence comme si elle tait trie, utilisez la fonction sorted() qui retourne une liste nouvelle trie tout en laissant la source inchange.

42

Chapitre 5. Structures de donnes

>>> basket = [apple, orange, apple, pear, orange, banana] >>> for f in sorted(set(basket)): ... print f ... apple banana orange pear

5.7

Plus de dtails sur les conditions

Les conditions utilises dans les instructions while et if peuvent contenir dautres oprateurs en dehors des comparaisons. Les oprateurs de comparaison in et not in vrient si une valeur apparat (ou non) dans une squence. Les oprateurs is et is not vrient si deux objets sont rellement le mme objet ; cela se justie seulement pour les objets modiables comme les listes. Tous les oprateurs de comparaison ont la mme priorit, qui est plus faible que celle de tous les oprateurs numriques. Les comparaisons peuvent tre enchanes. Par exemple, a < b == c teste si a est strictement infrieur b et de plus si b est gal c. Les comparaisons peuvent tre combines avec les oprateurs Boolens and (et) et or (ou), et le rsultat dune comparaison (ou de nimporte quel autre expression Boolenne) peut tre invers avec not (pas). Ces oprateurs ont encore une fois une priorit infrieure celle des oprateurs de comparaison ; et entre eux, not a la plus haute priorit, et or la plus faible, de sorte que A and not B or C est quivalent (A and (not B)) or C. Bien sr, les parenthses peuvent tre utilises pour exprimer les compositions dsires. Les oprateurs Boolens and et or sont des oprateurs dits court-circuit : leurs arguments sont valus de gauche droite, et lvaluation sarrte ds que le rsultat est trouv. Par exemple, si A et C sont vrais mais que B est faux, A and B and C nvalue pas lexpression C. En gnral, la valeur de retour dun oprateur court-circuit, quand elle est utilise comme une valeur gnrale et non comme un Boolen, est celle du dernier argument valu. Il est possible daffecter le rsultat dune comparaison ou une autre expression Boolenne une variable. Par exemple,>>> chaine1, chaine2, chaine3 = , Trondheim, Hammer Dance >>> non_null = chaine1 or chaine2 or chaine3 >>> non_null Trondheim

Notez quen Python, au contraire du C, les affectations ne peuvent pas tre effectues lintrieur des expressions. Les programmeurs C ronchonneront peut-tre, mais cela vite une classe de problmes quon rencontre dans les programmes C : crire = dans une expression alors quil fallait ==.

5.8

Comparer les squences et dautres types

Les objets de type squence peuvent tre compars dautres objets appartenant au mme type de squence. La comparaison utilise lordre lexicographique : les deux premiers lments sont dabord compars, et sils diffrent cela dtermine le rsultat de la comparaison ; sils sont gaux, les deux lments suivants sont compars, et ainsi de suite, jusqu ce que lune des deux squences soit puise. Si deux lments comparer sont eux-mmes des squences du mme type, la comparaison lexicographique est reconsidre rcursivement. Si la comparaison de tous les lments de deux squences les donne gaux, les squences sont considres comme gales. Si une squence est une sous-squence initiale de lautre, la squence la plus courte est la plus petite (infrieure). Lordonnancement lexicographique pour les chanes utilise lordonnancement ASCII pour les caractres. Quelques exemples de comparaisons de squences du mme type : 5.7. Plus de dtails sur les conditions 43

(1, 2, 3) < (1, 2, 4) [1, 2, 3] < [1, 2, 4] ABC < C < Pascal < Python (1, 2, 3, 4) < (1, 2, 4) (1, 2) < (1, 2, -1) (1, 2, 3) == (1.0, 2.0, 3.0) (1, 2, (aa, ab)) < (1, 2, (abc, a), 4)

Notez que la comparaison dobjets de types diffrents est licite. Le rsultat est dterministe mais arbitraire : les types sont tris selon leur nom. Ainsi une liste (list) est toujours infrieure une chane (string), une chane (string) est toujours infrieure un n-uplet (tuple), etc. Les types numriques mlangs sont compars en fonction de leur valeur numrique, ainsi 0 est gal 0.0, etc.1

1 On ne doit pas se er aux rgles de comparaison pour des objets de types diffrents ; elles pourraient changer dans une version ultrieure du langage.

44

Chapitre 5. Structures de donnes

CHAPITRE

SIX

ModulesSi vous quittez linterprteur de Python et le lancez nouveau, les dnitions que vous avez faites (fonctions et variables) sont perdues. Par consquent, si vous voulez crire un programme plus long, vous feriez mieux dutiliser la place un diteur de texte pour prparer le source pour linterprteur et de le lancer avec ce chier comme entre. Cela sappelle crer un script. Quant votre programme devient plus long, vous pouvez vouloir le couper en plusieurs chiers pour une maintenance plus facile. Vous pouvez galement vouloir utiliser dans plusieurs programmes une fonction pratique que vous avez crite sans copier sa dnition dans chaque programme. Pour supporter cela, Python offre un moyen de mettre des dnitions dans un chier et de les utiliser dans un script ou dans un session interactive de linterprteur. Un tel chier sappelle un module ; les dnitions dun module peuvent tre importes dans un autre module ou dans le module principal (la collection de variables laquelle vous avez accs dans un script excut depuis le plus haut niveau et dans le mode calculatrice). Un module est un chier contenant des dnitions et des instructions Python. Le nom de chier est le nom du module auquel est ajout le sufxe .py. Dans un module, le nom du module (comme chane de caractres) est disponible comme valeur de la variable globale __name__. Par exemple, employez votre diteur de texte prfr pour crer un chier appel bo.py dans le rpertoire courant avec le contenu suivant :# Module nombres de Fibonacci def fib(n): # crit la srie de Fibonacci jusqu n a, b = 0, 1 while b < n: print b, a, b = b, a+b def fib2(n): # retourne la srie de Fibonacci jusqu n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result

Maintenant lancez linterprteur Python et importez ce module avec la commande suivante :>>> import fibo

Cela ncrit pas les noms des fonctions dnies dans fibo directement dans la table de symboles actuelle ; cela y insre seulement le nom de module fibo. En utilisant le nom de module vous pouvez accder aux fonctions :

45

>>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ fibo

si vous avez lintention dutiliser souvent une fonction, vous pouvez laffecter un nom local :>>> fib = fibo.fib >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377

6.1

Encore plus sur les modules

Un module peut contenir des instructions excutables aussi bien que des dnitions de fonction. Ces instructions sont destines initialiser le module. On les excute seulement la premire fois que le module est import quelque part.1 Chaque module a sa propre table de symboles prive, qui est utilise comme table de symbole globale par toutes les fonctions dnies dans le module. Ainsi, lauteur dun module peut utiliser des variables globales dans le module sans sinquiter des dsaccords accidentels avec les variables globales dun utilisateur. Dautre part, si vous savez que ce que vous faites, vous pouvez accder aux variables globales dun module avec la mme notation que celle employe pour se rfrer ses fonctions, nommodule.nomelem. Les modules peuvent importer dautres modules. Il est dusage mais pas obligatoire de placer toutes les instructions import au dbut dun module (ou dun script). Les noms du module import sont placs dans la table globale de symboles du module importateur. Il y a une variante de linstruction import qui importe des noms dun module directement dans la table de symbole