04.11.2014 Views

Cours 4 - IA

Cours 4 - IA

Cours 4 - IA

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Didier MARIN<br />

marin@isir.upmc.fr<br />

Informatique générale 1<br />

—<br />

<strong>Cours</strong> n o 4<br />

GM3 — 2012-2013


1<br />

Chaînes de<br />

caractères


Chaînes de caractères<br />

Une chaîne de caractères (string) est<br />

une suite de caractères<br />

définie en commençant par ” et en finissant par ”<br />

un type de données (au même titre que booléen, entier, liste,<br />

etc.)<br />

"Python␣pour␣tous", "Fashion␣week", "Creative␣Commons<br />

", "nappage␣au␣chocolat"<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 3/36


Opérations<br />

L’opérateur + permet de concaténer deux chaînes de caractères<br />

(uniquement)<br />

>>> print "il␣fait␣beau"+ "␣et␣chaud!"<br />

il faut beau et chaud<br />

Mais, comme pour les listes, on peut aussi utiliser la multiplication<br />

>>> print ("ainsi␣"+ "font,␣"*3)*2 + "les␣petites␣<br />

marionnettes"<br />

ainsi font, font, font, ainsi font, font, font, les<br />

petites marionnettes<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 4/36


Lien avec les listes<br />

On peut quasiment considérer les chaînes de caractères en Python<br />

comme des listes de caractères.<br />

accès à un élément grâce à son indice et [ ]<br />

opérateur in<br />

itération avec for in<br />

certaines méthodes de listes utilisables sur les chaînes<br />

Une différence essentielle est qu’une liste est modifiable alors<br />

qu’une chaîne ne l’est pas.<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 5/36


Indices<br />

On peut accéder directement à un caractère d’une chaîne S en<br />

indiquant sa position dans la chaîne :<br />

l’élément S[0] est le 1er caractère<br />

l’élément S[n-1] est le dernier caractère, si n est la taille de<br />

la chaîne<br />

l’élément S[-1] est le dernier caractère (pas besoin de<br />

connaître la taille de la chaîne)<br />

l’élément S[-2] est l’avant-dernier caractère<br />

...<br />

>>> S = "Python"<br />

>>> print S[1]<br />

y<br />

>>> print S[-1]<br />

n<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 6/36


Indices<br />

Il n’est pas possible de modifier une lettre de la chaîne.<br />

>>> S = "Python"<br />

>>> S[1] = "i"<br />

TypeError: ’str’ object does not support item<br />

assignment<br />

Par contre, on pourra construire de nouvelles chaînes de caractères,<br />

à partir d’autres, avec une modification.<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 7/36


Slices<br />

En fait, on peut accéder à plus qu’un élément avec l’opérateur [ ]<br />

(tranche d’indices)<br />

S[i:j]<br />

Donne la sous-chaîne de S commençant du caractère n°i au<br />

caractère n°j (j exclus)<br />

S[i:]<br />

Donne la sous-chaîne de S commençant du caractère n°i<br />

jusqu’à la fin de la chaîne<br />

S[:j]<br />

Donne la sous-chaîne de S commençant au début de S<br />

jusqu’au caractère n°j (j exclus)<br />

S[i:j:k]<br />

Donne la sous-chaîne de S commençant du caractère n°i au<br />

caractère n°j (j exclus) par pas de k<br />

On retrouve le même principe que pour range(i,j,l)<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 8/36


Slices<br />

>>> S = "L’ordinateur␣a␣l’intelligence␣de␣celui␣qui␣s<br />

’en␣sert."<br />

>>> S[2:12]<br />

ordinateur<br />

>>> S[33:]<br />

celui qui s’en sert<br />

>>> S[:29]<br />

L’ordinateur a l’intelligence<br />

>>> S[2:12:2]<br />

odntu<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 9/36


Longueur d’une chaîne<br />

De même que pour une liste, la fonction len permet de connaître<br />

la longueur (nombre de caractères) d’une chaîne<br />

>>> prenom = " Guilhem "<br />

