Vous êtes sur la page 1sur 15

TI1 – Semestre 2

Préparation à la certification Python 2 Ahlem ELHAJ

Chapitre 2 – Les Chaînes de Caractères

Nous étudions dans ce chapitre un autre exemple de collections sous Python, déjà introduit pendant
le premier semestre : les chaînes de caractères.
I. Présentation et rappels
A l’instar des listes et des tuples, une chaine de caractère en Python est une séquence, c’est-à-dire une
collection ordonnée et indexée par un indice (entier) permettant l’accès individuel à chacun de ses
éléments. Il est à noter qu’une chaine de caractères est immuable.
Un littéral de type chaine est entouré par des guillemets (simples ou doubles, sans différence). Ainsi,
'Bonjour' et "Bonjour" représentent le même littéral.
Il est possible d’affecter une chaine à une variable et de l’afficher en utilisant la fonction print() :
#Script Affichage obtenu
ch1 = "Bonjour" Bonjour Bonjour
ch2 = ch1
print(ch1, ch2)
Rappelons que la fonction input() retourne une chaine de caractères (ch = input()).
Pour définir une chaine multiligne (contenant un retour chariot), on la délimite par 3 guillemets simples
ou doubles :
Script Résultat obtenu
a = """Ceci est une Ceci est une
chaine sur chaine sur
3 lignes""" 3 lignes
print(a)
a = '''Ceci est une Ceci est une
chaine sur chaine sur
3 lignes''' 3 lignes
print(a)
NB. Si dans cet exemple on délimite le littéral chaine par des guillemets simples ou doubles comme pour
un littéral classique sur une ligne unique, on obtient une erreur de syntaxe.
II. Opérations courantes sur les chaines
A. Longueur d’une chaine
La fonction len() permet de déterminer La longueur d’une chaine (nombre de caractères qui la
composent).

B. Accès aux caractères


Une chaine de caractères est une suite de caractères Unicode. Cependant, à la différence des autres
langages populaires, Python ne possède pas un type caractère : un caractère est simplement une
chaine de longueur 1. Pour accéder aux éléments (caractères) d’une chaine (et d’une séquence en
général), on utilise la notation ch[i], où i est l’indice (le numéro) du caractère dans la chaine, la
première position étant 0. Rappelons qu’on peut aussi utiliser des indices négatifs, en commençant
par -1 (ch[-1] est le dernier caractère de la chaine, ch[-2] est l’avant dernier, et ainsi de suite).

ch="Bonjour" Résultat obtenu :


print(ch[0]) B
print(ch[2]) n
print(ch[-1]) r
print(ch[-4]) j

1
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ
Les indices autorisés pour une chaine ch (ou une séquence en général) vont de 0 à len(ch)-1 et de -1 à
-len(ch), et tout accès à ch[i] avec i non compris entre -len(ch) et len(ch)-1 génère une erreur
d’exécution (out of range index) :

#script Résultat obtenu :


ch="Bonjour" Message d’erreur
print(ch[7]) IndexError: string index out of range
C. Immuabilité de la chaine
Etant donné qu’une chaine est immuable, il n’est pas possible de changer (via une affectation) la
valeur de l’un de ses caractères. Par exemple, ce script génère une erreur d’exécution :

#script Résultat obtenu :


ch="Bonjour"
print(ch) Bonjour
ch[0]="A" Message d’Erreur :
'str' object does not support item assignment
Ainsi, on ne peut faire une affectation qu’à la globalité de la chaine (ce qui aura pour résultat de
changer l’adresse de la chaine en mémoire), mais pas à ses éléments.

D. Parcours et test d’appartenance


Une chaine est un itérable, elle peut être parcourue à l’aide d’une boucle for :

for car in ch :
print(car)
Afin de tester l’existence d’une sous-chaine à une chaine, on utilise les opérateurs in et not in. Si la
sous-chaine recherchée est la chaine vide : le test "" in ch retourne toujours True.

#script Résultat obtenu


ch="Bonjour"
print("B" in ch) True
print("Bon" in ch) True
print("bon" in ch) False
print("onB" in ch) False
print("jo" in ch) True
print("" in ch) True
E. Concaténation et duplication de chaines
Il est possible de concaténer (« coller ») les chaînes de caractères en utilisant l’opérateur +

Il est à noter que la concaténation n’est pas commutative (donc l’ordre des opérandes est important).
Par exemple, "bon"+"jour" a pour résultat la chaîne "bonjour" alors que "jour"+"bon" a pour résultat
la chaîne "jourbon".

