Introduction Je fus enthousiasmé lorsque mon éditeur me demanda d’écrire un ouvrage de la collection "Guide de survie" consacré au langage Python. Ce livre est l’un des plus courts que j’ai écrits, mais il a été pourtant l’un des plus ardus à rédiger. Le principe des guides de survie est de présenter au lecteur des techniques significatives d’un langage. Le Guide de survie Python a été conçu pour mettre à votre disposition des techniques Python qui ont du sens, donc faciles à comprendre, et que vous utiliserez pour vous lancer rapidement dans la programmation d’applications en langage Python. Le contenu de cet ouvrage est fondé sur Python 3. Gardez à l’esprit le fait que le langage Python est évolutif. Je vous recommande la visite du site web Python à l’adresse http://python.org (en anglais) où vous trouverez de la documentation en ligne, des extensions, et où vous serez informé de tous les changements. Cet ouvrage n’est ni un manuel de référence, ni un guide englobant la totalité du langage, car ce ne sont pas là ses finalités. Il a pour vocation d’être un livret compact, accessible, fournissant rapidement et facilement une référence tandis que vous découvrez de nouveaux aspects du langage. © 2013 Pearson France – Python 3 – Brad Dayley 4 Introduction En concevant ce livre, je me suis efforcé de relever les techniques les plus pertinentes et les plus intéressantes qui aideront réellement les programmes à accomplir les tâches que l’on attend d’eux en pratique. Les commentaires sont les bienvenus, de même que les suggestions de techniques méritant d’être ajoutées à ce livre. Info Presque tous les modèles de code utilisés dans ce livre proviennent de véritables fichiers de travail. Pour votre commodité, les scripts Python, les scripts CGI et les documents HTML et XML montrés en exemple dans les techniques de ce livre sont téléchargeables depuis le site web de l’éditeur Pearson. Pour accéder aux fichiers rapidement, saisissez dans la zone de recherche les quatre chiffres du début du numéro ISBN de l’ouvrage : 2588. Nous espérons que vous apprécierez les techniques de ce livre, et qu’elles vous seront utiles. © 2013 Pearson France – Python 3 – Brad Dayley 1 Rappels généraux sur Python Python est un puissant langage de programmation orienté objets. Il a des similarités avec des langages de script comme Perl, Scheme et TCL, ainsi qu’avec d’autres langages comme Java et C. Ce chapitre propose un rapide aperçu du langage Python afin de vous permettre de mieux comprendre les chapitres qui suivent. Il ne vise pas à l’exhaustivité, mais constitue un rappel de ce qu’est ce langage. Il vous fournit les bases qui vous permettront de vous référer à la documentation Python. La version 3 de Python constitue une évolution importante du langage qui a été l’occasion d’un nettoyage en profondeur et de choix déterminants pour l’avenir, comme le basculement vers Unicode de toutes les représentations de chaînes de caractères. © 2013 Pearson France – Python 3 – Brad Dayley 6 CHAPITRE 1 Rappels généraux sur Python Pourquoi programmer en Python ? Il existe plusieurs bonnes raisons d’adopter Python. C’est l’un des langages les plus faciles à appréhender et utiliser rapidement, tout en étant extrêmement puissant pour des applications plus ambitieuses.Voici quelques-uns des points forts de Python : • La portabilité : Python tourne sur presque tous les systèmes d’exploitation, dont Linux/UNIX, Windows, Mac, OS/2 et d’autres. • L’intégration : Python peut s’intégrer aux objets COM, .NET et CORBA. Il existe une implémentation Jython permettant d’utiliser Python sur n’importe quelle plate-forme Java, et une implémentation IronPython qui permet aux programmeurs Python d’accéder aux bibliothèques .NET. Python peut aussi contenir du code C ou C++ intégré. • La facilité : il est très facile de s’initier à Python, monter en puissance et programmer des applications Python. La syntaxe claire et lisible facilite considérablement la création des programmes et leur débogage. • La puissance : de nouvelles extensions sont écrites régulièrement pour Python, notamment dans le domaine de l’accès aux bases de données, l’édition audio et vidéo, les interfaces graphiques utilisateur, le développement pour le Web, etc. • Le dynamisme : Python est l’un des langages de programmation les plus souples. Il est très facile de faire preuve de créativité avec le code, pour résoudre des problèmes de conception et de développement. • C’est un langage ouvert : Python est un langage Open Source. Il peut de ce fait être librement utilisé et distribué. © 2013 Pearson France – Python 3 – Brad Dayley Appeler l’interpréteur Appeler l’interpréteur Les scripts Python sont exécutés par un interpréteur Python. Sur la plupart des systèmes, vous pouvez le démarrer en tapant la commande python à l’invite de la console. Cette commande peut toutefois varier selon le système et l’environnement de développement que vous avez configuré1. Cette section évoque les méthodes standard pour appeler l’interpréteur et lui faire exécuter les instructions Python et les fichiers de script. Si vous appelez l’interpréteur sans lui fournir un fichier de script en paramètre, l’invite suivante s’affiche : Python 3.3.1 (v3.3.1:d9893d13c628, Apr 6 2013, 20:25:12) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> L’invite de Python est indiquée par les trois chevrons >>>. Si vous exécutez une commande exigeant une saisie supplémentaire, une invite en points de suspension ... s’affiche. À l’invite de l’interpréteur, vous pouvez exécuter des instructions Python au coup par coup, comme : >>> print("Affichage d’une chaîne") Affichage d’une chaîne L’appel de l’interpréteur avec un paramètre de script, comme nous le verrons plus loin, démarre l’exécution du script qui se poursuit jusqu’à ce qu’il soit terminé. Le script achevé, l’interpréteur n’est plus actif. Dans l’exemple suivant, l’invite de ligne de commande correspond à mon­ linux:/livre # ; la saisie commence au mot python : monlinux:/livre # python script.py Exécution d’un script monlinux:/livre # 1.N.d.T. : Pour plus de confort, nous vous invitons à adopter un atelier de développement, par exemple celui nommé IDLE.Vous disposez ainsi de l’interpréteur dans une fenêtre avec des menus pour les commandes principales (ouvrir un fichier source, lancer l’exécution, etc.). © 2013 Pearson France – Python 3 – Brad Dayley 7 8 CHAPITRE 1 Rappels généraux sur Python On peut aussi exécuter les scripts depuis l’intérieur de l’interpréteur en recourant à la fonction Python exec(open(nom­ fic).read()). L’exemple suivant montre un script démarré ainsi : >>> exec(open(“script.py”).read()) Exécution d’un script >>> Note La fonction execfile n’existe plus en Python 3. Utilisez la syntaxe ci-dessus. Types de données prédéfinis (intégrés) Les types intégrés que vous utiliserez le plus fréquemment dans Python peuvent être groupés dans les catégories que répertorie le Tableau 1.1. La colonne Nom du type indique le nom associé à chaque type d’objet intégré tel qu’il est renvoyé par la fonction isinstance(objet, nomtype) comme suit : >>> s = "Une simple chaîne" >>> print(isinstance(s, str)) True >>> print(isinstance(s, dict)) False >>> Info Le module type doit être importé pour utiliser n’importe quel type d’objet comme type et types.ModuleType. Les types basestring, xrange et long n’existent plus dans Python 3. © 2013 Pearson France – Python 3 – Brad Dayley Types de données prédéfinis (intégrés) Tableau 1.1 : Les types intégrés Python courants Catégorie du type Nom du type Description None types.NoneType Objet None (objet nul) Nombres bool Booléen True (vrai) ou False (faux) int Entier (le type long a disparu en Python 3) float Point flottant complex Nombre complexe set Ensemble modifiable frozenset Ensemble immuable str Chaîne de caractères unicode Chaîne de caractères Unicode list Liste range Séquence immuable tuple Tuple Liste associative dict Dictionnaire Fichiers file Type pour tous les intégrés object Parent de tous les types et classes Ensembles Séquences types.Builtin FunctionType Fonction intégrée types.Builtin MethodType Méthode intégrée types.FunctionType Fonction définie par le programmeur types.InstanceType Instance de classe types.MethodType Méthode liée © 2013 Pearson France – Python 3 – Brad Dayley 9 10 CHAPITRE 1 Rappels généraux sur Python Catégorie du type Nom du type Description types.Unbounded Méthode non liée Modules types.ModuleType Module Classes object Parent de toutes les classes Type type Type de tous les modules intégrés None Le type None équivaut à un objet nul, dépourvu de valeur. Le type None est le seul objet, dans Python, pouvant être un objet nul. Utilisé dans un programme, sa syntaxe se réduit à None. Nombres Dans Python, les types numériques sont sans détour. Le type bool peut avoir deux valeurs True (vrai) et False (faux). Le type int stocke en interne des nombres entiers jusqu’à la capacité du processeur (int remplace le type long qui disparaît en Python 3). Le type float utilise la double précision native pour stocker des chiffres en point flottant jusqu’à 64 bits. Le type complex stocke des valeurs sous la forme de paires de chiffres à point flottant. Les diverses valeurs sont accessibles en utilisant les attributs z.real et z.imag de l’objet complexe. Ensembles (set) Le type set représente un ensemble non ordonné d’éléments uniques. Il existe deux types d’ensembles : modifiables, et non modifiables. Dans les ensembles modifiables © 2013 Pearson France – Python 3 – Brad Dayley Types de données prédéfinis (intégrés) – on dit aussi "mutables" –, des éléments peuvent être ajoutés ou ôtés. Les ensembles non modifiables, ou "immutables", ne peuvent pas être changés après leur création. Info Tous les éléments placés dans un ensemble doivent être de type non modifiable. C’est pourquoi les ensembles ne peuvent pas contenir des éléments comme des listes ou des dictionnaires. Ils peuvent cependant comprendre des éléments comme des chaînes et des tuples. Séquences (str et list) Il existe plusieurs types de séquences dans Python. Les séquences sont ordonnées et peuvent être indexées par des entiers non négatifs. Les séquences sont faciles à manipuler et peuvent être faites de quasi n’importe quel objet Python. Les deux types de séquences les plus utilisés sont les chaînes str et les listes. Le Chapitre 2 explique la création et l’utilisation des types "chaîne". Le Chapitre 3 présente les types de séquences les plus communes et explique comment les créer et les manipuler. Listes associatives (dict) La liste associative associe deux collections d’objets. La première est un ensemble d’objets clés qui indexent la seconde collection contenant un ensemble d’objets ayant une valeur. Chaque objet "clé" indexe un objet "valeur" spécifique dans l’ensemble corrélé. L’objet clé doit être de type non modifiable. L’objet ayant une valeur peut être presque n’importe quel objet Python. Le dictionnaire est le seul type "liste associative" actuellement intégré à Python. Le Chapitre 3 donne un exemple de création et d’utilisation d’un dictionnaire. © 2013 Pearson France – Python 3 – Brad Dayley 11 3 Gestion des types de données Parmi les types de données prédéfinis de Python, certains sont simples (atomiques) comme int et float, et d’autres sont complexes, c’est-à-dire qu’une variable complexe contient plusieurs valeurs simples. C’est le cas des chaînes et les dictionnaires. Les trois types complexes que vous devrez assimiler et que vous utiliserez le plus souvent pour gérer des données sont la liste, le tuple et le dictionnaire. Pour Python, une liste est simplement un ensemble ordonné d’objets. Les objets peuvent être nommés avec n’importe quel nom admis par Python, et la liste peut grandir dynamiquement afin de supporter l’ajout de nouveaux objets. Les objets d’une liste peuvent être de différents types et Python gardera en arrière-plan la trace du type de données des objets. Les listes sont des séquences ordonnées. Les éléments d’une liste sont accessibles en utilisant un index entier non négatif basé zéro (le premier élément est à la position zéro). © 2013 Pearson France – Python 3 – Brad Dayley 58 CHAPITRE 3 Gestion des types de données Un tuple n’est, dans un sens, que la version en lecture seule d’une liste. C’est aussi une séquence d’objets ordonnés, mais un tuple est non modifiable : il est impossible d’ajouter ou d’ôter un élément. Un dictionnaire est un ensemble non ordonné de paires d’objets. Chaque paire est constituée d’un objet clé et d’un objet valeur. Un dictionnaire fonctionne à la manière d’une table de hachage, dans la mesure où la clé sert à accéder à un objet valeur. Un dictionnaire n’est pas ordonné ; de ce fait, aucune méthode d’indexation ne permet d’accéder aux éléments. Ce chapitre étudie les techniques servant à gérer les données à l’aide des types de données liste, tuple et dictionnaire. Définition d’une liste numList = [2000, 2003, 2005, 2006] stringList = ["Code", "Python", "Essentiel"] mixedList = [1, 2, "trois", 4] subList = ["Python", "Guide", ["Copyright", 2006]] listList = [numList, stringList, mixedList, subList] Définir une liste se réduit à lister entre crochets droits un certain nombre d’objets Python pour les affecter à un nom de variable avec l’opérateur =. La liste peut contenir n’importe quelle sorte d’objet Python. Une simple liste numérique équivaut à un tableau ; les listes sont toutefois plus dynamiques, et plusieurs types peuvent cohabiter au sein d’une même liste. L’exemple de code suivant montre comment créer des listes aussi bien homogènes qu’hétérogènes. Remarquez que les listes acceptent des nombres, des chaînes, des définitions de listes et des noms de variables. © 2013 Pearson France – Python 3 – Brad Dayley Définition d’une liste print("=== 0301_deflist.py ===") numList = [2000, 2009, 2020, 2038] stringList = ["Code", "Python", "Essentiel"] mixedList = [1, 2, "trois", 4] subList = ["Python", "Guide", ["Copyright", 2013]] listeGlobale = [numList, stringList, mixedList, subList] for x in listeGlobale: for y in x: if isinstance(y, int): print(“Numérique : “ + str(y+1)) if isinstance(y, str): print(“Chaîne : “ + y) 0301_def_list.py === 0301_deflist.py === Numérique : 2001 Numérique : 2010 Numérique : 2021 Numérique : 2039 Chaîne : Code Chaîne : Python Chaîne : Essentiel Numérique : 2 Numérique : 3 Chaîne : trois Numérique : 5 Chaîne : Python Chaîne : Guide Exécution du script © 2013 Pearson France – Python 3 – Brad Dayley 59 60 CHAPITRE 3 Gestion des types de données Accès au contenu d’une liste for x in numList: print(x+1) print(stringList[0] + ‘ ‘ + stringList[1] + ‘ ‘ + \ stringList[2]) print(stringList[-2]) if isinstance(subList, list): print(subList[2][0]) La liste définie, l’accès à ses éléments s’effectue par un index basé sur zéro. Le premier élément de la liste est à l’index 0, le deuxième à l’index 1, et ainsi de suite. L’exemple de code acc_list.py montre comment accéder à tous les éléments d’une liste ordonnée en utilisant le mot clé for et aussi comment accéder en particulier à chacun des éléments de la liste. Si un élément de la liste est un objet liste, vous accédez aux éléments de cette liste en plaçant des crochets d’indexation à la fin, comme si vous vouliez accéder aux éléments d’un tableau multidimensionnel. Info Python autorise l’usage d’index négatifs pour accéder à la liste par la fin plutôt que par le début. Par exemple, pour accéder à l’élément final d’une liste, vous utiliserez un index de ‑1. Et pour accéder à l’avant-dernier élément de la liste, vous utiliserez un index de ‑2, et ainsi de suite. Ceci peut être extrêmement utile sur une liste dynamique changeant constamment. print("=== 0302_acclist.py ===") numList = [2000, 2010, 2015, 2026] stringList = ["Code", "Python", "Essentiel"] mixedList = [1, 2, "trois", 4] subList = ["Python", "Guide", ["Copyright", 2013]] © 2013 Pearson France – Python 3 – Brad Dayley Fractionnement d’une liste # Tous les éléments for x in numList: print(x+100) # Eléments spécifiques print(stringList[0] + ‘ ‘ + stringList[1] + ‘ ‘ + stringList[2]) # Index négatifs print(stringList[-2]) # Accès aux éléments d’une sous-liste if isinstance(subList, list): print(subList[2][0]) 0302_acc_list.py === 0302_acclist.py === 2100 2110 2115 2126 Code Python Essentiel Python Copyright Exécution du script Fractionnement d’une liste moitie1 = listeMois[ : nbrDemi] moitie2 = listeMois[nbrDemi : ] nbrMots = len(moitie1) debutMilieu = nbrMots/2 moitieMilieu = listeMois[debutMilieu : debutMilieu+nbrDemi] © 2013 Pearson France – Python 3 – Brad Dayley 61 62 CHAPITRE 3 Gestion des types de données Une tranche (slice) est un sous-ensemble d’une liste. Python fournit une syntaxe permettant d’extraire rapidement des tranches spécifiques d’une liste. Une tranche peut être obtenue en référençant la liste et en spécifiant deux index intérieurs (séparés par un signe deuxpoints) qui pointent entre des caractères, au lieu d’un seul numéro d’index. Le numéro du premier index représente l’élément de début, dans la liste, tandis que le second index représente l’élément de fin. La tranche est renvoyée en tant que liste. L’accès à une tranche s’effectue donc comme pour toute autre liste. Info Python autorise les indices négatifs pour indexer à partir de la fin plutôt que depuis le début. Par exemple, pour accéder aux trois derniers éléments d’une liste, vous utiliserez les index ‑3 et ‑1. print("=== 0303_slice_list.py ===\n") listeMois = ["Janvier", "Février", "Mars", "Avril", \ "Mai", "Juin", "Juillet", "Août", \ "Septembre", "Octobre", "Novembre", "Décembre"] nbrMots = len(listeMois) nbrDemi = int(nbrMots/2) print("Indice de la moitié :", nbrDemi) #Tranche de début moitie1 = listeMois[ : nbrDemi] print(moitie1) #Tranche de fin moitie2 = listeMois[nbrDemi : ] print("\nSeconde moitié de liste :") print(moitie2) © 2013 Pearson France – Python 3 – Brad Dayley Fractionnement d’une liste #Tranche du milieu nbrMots = len(moitie1) debutMilieu = int(nbrMots/2) moitieMilieu = listeMois[debutMilieu : debutMilieu+nbrDemi] print("\nPartie centrale de liste :") print(moitieMilieu) #Index négatifs print("\nIndex de liste négatifs :") print((listeMois[-5 : -1])) 0303_slice_list.py === 0303_slice_list.py === Indice de la moitié : 6 [‘Janvier’, ‘Février’, ‘Mars’, ‘Avril’, ‘Mai’, ‘Juin’] Seconde moitié de liste : [‘Juillet’, ‘Août’, ‘Septembre’, ‘Octobre’, ‘Novembre’, ‘Décembre’] Partie centrale de liste : [‘Avril’, ‘Mai’, ‘Juin’, ‘Juillet’, ‘Août’, ‘Septembre’] Index de liste négatifs : [‘Août’, ‘Septembre’, ‘Octobre’, ‘Novembre’] Exécution du script © 2013 Pearson France – Python 3 – Brad Dayley 63