Vue d'ensemble
Une chaîne de caractères (type str) est du texte : un mot, une phrase,
un code, une réponse au clavier. En prépa, tu manipuleras des chaînes en permanence — pour lire des
données, afficher des résultats, coder des algorithmes sur les mots. L'idée-clé à ne jamais oublier :
une chaîne est immuable. On peut la lire caractère par caractère et en
fabriquer de nouvelles, mais jamais modifier une chaîne existante « sur place ».
Cette fiche te donne tous les réflexes : indexer, découper, parcourir, et les méthodes utiles
(upper, replace, split, join…), avec les pièges
qui font perdre des points en début d'année.
Prérequis
- Savoir affecter une variable et connaître les types de base (
int,str…) - Savoir écrire une boucle
forsimple - Aucune notion avancée de prépa n'est requise
Tu bloques sur les indices, le slicing ou l'immuabilité ? Ce sont exactement les points qui coûtent des heures en début d'année. Nos mentors alumni X · Centrale · Mines reprennent les bases avec toi, à ton rythme, avant que le programme ne s'accélère.
Trouver un mentor →1. Qu'est-ce qu'une chaîne
Une chaîne (type str) est une suite ordonnée de caractères, écrite
entre guillemets. On peut utiliser des guillemets doubles "..." ou des apostrophes
'...' : les deux sont équivalents.
mot = "bonjour" # guillemets doubles
autre = 'salut' # apostrophes : même chose
vide = "" # chaîne vide (aucun caractère)
print(mot) # affiche : bonjour"" (deux guillemets collés)
est la chaîne vide, de longueur 0 : un point de départ idéal pour construire du texte. Par ailleurs,
'salut' et "salut" sont identiques ; on choisit l'un pour écrire l'autre dans
le texte ("l'oiseau", 'il dit "oui"').
Séquences d'échappement
Certains caractères spéciaux s'écrivent avec un antislash \ : c'est une
séquence d'échappement. Le couple \ + lettre compte pour
un seul caractère.
| Écriture | Signification |
|---|---|
\n | retour à la ligne |
\t | tabulation |
\" | un guillemet " à l'intérieur d'une chaîne en guillemets doubles |
print("ligne 1\nligne 2") # affiche les deux mots sur deux lignes
print("a\tb") # affiche : a b (séparés par une tabulation)
print("il dit \"oui\"") # affiche : il dit "oui"\ dit à Python « le caractère qui suit
est spécial » : \n passe à la ligne, \t insère une tabulation, \"
met un guillemet dans le texte sans fermer la chaîne. Chaque séquence compte pour 1 caractère.
La fonction len(s) renvoie le nombre de caractères de la chaîne
s. Les espaces et les caractères spéciaux comptent chacun pour un.
len("bonjour") # 7
len("") # 0 (chaîne vide)
len("a b") # 3 (l'espace compte)
len("a\nb") # 3 (\n compte pour 1 seul caractère)2. Indexer et découper
Chaque caractère d'une chaîne a une position (un indice). Attention : en Python, on compte à partir de 0.
| Caractère | P | Y | T | H | O | N |
|---|---|---|---|---|---|---|
| Indice positif | 0 | 1 | 2 | 3 | 4 | 5 |
| Indice négatif | -6 | -5 | -4 | -3 | -2 | -1 |
s = "PYTHON"
s[0] # 'P' premier caractère
s[2] # 'T' troisième caractère (indice 2)
s[-1] # 'N' dernier caractère
s[-2] # 'O' avant-dernier
len(s) # 6 donc les indices valides vont de 0 à 50
(pas 1) ; -1 désigne le dernier, -2 l'avant-dernier ; et une chaîne de
longueur 6 a ses indices valides de 0 à 5 (demander s[6] est une erreur).
s[a:b] renvoie la sous-chaîne des caractères d'indice a
inclus jusqu'à b exclu. On peut ajouter un pas : s[a:b:pas].
s = "PYTHON"
s[0:3] # 'PYT' indices 0, 1, 2 (3 est exclu)
s[2:] # 'THON' de l'indice 2 jusqu'à la fin
s[:3] # 'PYT' du début jusqu'à l'indice 3 exclu
s[::2] # 'PTO' un caractère sur deux (pas de 2)
s[::-1] # 'NOHTYP' la chaîne renversée (pas de -1)s[0:3]Borne de fin exclue. On prend les indices 0, 1, 2 mais PAS 3. La longueur du résultat vaut 3 - 0 = 3.s[2:]Bornes omises. Sans borne de fin, on va jusqu'au bout. Sans borne de début (s[:3]), on part de 0.s[::-1]Renversement. Un pas de -1 parcourt la chaîne de droite à gauche : c'est l'astuce standard pour retourner un mot.s. On ne peut pas écrire
s[0] = "X" : c'est interdit (on le verra en section erreurs).
3. Parcourir une chaîne
Parcourir, c'est passer sur chaque caractère un par un. Deux façons de faire, qu'il faut savoir lire toutes les deux.
Parcours par caractère
À chaque tour, c prend la valeur d'un caractère de s, dans l'ordre — c'est la façon la plus simple et la plus lisible.
s = "abc"
for c in s:
print(c) # affiche a, puis b, puis c (une par ligne)Parcours par indice
s = "abc"
for i in range(len(s)):
print(i, s[i]) # 0 a, puis 1 b, puis 2 crange(len(s)) produit les indices
0 à len(s)-1, et s[i] donne le caractère à la position i.
Cette forme est utile quand la position compte (ex. comparer s[i] et s[i+1]).
s = "banane"
nb = 0
for c in s:
if c == "a":
nb = nb + 1
print(nb) # 2"banane" s'écrit b-a-n-a-n-e : il contient
2 lettres a. En traçant la boucle (0, puis 1 au 2ᵉ caractère, puis 2 au
4ᵉ), on retrouve bien nb = 2. Compter à la main sur un petit exemple reste le meilleur
réflexe pour valider un code.
4. Les méthodes utiles
Une méthode s'appelle avec un point : s.upper(). Python fournit une
boîte à outils très pratique pour les chaînes.
| Appel | Effet | Résultat |
|---|---|---|
s.upper() | tout en majuscules | "BONJOUR, LE MONDE" |
s.lower() | tout en minuscules | "bonjour, le monde" |
s.count("o") | nombre d'occurrences de "o" | 3 |
s.replace("o", "0") | remplace tous les "o" | "B0nj0ur, le m0nde" |
s.find("monde") | indice de la 1re occurrence | 12 |
s.find("xyz") | si absent : renvoie -1 | -1 |
" hi ".strip() | enlève les espaces aux bords | "hi" |
s.replace("o", "0")Remplacer partout. Renvoie une chaîne où CHAQUE "o" est devenu "0". La chaîne d'origine, elle, ne bouge pas.s.find("xyz")Chercher. Renvoie l'indice de départ si trouvé, sinon -1 (et non une erreur). Toujours tester if s.find(x) != -1.s.upper() ne change
pas s : elle renvoie une NOUVELLE chaîne. Pour garder le résultat, il
faut réaffecter : s = s.upper(). Sinon la transformation est perdue.
s = "bonjour"
s.upper() # renvoie "BONJOUR" mais on ne garde rien : s vaut toujours "bonjour"
s = s.upper() # LÀ on garde le résultat : s vaut "BONJOUR"
"x" in s teste si "x" est une sous-chaîne de s
(renvoie un booléen). s.split(",") découpe la chaîne en une liste de
morceaux. "-".join(liste) fait l'inverse : recolle une liste de chaînes en une seule.
"jour" in "bonjour" # True ("jour" est dedans)
"z" in "bonjour" # False
"a,b,c".split(",") # ['a', 'b', 'c'] -> une liste
"-".join(["a", "b", "c"]) # 'a-b-c' -> une chaîne"a,b,c".split(",")Découper. Coupe à chaque virgule et renvoie la LISTE des morceaux. Idéal pour lire une ligne de données séparées par des virgules."-".join(["a","b","c"])Recoller. Le séparateur est la chaîne à gauche du point ("-"). Il est inséré entre chaque élément de la liste.Les méthodes de chaînes reviennent dans tous les TP d'info. Bien les maîtriser, c'est gagner un temps précieux aux concours. Nos mentors alumni X · Centrale · Mines t'entraînent sur des exercices type prépa pour ancrer ces réflexes durablement.
Réserver une séance →5. Construire une chaîne
Comme une chaîne est immuable, on ne l'agrandit pas « en place » : on part d'une chaîne vide et on fabrique, tour après tour, une nouvelle chaîne un peu plus longue. C'est le patron d'accumulation.
s = "abc"
res = "" # on part de la chaîne vide
for c in s:
res = res + c # on rallonge : res reçoit l'ancien res suivi de c
print(res) # abcres = ""Point de départ neutre. La chaîne vide joue pour la concaténation le rôle que 0 joue pour l'addition.res = res + cOn fabrique une NOUVELLE chaîne. Python évalue res + c (ancien contenu suivi de c) puis range le tout dans res. À chaque tour, res grandit d'un caractère.Alternative avec join. Quand on a une liste de morceaux, "".join(...) recolle tout d'un coup, sans séparateur — souvent plus rapide et plus lisible que l'accumulation.
"".join(["a", "b", "c"]) # 'abc' (séparateur vide)
"".join(["Ma", "jo", "rant"]) # 'Majorant'Enfin, les f-strings (préfixe f) insèrent une variable entre accolades directement dans le texte — pratique pour fabriquer un message.
nom = "Alice"
age = 17
f"{nom} a {age} ans" # 'Alice a 17 ans' (le f rend les accolades actives)
f"le double : {2 * age}" # 'le double : 34' (on peut mettre un calcul entier)6. Erreurs classiques (les pièges qui coûtent des points)
Ces erreurs reviennent dans toutes les copies de début d'année. Les connaître à l'avance, c'est autant de points sauvés.
s[0] = "X" déclenche une
TypeError : une chaîne est immuable, on ne peut pas réécrire un de ses caractères.
Pour « changer » un caractère, on fabrique une nouvelle chaîne, par exemple avec du slicing :
s = "X" + s[1:].
s.upper() tout seul ne sert à rien :
le résultat est calculé puis jeté. Il faut s = s.upper(). Même chose pour
replace, strip, lower… : elles renvoient une nouvelle chaîne,
elles ne modifient pas s.
n, les
indices valides vont de 0 à n-1. Demander s[len(s)] ou plus
déclenche une IndexError. Le dernier caractère est s[len(s)-1], ou plus
simplement s[-1].
"ab" in s
teste si "ab" apparaît comme morceau de texte (pas comme un « élément »).
Ainsi "jo" in "bonjour" vaut True. Ne le confonds pas avec l'appartenance à
une liste, où in cherche un élément entier.
s.find("xyz") renvoie -1 (le programme continue). Piège : -1 est
aussi un indice valide (le dernier caractère !). Teste donc if s.find(x) != -1 plutôt que
d'utiliser la valeur brute comme position.
7. Pour aller plus loin
Les chaînes ressemblent beaucoup aux listes : on les indexe, on les découpe, on les parcourt de la même façon. Ces chapitres réinvestissent directement ce que tu viens de voir.
- Manipuler les listes — mêmes indices, même slicing, mais les listes, elles, sont modifiables.
- Patrons d'algorithmes sur les listes — accumulation, compteur, recherche : les mêmes patrons qu'ici, généralisés.
- Dictionnaires — pour compter les occurrences de chaque lettre d'un mot en une seule passe.
Écris un code qui compte le nombre de voyelles (a, e, i, o, u, y) dans un mot.
mot = "informatique"
voyelles = "aeiouy"
nb = 0
# ... à compléterVoir la correction détaillée
for c in mot.c, on teste s'il est une voyelle avec l'opérateur in : if c in voyelles.nb = nb + 1.mot = "informatique"
voyelles = "aeiouy"
nb = 0
for c in mot:
if c in voyelles:
nb = nb + 1
print(nb) # 6Un palindrome se lit pareil dans les deux sens (« kayak », « radar »). Écris un test qui dit si un mot est un palindrome.
Voir la correction détaillée
s[::-1] (pas de -1).mot = "kayak"
est_palindrome = (mot == mot[::-1])
print(est_palindrome) # Truemot[::-1] vaut "kayak", égal à mot : le résultat est True. Sur "chat", le renversé est "tahc" ≠ "chat" : False.Récap final — Ce qu'il faut absolument retenir
Tu dois pouvoir répondre « oui » sans hésiter à chaque point.
- Sais-tu écrire une chaîne avec
"..."ou'...', et une chaîne vide""? - Sais-tu ce que valent
\n,\t,\"et qu'ils comptent pour un caractère ? - Sais-tu que
len(s)donne le nombre de caractères ? - Sais-tu que l'indexation commence à
0et ques[-1]est le dernier caractère ? - Sais-tu découper avec
s[a:b](fin exclue) et renverser avecs[::-1]? - Sais-tu qu'une chaîne est immuable (impossible de faire
s[0] = "X") ? - Sais-tu parcourir avec
for c in set avecfor i in range(len(s))? - Sais-tu que
s.upper(),replace,strip… renvoient une NOUVELLE chaîne et qu'il faut réaffecter (s = s.upper()) ? - Sais-tu utiliser
count,find(qui renvoie-1si absent) et l'opérateurin? - Sais-tu passer d'une chaîne à une liste avec
splitet l'inverse avecjoin? - Sais-tu construire une chaîne par accumulation (
res = res + c) ou avec"".join(...)? - Sais-tu insérer une valeur dans du texte avec une f-string (
f"{n} ans") ?