L’opérateur * permet de dupliquer une chaîne de caractères un certain nombre de fois. L’un des
opérandes doit être la chaîne à dupliquer et le deuxième doit être un nombre entier. Il s’agit d’une
opération commutative. Par exemple, "bon"*3 et 3*"bon" donnent le même résultat, soit la chaîne
"bonbonbon"

2
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

F. Comparaison des chaines


Les opérateurs relationnels ==, !>, <, >, <= et >= peuvent être utilisés pour comparer les chaines de
caractères.

La comparaison est basée sur le code (Unicode/ASCII) des caractères composant la chaine. Elle se fait
en commençant par comparer le premier caractère de chacune des deux chaines, et, si nécessaire (en
cas de caractères identiques), passer à la comparaison des caractères suivants. On arrête la
comparaison dès qu’une décision peut être faite ou que l’une des deux chaines est épuisée (elle n’a
plus de caractères à comparer).

III. Découpage (slicing) de chaines


Les slices (tranches) peuvent être extraite d’une chaine, comme pour toute autre séquence (liste,
tuple). La syntaxe générale est alors la suivante :

ch[start : stop : step]


start indique l’indice du début du slice, stop indique la « barrière » où l’indice tel que le slice s’arrête
juste avant, et step indique le pas.

Les trois paramètres start, stop et step sont optionnels. Par défaut :

• Le pas (step) par défaut est 1 ;


• Si start n’est pas indiqué, le slice commence au début de la chaine si le pas est positif, et à la
fin si le pas est négatif ;
• Si stop n’est pas indiqué, le slice s’étend jusqu’au dernier caractère si le pas est positif, et
jusqu’au premier caractère si le pas est négatif.

Exemple :

ch="Bonsoir" Résultat obtenu


print(ch[2:5]) nso
print(ch[5:2])
print(ch[5:2:-1]) ios
print(ch[-1:2:-1]) rios
print(ch[-5:-2]) nso
print(ch[-1:-5:-1]) rios
print(ch[-1:-5:-2]) ro
print(ch[2:5:3]) n
print(ch[2:]) nsoir
print(ch[:2]) Bo
print(ch[2:1000]) nsoir
print(ch[-1:-1000:-1]) riosnoB
print(ch[:]) Bonsoir
IV. Fonctions prédéfinies
A part la fonction len(ch) permettant d’obtenir la longueur d’une chaine de caractères (ou d’un itérable
en général), il est aussi possible de manipuler les chaines à l’aide d’autres fonctions prédéfinies.

A. Conversion d’une chaine


Nous avons déjà vu les fonctions float(), int() et str() pour la conversion d’une chaine de caractères
vers un nombre et inversement.

3
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ
Les fonctions list(), tuple() et set() acceptent en argument un itérable, donc on peut leur passer une
chaine de caractères :

#script Résultat obtenu


ch="bonjour"
print(list(ch)) ['b', 'o', 'n', 'j', 'o', 'u', 'r']
print(tuple(ch)) ('b', 'o', 'n', 'j', 'o', 'u', 'r')
print(set(ch)) {'b', 'j', 'o', 'n', 'r', 'u'}
B. Maximum, minimum et tri
Les fonctions min() et max() et sorted() acceptent un itérable mais elles ne fonctionnent correctement
(sans erreur d’exécution) que s’il y a une relation d’ordre total entre les éléments de cet itérable (C’est-
à-dire qu’on peut comparer chaque deux éléments de l’itérable et décider lequel est plus grand).

Si l’itérable passé est une chaine de caractères, ces 3 fonctions fonctionnent sans problème : la
comparaison se fait en se basant sur les codes (Unicode/ASCII) des caractères de la chaine. Notez par
ailleurs que la fonction sorted() renvoie une liste quelque soit le type de l’itérable qu’elle reçoit en
argument.

#script Résultat obtenu :


print(min("bonjour")) b
print(max("bonjour")) u
print(sorted("bonjour")) ['b', 'j', 'n', 'o', 'o', 'r', 'u']
print(sorted("bonjour", reverse=True)) ['u', 'r', 'o', 'o', 'n', 'j', 'b']
V. Méthodes des chaines de caractères
Le tableau suivant présente une liste non exhaustive des méthodes définies pour les chaines de
caractères :