>>> print "le␣ prénom ␣" + prenom + "␣ contient<br />

␣" + str ( len ( prenom )) + "␣ lettres "<br />

le prénom Guilhem contient 7 lettres<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 10/36


for in<br />

De même que pour les listes, la boucle for in permet d’itérer sur<br />

tous les caractères d’une chaîne de caractères<br />

>>> S = " azertyuiop "<br />

>>> S2 = ""<br />

>>> for c in S:<br />

... S2 = S2 + c*2<br />

>>> print S2<br />

aazzeerrttyyuuiioopp<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 11/36


Opérateur in<br />

Un peu comme pour les listes, l’opérateur in permet de savoir si<br />

une chaîne de caractères est inclue dans une autre<br />

>>> S = "saperlipopette"<br />

>>> "li"in S<br />

True<br />

>>> "lipa"in S<br />

False<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 12/36


Méthodes<br />

Les méthodes de listes qui ne modifient pas les listes existent aussi<br />

pour les chaînes de caractères.<br />

count<br />

s.count( sub, start, end)<br />

Compte le nombre d’occurrences de la chaîne sub dans s.<br />

start et end sont facultatifs, et correspondent aux indices de<br />

début et de fin où il faut chercher/compter la chaîne sub<br />

>>> S = (" ainsi ␣" + "font ,␣" *3) *2 + " les ␣<br />

petites ␣ marionnettes "<br />

>>> print S. count (" font ")<br />

6<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 13/36


Majuscules/minuscules<br />

D’autres méthodes existent.<br />

Les méthodes lower et upper renvoient une chaîne de caractères<br />

en minuscule ou en majuscule.<br />

>>> S = "toTolitOtO".upper()<br />

>>> print S<br />

TOTOLITOTO<br />

>>> T = S.lower()<br />

>>> print T<br />

totolitoto<br />

>>> print S<br />

TOTOLITOTO<br />

Il y a d’autres méthodes de même type (title, swapcase, etc.).<br />

Pour les méthodes qui renvoient une chaîne de caractères, il est<br />

possible d’enchaîner les méthodes<br />

>>> print "the␣big␣bang␣theory".title().swapcase()<br />

tHE bIG bANG tHEORY<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 14/36


Majuscules/minuscules<br />

Certaines méthodes indiquent si une propriété est vraie ou non.<br />

Les méthodes isupper et islower indiquent si tous les caractères<br />

de la chaîne sont en majuscule ou en minuscule.<br />

>>> S = "toTolitOtO"<br />

>>> S.islower()<br />

False<br />

>>> S.islower()<br />

False<br />

>>> S = "totolitoto"<br />

>>> S.islower()<br />

True<br />

Les méthodes isalpha, isdigit et isalnum indique si les chaîne<br />

contient uniquement des caractères alphabétiques, numériques ou<br />

alphanumériques, respectivement.<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 15/36


Méthode replace<br />

Pour remplacer un bout de chaîne par une autre, il faut utiliser la<br />

méthode replace. Celle-ci renvoie une nouvelle chaîne de<br />

caractères où une séquence de caractères est remplacée par une<br />

autre<br />

replace<br />

s.replace( old, new)<br />

Renvoie une chaîne de caractères où les séquences old sont<br />

remplacées par new<br />

>>> S = "toTolitOtO"<br />

>>> T = S.replace("o","O")<br />

>>> print T,S<br />

tOTOlitOtO toTolitOtO<br />

>>> "Pierre␣a␣tout␣bu".replace("Pierre","Paul").<br />

replace("bu","mangé")<br />

Paul a tout mangé<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 16/36


Liens avec les listes<br />

Si L est une liste de chaînes de caractères, il est possible de<br />

produire une chaîne de caractères unique en les concaténant.<br />

La méthode join permet de rassembler tous les items d’une liste<br />

de chaines. Elle s’applique sur une chaine de caractères décrivant le<br />

terme séparateur.<br />

>>> L = [ "il", "fait", "beau", "!"]<br />

