Cours 4 - IA
Cours 4 - IA
Cours 4 - IA
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