Méthode Description
Méthodes renvoyant une copie transformée de la chaine
NB. Aucune de ces méthodes n’agit sur la chaine d’origine
s.upper() Renvoie une chaine résultant de la conversion en majuscule de s.
s.lower() Renvoie une chaine résultant de la conversion en minuscule de s.
s.capitalize() Renvoie une chaine dont le premier caractère est converti en majuscule
et le reste des caractères sont convertis en minuscule.
s.title() Renvoie une chaine dans laquelle le premier caractère de chaque mot
est en majuscule, comme un titre. Si le mot contient un nombre ou un
symbole, la première lettre qui suit sera convertie en majuscules.
s.swapcase() Renvoie une chaine dans laquelle tous les caractères majuscules de s
sont transformés en minuscules et inversement.
s.center(n, char) Renvoie une chaine centrée de longueur n en complétant à droite et à
gauche de la chaine par le caractère 'char' choisi en paramètre. Le
s.center(n) caractère 'char' de remplissage est optionnel et, si non spécifié, le
remplissage par défaut est le caractère espace.
Si n est inférieur ou égal à len(s), la chaine d’origine est retournée
Génère une erreur si char n’a pas pour longueur 1 (exactement un
caractère)
s.strip(chars) Renvoie une copie de la chaine dans laquelle tous
les caractères indiqués en paramètres ont été supprimés du début et
s.strip() de la fin de la chaine.

4
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

Si aucun caractère n’est indiqué en paramètres, les caractères


d'espacement sont supprimés par défaut (espace, tabulations, saut de
ligne …).
s.lstrip(chars) « left strip » : se comporte comme strip(), mais agit uniquement en
s.lstrip() début de chaine
s.rstrip(chars) « right strip » : se comporte comme strip(), mais agit uniquement en fin
s.rstrip() de chaine
s.replace(old, new, count) Renvoie une copie de la chaîne dont toutes les occurrences de la sous-
s.replace(old, new) chaîne old sont remplacés par new. Si l'argument optionnel count
(entier) est donné, seules les count premières occurrences sont
remplacées.
Méthodes de recherche d’une sous-chaine dans la chaine (retournent un entier).
NB. Si le but est juste de vérifier l’existence de la sous-chaine, les opérateurs in et not in suffisent.
s.count(ch, start, end) Renvoie le nombre de fois qu’une chaine ch apparaît dans la chaine s,
s.count(ch, start) la recherche se fait de l’indice start (inclus) à l’indice end (non inclus).
s.count(ch) Les paramètres start et end sont optionnels, la recherche par défaut se
fait du début à la fin de s.
s.find(ch, start, end) Renvoie l’indice de la première occurrence de ch dans s, la recherche
s.find(ch, start) étant effectuée dans le slice s[start : end].
s.find(ch) Si ch n'est pas trouvée, elle renvoie -1.
Les paramètres start et end sont optionnels, la recherche par défaut se
fait du début à la fin de s.
s.rfind(ch, start, end) « right find » : se comporte comme find mais renvoie la dernière
s.rfind(ch, start) occurrence de ch.
s.rfind(ch)
s.index(ch, start, end) Se comporte comme find() mais génère une exception (erreur
s.index(ch, start) d’exécution) si ch n’est pas trouvée.
s.index(ch)
s.rindex(ch, start, end) « right index » : Se comporte comme rfind() mais génère une exception
s.rindex(ch, start) (erreur d’exécution) si ch n’est pas trouvée.
s.rindex(ch)
Méthodes de vérification de préfixe et de suffixe (retournent un bool)
s.startswith(prefix, start, end) Renvoie True si la chaîne s commence par prefix,
s.startswith(prefix, start) sinon False. Lorsque start est donné, la comparaison commence à
s.startswith(prefix) cette position, et lorsque end est donné, la comparaison s'arrête avant
celle-ci (end non inclus).
prefix peut aussi être un tuple de préfixes à rechercher (l’un des préfixe
doit être trouvé pour retourner True).
s.endswith(suffix, start, end) Renvoie True si la chaîne s se termine par suffix,
s.endswith(suffix, start) sinon False. Lorsque start est donné, la comparaison commence à
s.endswith(suffix) cette position, et lorsque end est donné, la comparaison s'arrête avant
celle-ci (end non inclus).
suffix peut aussi être un tuple de suffixes à rechercher (l’un des suffixes
doit être trouvé pour retourner True).
Méthodes de vérification de la « nature » des caractères d’une chaine (retournent un bool)
s.isalpha() Renvoie True si s est non vide et que tous ses caractères sont
alphabétiques (des lettres latines, grecques, arabes …), sinon False.
s.isdigit() Renvoie True si s est non vide et que tous ses caractères sont des
chiffres, False sinon.
s.isalnum() Renvoie True si s est non vide et que tous ses caractères sont des
caractères alphabétiques ou chiffres, False sinon.

5
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