>>> print "␣".join(L)<br />

il fait beau !<br />

>>> "/".join( [ "26","12","2011"])<br />

26/12/2011<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 17/36


Liens avec les listes<br />

De manière symétrique, il est possible de découper une chaîne de<br />

caractères en fonction d’un séparateur, et de produire une liste de<br />

chaînes de caractères.<br />

La méthode split permet de séparer une chaîne en liste.<br />

>>> S = "il␣fait␣beau␣!"<br />

>>> print S.split("␣")<br />

[ "Il", "fait", "beau", "!" ]<br />

>>> personne = "Galois,Évariste<br />

,25/10/1811,31/05/1832,Bourg-la-reine"<br />

>>> elt = personne.split(",")<br />

[ "Galois", "Évariste", "25/10/1811", "31/05/1832",<br />

"Bourg-la-reine" ]<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 18/36


Exercice<br />

On considère une chaîne de caractères S sous la forme<br />

jj/mm/aaaa.<br />

Afficher (sous la même forme) la date qu’il fera 6 mois plus tard.<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 19/36


Exercice<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 20/36


Opérateur de formatage<br />

L’opérateur de formatage (%) permet de convertir des marqueurs<br />

disposés dans la chaîne en des valeurs fournies à la suite.<br />

>>> toto = "Py%son"%"th"<br />

>>> print toto<br />

Python<br />

>>> tata = "x=%d,␣y=%d"%(12,14)<br />

>>> print tata<br />

x=12, y=14<br />

À chaque expression précédée d’un %, appelé marqueur de<br />

formatage, doit correspondre une valeur de formatage fournie.<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 21/36


Opérateur de formatage<br />

L’expression est de la forme %c où c est un caractère qui détermine<br />

le type de valeur :<br />

%d : entier décimal signé<br />

%u : entier décimal non signé<br />

%e ou %E : valeur sous notation scientifique<br />

%f : nombre flottant<br />

%c : un seul caractère<br />

%s : chaîne de caractères<br />

%% : permet d’utiliser le caractère % dans une chaîne formatée<br />

etc.<br />

Il est aussi possible de préciser le nombre de caractères que l’on<br />

veut afficher (entier) ou la précision (réel)<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 22/36


Opérateur de formatage<br />

>>> taux_euro = 1.3729<br />

>>> prix_euro = 12<br />

>>> print "%f␣euros␣donne␣%f␣dollars"%(prix_euro,<br />

prix_euro*taux_euro)<br />

12.000000 euros donne 16.474800 dollars<br />

>>> print "%.2f␣euros␣donne␣%.2f␣dollars"%(prix_euro,<br />

prix_euro*taux_euro)<br />

12.00 euros donne 16.47 dollars<br />

>>> print "%s␣donne␣%d␣roses␣à␣%s"%("Henry",3,"Anaïs"<br />

)<br />

Henry donne 3 roses à Anaïs<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 23/36


Exercice<br />

Écrire un programme qui demande un nombre de départ, et qui<br />

ensuite écrit la table de multiplication de ce nombre, présentée<br />

comme suit (cas où l’utilisateur entre le nombre 7) :<br />

Table de 7 :<br />

7 x 1 = 7<br />

7 x 2 = 14<br />

7 x 3 = 21<br />

?<br />

7 x 10 = 70<br />

À faire sans et avec l’opérateur de formatage.<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 24/36


Exercice<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 25/36


Exercice<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 26/36


2<br />

Lecture/écriture<br />

dans un fichier


Fichiers<br />

Jusqu’à présent, nous n’avons travaillé que sur des données<br />

rentrées par l’utilisateur (raw_input).<br />

Évidemment, un programme doit être capable d’aller chercher des<br />

informations dans un fichier (fichier texte par exemple) et écrire<br />

des résultats dans un (autre) fichier.<br />

Python propose un objet Fichier et un ensemble de méthodes pour<br />

lire et écrire dans un fichier<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 28/36


Ouverture/Fermeture<br />