s.isspace() Renvoie True si s est non vide et qu’elle ne contient que des caractères
d'espacement (espace, tabulation, retour à la ligne …), False sinon.
s.isupper() Renvoie True si tous les caractères capitalisables de la chaîne sont en
majuscule et qu'elle contient au moins un caractère capitalisable,
False sinon.
s.islower () Renvoie True si tous les caractères capitalisables de la chaîne sont en
minuscules et qu'elle contient au moins un caractère capitalisable,
False sinon.
Dans ce qui suit, nous présentons quelques autres méthodes avancées :

La méthode split(sep, maxsplit)

La méthode split() découpe une chaîne de caractères en une liste d’éléments appelés champs ou mots,
en utilisant comme séparateur par défaut n'importe quelle combinaison de caractères d’espacement.
Elle peut accepter deux paramètres optionnels :

• sep : séparateur (chaine de caractères non vide, erreur d’exécution si séparateur vide) à
prendre en compte pour le découpage de la chaine.
➢ Si un séparateur est spécifié, l’algorithme de découpage fonctionne de manière
« primitive » : le nombre de champs obtenus est égal au nombre d’occurrence du
séparateur + 1, il est alors possible d’obtenir des champs vides ('').
➢ Si aucun séparateur n’est spécifié, l’algorithme utilisé est plus « intelligent », on
n’obtient pas de chaine vide comme champ, même si la chaine commence ou se
termine par des caractères d’espacements, et même si on a plusieurs caractères
d’espacements successifs.
• maxsplit : entier qui spécifie le nombre maximal de découpes à faire, ce qui donne au
maximum maxsplit+1 champs. Après avoir atteint ce nombre, le reste de la chaine est
considéré comme un seul champ.

La méthode rsplit(sep, maxsplit) : right split

La méthode rsplit() commence à diviser une chaîne à partir du côté droit (à partir du dernier caractère),
tandis que la méthode split() commence à diviser à partir du côté gauche (à partir du premier
caractère). La seule différence entre split() et rsplit() est lorsque le paramètre maxsplit est spécifié.

Si aucun maxsplit n’est spécifié, cette méthode retournera le même résultat que la méthode split().

La méthode join(iterable)

La méthode s.join(iterable) accepte en paramètre un itérable dont chaque élément est une chaine de
caractères (une erreur TypeError a lieu si l’un des éléments de l’itérable n’est pas une chaine de
caractères). Elle retourne la chaine de caractères résultant de la concaténation des éléments de
l’itérable passé en argument, en plaçant comme séparateur entre eux la chaine s qui a fourni cette
méthode.

La méthode format(value1, value2...)

Cette méthode renvoie une chaine de caractères formatée à partir de la chaine en question. Le
paragraphe suivant explique en détail le concept de chaines formatées (f-string) et le fonctionnement
de la méthode format().

6
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

Activité 1
Indiquez le résultat obtenu pour chacun des scripts suivants :

#script 1 #script 2 #script 3


ch1="Bonjour 123!" ch1="Bonjour 123!" ch1="BoNjoUr 123!"
ch2=ch1.upper() ch1=ch1.upper() print(ch1.lower())
print(ch2) print(ch1) print(ch1.capitalize())
print(ch1) print(ch1.title())
print(ch1.swapcase())
#script 4 #script 5
ch1="préParation à la certification Python" ch1="J'aime ma mère!et mon père"
print(ch1.capitalize()) print(ch1.capitalize())
print(ch1.title()) print(ch1.title())
Réponse

#script 1 #script 2 #script 3


BONJOUR 123! BONJOUR 123! bonjour 123!
Bonjour 123! Bonjour 123!
Bonjour 123!
bOnJOuR 123!
#script 4 #script 5
Préparation à la certification python J'aime ma mère!et mon père
Préparation À La Certification Python J'Aime Ma Mère!Et Mon Père
Activité 2
Indiquez le résultat obtenu pour chacun des scripts suivants :

#script 1 #script 2 #script 3


ch1="ab" ch1="ab" ch1="ab"
ch2=ch1.center(2) ch2=ch1.center(4) ch2=ch1.center(4,"*")
print(ch2, len(ch2)) print(ch2, len(ch2)) print(ch2)
ch2=ch1.center(1) ch2=ch1.center(3,"*")
print(ch2, len(ch2)) print(ch2)
ch2=ch1.center(5,"*")
print(ch2)
ch2=ch1.center(6,"*")
print(ch2)
Réponse

#script 1 #script 2 #script 3


ab 2 ab 4 *ab*
ab 2 *ab
**ab*
**ab**
Remarque : si la chaine initiale est de longueur paire, alors toute étoile « supplémentaire » sera
ajoutée à gauche et inversement (ceci est juste un constat).

Activité 3
Indiquez le résultat obtenu pour chacun des scripts suivants :

7
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

#script 1 #script 2
txt=" le langage " txt=" le langage "
print("j'aime "+ txt + " Python") print("j'aime "+ txt.lstrip() + " Python")
print("j'aime "+ txt.strip() + " Python") print("j'aime "+ txt.rstrip() + " Python")
#script 3
txt="--++--le langage--Python--++"
print("j'aime "+ txt)
print("j'aime "+ txt.strip())
print("j'aime "+ txt.strip("+-"))
print("j'aime "+ txt.lstrip("+-"))
print("j'aime "+ txt.rstrip("+-"))
Réponse

#script 1 #script 2
j'aime le langage Python j'aime le langage Python
j'aime le langage Python j'aime le langage Python
#script 3
j'aime --++--le langage--Python--++
j'aime --++--le langage--Python--++
j'aime le langage--Python
j'aime le langage--Python--++
j'aime --++--le langage--Python
Activité 4
Indiquez le résultat obtenu pour chacun des scripts suivants :

#script 1 #script 2
txt="la salle est belle" txt="la salle est belle"
print(txt.count("l")) print(txt.count("l", 6, -1))
print(txt.count("ll")) print(txt.count("ll", 6, -1))
print(txt.count("l",6)) print(txt.count("l", 6, -2))
print(txt.count("ll",6)) print(txt.count("ll", 6, -2))
#script 3 #script 4
txt="la salle est belle" txt="la salle est belle"
print(txt.find("l")) print(txt.find("l", 7, -3))
print(txt.find("ll")) print(txt.find("l", 5))
print(txt.rfind("l"))
print(txt.rfind("ll"))
Réponse

#script 1 #script 2
5 3
2 1
3 2
1 0
#script 3 #script 4
0 -1
5 5
16
15

8
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

Activité 5
Indiquez le résultat obtenu à l’exécution du script suivant :

#script Réponse
s="bonjour"
print(s.startswith("bon")) True
print(s.startswith("on")) False
print(s.startswith("on", 1)) True
print(s.startswith("on", 1, 2)) False
print(s.startswith("on", 1, 3)) True
print(s.startswith("on", 3)) False
print(s.endswith("on", 0, 3)) True
VI. Chaines de caractères formatées et méthode format()
Le formatage de chaines veut dire leur « mise en forme ». La méthode basique et la plus ancienne de
formatage est la concaténation des chaines, en utilisant l’opérateur + ou la méthode concat().

Soit par exemple le script suivant :

#script Résultat
age=20
prenom="Azza"
phrase="Je suis " + prenom + " j'ai " + age + " ans." TypeError: can only concatenate str (not "int")
print(phrase) to str
L’exécution de ce script déclenche une erreur de type (TypeError) car il est interdit de concaténer un
entier (age) à des chaines de caractères. Pour corriger cette erreur, il faut alors convertir age en chaine
de caractères :

#script Résultat
age=20
prenom="Azza"
phrase="Je suis " + prenom + " j'ai " + str(age) + " ans."
print(phrase) Je suis Azza j'ai 20 ans.
L’utilisation de la concaténation pour formater les chaines augmente non seulement le risque d’erreurs
de type, mais aussi l’effort à écrire le code le rendant de plus peu lisible : il faut en effet faire attention
à l’ajout des espaces nécessaires, pour ne pas obtenir un résultat non souhaité comme dans cet
exemple :

#script Résultat
age=20
prenom="Azza"
phrase="Je suis " + prenom + " j'ai" + str(age) + "ans."
print(phrase) Je suis Azza j'ai20ans.
Dans le reste de ce paragraphe, deux moyens plus avancés de formatage des chaines sont expliqués :
les f-strings et la méthode format().

A. Les chaines f-strings


Les f-strings apparues depuis la version 3.6 de Python offrent une façon très efficace de formater des
chaînes de caractères.

Pour obtenir une f-string, il suffit de rajouter la lettre f ou F devant la chaîne de caractères, sans laisser
d’espace entre cette lettre et les guillemets (sinon erreur de syntaxe).

9
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ
Considérons cet exemple :

#script Résultat
ch1 = f"Bonjour les amis"
ch2 = f'Vous allez bien ?'
print(ch1) Bonjour les amis
print(ch2) Vous allez bien ?
print(type(ch1)) <class 'str'>
print(type(ch2)) <class 'str'>
Cet exemple montre qu’il n’existe pas de type f-string : une f-string est tout simplement une chaine
ordinaire de type str. Mais, contrairement à une chaine classique, Python interprète les expressions
placées entre accolades dans une f-string, comme illustré par cet exemple :