On commence par ouvrir un fichier pour pouvoir le lire.<br />

Cela se fait avec la fonction open qui renvoie un objet de type<br />

file. open prend le nom du fichier en paramètre, ainsi qu’un<br />

indicateur du mode de lecture/écriture, et renvoie un fichier<br />

que l’on pourra lire.<br />

fichier = open( "toto.txt", "r")<br />

L’indicateur peut être égal à "r" pour y accéder en mode<br />

lecture.<br />

fichier est maintenant une variable (un objet) sur lequel on<br />

pourra appliquer des méthodes permettant de lire et/ou écrire<br />

dans ce fichier.<br />

Une fois utilisé, on ferme le fichier en appelant la méthode<br />

close de ce fichier<br />

fichier.close()<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 29/36


Ouverture/Fermeture<br />

Si le fichier n’existe pas, la tentative d’ouverture du fichier va<br />

provoquer une erreur ! (IOError).<br />

On peut traiter cela avec un bloc try-except :<br />

try :<br />

fichier = open (" toto . txt ", "r")<br />

# ... Opérations sur le fichier ...<br />

fichier . close ()<br />

except :<br />

print " Impossible ␣d’ouvrir ␣le␣ fichier ␣!"<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 30/36


Lecture<br />

Pour lire un fichier, il existe de nombreuses méthodes<br />

readlines permet de lire tout le fichier d’un coup, et renvoie<br />

une liste avec toutes les lignes du fichier<br />

>>> lignes = fichier.readlines()<br />

>>> print lignes<br />

[ "riri", "fifi", "loulou" ]<br />

Attention aux sauts de ligne (\n) à la fin de chaque ligne !<br />

Pour les éliminer on peut utiliser la méthode rstrip :<br />

>>> s = "riri\n"<br />

>>> s = s.rstrip()<br />

(élimine aussi les espaces et tabulations se trouvant à la fin)<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 31/36


Lecture<br />

read permet de lire tout le fichier d’un coup, et renvoie une<br />

liste avec toutes les lignes du fichier<br />

>>> lignes = fichier.read()<br />

>>> print lignes<br />

riri<br />

fifi<br />

loulou<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 32/36


Lecture ligne par ligne<br />

readline (sans le s) permet de lire une ligne du fichier. À<br />

chaque appel à readline, une nouvelle ligne est lue (il faut<br />

donc itérer la lecture jusqu’à ce que la ligne soit vide)<br />

ligne = " init "<br />

while ligne != "":<br />

ligne = fichier . readline ()<br />

print ligne<br />

itération avec for in : permet d’itérer sur le fichier ligne par<br />

ligne<br />

for ligne in fichier :<br />

print ligne<br />

Cette méthode est de loin la plus préférable !<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 33/36


Exercice<br />

On dispose d’un fichier CSV (Comma-Separated Values)<br />

”notes.txt” qui contient les noms, prénoms et notes des étudiants,<br />

séparés par un point-virgule (un étudiant par ligne).<br />

notes.txt<br />

Antoine;Bouchon;18<br />

Cécile;Capsule;14<br />

Pierre;Quiroule;13.5<br />

Richard;Joli;17.5<br />

...<br />

Écrire un programme qui calcule et affiche le nom et prénom de<br />

celui qui a la meilleure note<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 34/36


Exercice<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 35/36


Ecriture<br />

Pour écrire dans un fichier, il faut l’ouvrir en mode écriture<br />

avec l’un de ces indicateurs :<br />

"w" : pour (ré)écrire un fichier en partant de zéro<br />

"a" : pour écrire à la suite d’un fichier existant<br />

write permet d’écrire dans le fichier<br />

>>> fichier = open("toto.txt","w")<br />

>>> fichier.write("ceci␣est\nun␣test")<br />

>>> fichier.close()<br />

>>> fichier = open("toto.txt","r")<br />

>>> print fichier.read()<br />

ceci est<br />

un test<br />

D. Marin Informatique générale 1 – <strong>Cours</strong> 4 36/36

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!