#script Résultat
prenom="Azza"
age=20
print(F"Je suis {prenom} j'ai {age} ans") Je suis Azza j'ai 20 ans
print("Je suis {prenom} j'ai {age} ans") Je suis {prenom} j'ai {age} ans
Toute expression placée entre accolades est alors calculée et transformée en une chaine de caractères
avant d’être insérée dans la f-string. Notez par ailleurs que si l’une des variables prenom ou age n’est
pas définie, le premier appel à print() génère une erreur (NameError).

Dans une f-string, il est possible de placer entre accolades non seulement le nom d’une variable mais
n’importe quelle expression, et c’est le résultat de l’évaluation de cette expression qui sera pris en
compte dans la f-string :

#script Résultat
a=3
b=2
print(f"{a}*2={a*2}") 3*2=6
print(f"{a}+{b}={a+b}") 3+2=5
print(f"{'a>b'}") a>b
print(f"{a>b}") True
print(f"{a}>{b} vaut {a>b}") 3>2 vaut True
Attention : dans une f-string, il ne faut jamais inclure une expression vide, sinon il y aura une erreur de
syntaxe :

#script Résultat
print(f"je suis { } une f-string erronée") SyntaxError: f-string: empty expression not allowed
Il faut par ailleurs varier les guillemets (simples dans doubles ou inversement), par exemple comme
dans la chaine f"{'a>b'}", ou encore lors de l’utilisation d’un dictionnaire :

#script Résultat
profession = {'Omar': 'ingénieur', 'Mahdi' : 'médecin'}
phrase = f"Omar est {profession["Omar"]}" Erreur de syntaxe
print(phrase)
Voici le script après correction (simples guillemets utilisés pour entourer la clé 'Omar') :

#script Résultat
profession = {'Omar': 'ingénieur', 'Mahdi' : 'médecin'}
phrase = f"Omar est {profession['Omar']}"
print(phrase) Omar est ingénieur

10
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ
NB. Il n’est pas possible dans ce cas de déspécialiser les guillemets simples ou doubles en utilisant le
caractère d’échappement \ (antislash), car ce caractère est totalement interdit dans une expression
inclue dans une f-string (c’est-à-dire entre les accolades).

Toute expression pourra être insérée (entre accolades) dans une f-string, même celles comprenant des
objets de types composés et/ou des appels à des fonctions et méthodes …

Activité 6
Indiquez le résultat obtenu en exécutant le script suivant :

prenom="azza"
nom="Ben salah"
nbres=[7,2,5,8,1]
fruits={"Orange", "fraise", "MElon"}
print(f"Etudiante : {prenom.capitalize()} {nom.upper()}")
print(f"Etudiante : {prenom.capitalize() + ' ' + nom.upper()}")
print(F"Liste originale : {nbres} liste triée : {sorted(nbres)}")
print(f"Fruits disponibles : {set([f.lower() for f in fruits])}")
Réponse

Ce script affiche :

Etudiante : Azza BEN SALAH


Etudiante : Azza BEN SALAH
Liste originale : [7, 2, 5, 8, 1] liste triée : [1, 2, 5, 7, 8]
Fruits disponibles : {'melon', 'fraise', 'orange'}
Une autre possibilité offerte par les f-string est celle de mettre le signe = à la fin de l’expression,
permettant ainsi d’afficher de façon simple l’expression (telle qu’elle est écrite) suivie par le signe égal
suivi du résultat d’évaluation de cette expression :

#script Résultat
a=5
b=8
print(f"{a+b=}") a+b=13
Enfin, pour déspécialiser les accolades dans une f-string, on les double. Par conséquent, si on veut
afficher des accolades entourant une expression à interpréter (c’est-à-dire non une simple chaine
entourée pas des guillemets), il faut les tripler :

#script Résultat
msg='Bonjour !'
print(f"je dis {{}}") je dis {}
print(f"je dis {msg}") je dis Bonjour !
print(f"je dis {'msg'}") je dis msg
print(f"je dis {{msg}}") je dis {msg}
print(f"je dis {{'msg'}}") je dis {'msg'}
print(f"je dis {{{msg}}}") je dis {Bonjour !}
print(f"je dis {{{'msg'}}}") je dis {msg}
B. La méthode format()
Un autre moyen de formater les chaines de caractères est l’utilisation de la méthode format(). Elle
permet de formater ses arguments (qu’elle transforme automatiquement en des chaines de

11
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ
caractères) puis de les insérer à l'intérieur d'emplacements spécifiés dans la chaîne de caractères par
des accolades. 3 syntaxes différentes peuvent être utilisées.

i. Syntaxe 1 : accolades vides


#script Résultat
prenom="Azza"
age=20
phrase="Je suis {} j'ai {} ans".format(prenom, age)
print(phrase) Je suis Azza j'ai 20 ans
NB. Dans cette syntaxe, ne rien mettre entre accolades (même pas d’espace) pour ne pas avoir d’erreur.

Il est à remarquer que si le nombre d’emplacements est plus grand que celui des arguments, une erreur
est obtenue :

#script Résultat
prenom="Azza"
age=20
phrase="Je suis {} j'ai {} ans {}".format(prenom, age) IndexError: Replacement index 2 out of range
print(phrase)
Par contre, si le nombre d’emplacements est plus petit que celui des arguments, aucune erreur n’est
obtenue, mais les arguments en plus sont ignorés :

#script Résultat
prenom="Azza"
age=20
phrase="Je suis {} j'ai ans".format(prenom, age)
print(phrase) Je suis Azza j'ai ans
Veillez toujours à passer autant d’arguments à format() que d’emplacements spécifiés dans la chaine !

Rappelons que, comme pour toute méthode et fonction, il est possible de passer des expressions en
tant qu’arguments.

Activité 7
Indiquez le résultat obtenu en exécutant le script suivant :

prenom="azza"
nom="Ben Salah"
age=20
phrase="Je suis {} j'ai {} ans. Après 5 ans, j'aurais {} ans."
print(phrase.format(prenom.capitalize()+' '+nom.upper(), age, age+5))
Réponse

Ce script affiche :

Je suis Azza BEN SALAH j'ai 20 ans. Après 5 ans, j'aurais 25 ans.
ii. Syntaxe 2 : indices des arguments
Parfois nous avons besoin d’afficher la même expression plusieurs fois, et donc le même argument est
passé plusieurs fois à la méthode format(), comme dans cet exemple :

#script
prenom="Azza"
age=20

12
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

phrase="Cette fille est {}. {} a {} ans. {} ans est la fleur de l'age. {} est étudiante."
print(phrase.format(prenom, prenom, age, age, prenom))
Résultat
Cette fille est Azza. Azza a 20 ans. 20 ans est la fleur de l'age. Azza est étudiante.
Pour améliorer la lisibilité du code dans un cas pareil, Python offre la possibilité de passer chaque
argument une seule fois, puis de référencer dans la chaine chaque argument par son indice ou position
(en commençant par l’indice 0) :

#script
prenom="Azza"
age=20
phrase="Cette fille est {0}. {0} a {1} ans. {1} ans est la fleur de l'age. {0} est étudiante."
print(phrase.format(prenom, age))
Résultat (voir même exemple écrit dans la syntaxe 1)
Cette fille est Azza. Azza a 20 ans. 20 ans est la fleur de l'age. Azza est étudiante.
Voici un autre exemple de script utilisant cette syntaxe :
#script Résultat
s = 'Le début de {0} est {0[0]}'.format("hello")
print(s) Le début de hello est h

iii. Syntaxe 3 : paramètres nommés


Pour plus de lisibilité du code, il est aussi possible de spécifier des noms des paramètres dans les
accolades à la place des indices puis leur affecter des valeurs dans l’appel à format :

#script
prenom="Azza"
age=20
phrase="Cette fille est {person}. {person} a {age} ans. {age} ans est la fleur de l'age. {person} est étudiante."
print(phrase.format(person=prenom, age=age))
Résultat (voir même exemple écrit dans les syntaxes 1 et 2)
Cette fille est Azza. Azza a 20 ans. 20 ans est la fleur de l'age. Azza est étudiante.
Notez que le nom donné au paramètre est à choisir sans aucune restriction (il est indépendant des
noms de variables).

Voici le deuxième exemple du paragraphe précédent réécrit dans cette syntaxe :

#script
s = 'Le début de {msg} est {msg[0]}'.format(msg="hello")
print(s)
Résultat (voir même exemple écrit dans la syntaxe 2)
Le début de hello est h
Activité 8
Comment écrire ce dernier exemple en utilisant la syntaxe 1 ?

Réponse

s = 'Le début de {} est {}'.format("hello", "hello"[0])


print(s)

13
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ
NB. Contrairement aux f-strings, il est interdit de faire du calcul ou des appels à des fonctions et
méthodes à l’intérieur des accolades. C’est uniquement au niveau des arguments de formet() qu’on
peut insérer de telles expressions.

De plus, pour les 3 syntaxes, ne jamais mettre de caractères supplémentaires dans les accolades, ni
même pas un espace, sinon une erreur KeyError a lieu (mais il est possible d’ajouter des options de
formatages que nous détaillerons dans le paragraphe suivant).

On peut enfin noter que la déspécialisation des accolades se fait de la même manière que celle vu pour
les f-strings.

C. Les options de formatages


Les options de formatages (spécificateurs de formats) permettent de contrôler la façon dont une
chaine est formatées, et ce aussi bien avec les f-strings que dans une chaine dont on souhaite appeler
la méthode format(). De telles options sont spécifiées dans les accolades après deux points (:), juste à
la fin, ce qui donne :

Pour une f-string : Avec la méthode format (avec les 3 syntaxes) :


{expression:options} {:options} ou {indice_arg:options} ou {nom_param:options}
Le tableau suivant présente une liste non exhaustive des options de formatage :

Option de formatage Exemples


:(nombre) Avec f-string Avec méthode format Résultat
Spécifie le nombre minimal
de caractères à utiliser pour print(f'{"abc":6}fin') print('{:6}fin'.format('abc')) abc fin
l’affichage, c’est-à-dire une print(f'{"abc":2}fin') print('{:2}fin'.format('abc')) abcfin
largeur d’affichage (ajout
d’espaces si nécessaire). (Première ligne : 3
Par défaut, le texte (chaine) espaces ajoutés
est aligné à gauche, c’est-à- entre abc et fin)
dire les espaces sont ajoutés
à droite. Mais s’il s’agit d’un
nombre, l’alignement par
défaut est à droite.
:0(nombre)
Permet aussi de spécifier une print(f'{25:06}') print('{:06}'.format(25)) 000025
largeur minimale d’affichage, print(f'{25.12:06}') print('{:06}'.format(25.12)) 025.12
sauf que le remplissage se
fait en utilisant des 0 et non print(f'{"25":06}') print('{:06}'.format("25")) 250000
des espaces (0-padding).
Même si non interdite pour
les chaines, elle est très
souvent utilisée uniquement
avec des nombres.
Notamment, les 0 sont
ajoutés par défaut à gauche
du nombre (mais si c’est une
chaine, ils sont ajoutés à
droite comme pour l’option
précédente ! )

14
TI1 – Semestre 2
Préparation à la certification Python 2 Ahlem ELHAJ

:< aligner à gauche print(f'+{"abc":<7}+') print('+{:<7}+'.format('abc')) +abc +


:> aligner à droite print(f'+{"abc":>7}+') print('+{:>7}+'.format('abc')) + abc+
:^ centrer print(f'+{"abc":^7}+') print('+{:^7}+'.format('abc')) + abc +
Utilisées avec l’une des deux
options précédentes, elles
permettent de contrôler
l’alignement du texte
(autrement dit
l’emplacement dans lequel
vont être ajoutés les espaces
ou les 0 utilisés pour le
remplissage).
.(nombre)f
Effectue l’arrondi à un print(f'{44.2823:.2f}') print('{:.2f}'.format(44.2823)) 44.28
nombre donné de chiffres print(f'{44.2823:.1f}') print('{0:.1f}'.format(44.2823)) 44.3
après la virgule. print(f'{44.2823:.0f}') print('{val:.0f}'.format(val=44.2823)) 44
L’expression à formater ne print(f'{44:.2f}') print('{:.2f}'.format(44)) 44.00
peut pas être de type chaine
de caractères.
.(nombre)
Permet de tronquer une print(f'{"bonjour":.5}') print('{:.5}'.format("bonjour")) bonjo
chaine de caractères en print(f'{"bon":.5}') print('{:.5}'.format("bon")) bon
gardant au plus un nombre
donné de caractères.
+
ou espace (après les : )
Permet d’ajouter un signe + print(f'{5:+}') print('{:+}'.format(5)) +5
ou un espace avant un print(f'{-5:+}') print('{:+}'.format(-5)) -5
nombre positif (pas d’effet print(f'{5: }') print('{: }'.format(5)) 5
sur un nombre négatif). print(f'{-5: }') print('{: }'.format(-5)) -5
%
.(nombre)%
Permet pour afficher un print(f'{1/4:%}') print('{:%}'.format(1/4)) 25.000000%
nombre sous la forme d’un print(f'{1/4:.2%}') print('{:.2%}'.format(1/4)) 25.00%
pourcentage. On peut
ajouter une précision c’est-à-
dire un nombre de chiffres
après la virgule (ne pas
mettre le f après le point dans
ce cas).

15

Vous aimerez peut-être aussi