Les chaînes de caractères
Indexer, découper, parcourir et transformer du texte — la structure de données que tu manipules le plus
§1.Une chaîne est une SUITE de caractères
Jusqu'ici tu as traité le texte comme un bloc insécable : tu l'affichais, tu le stockais. Mais une chaîne a une structure interne — c'est une suite ordonnée de caractères, et on peut atteindre chacun d'eux individuellement.
C'est le premier objet composé du parcours, et tout ce que tu apprends ici se transposera presque mot pour mot aux listes du chapitre suivant. Index, tranches, parcours, longueur : mêmes notations, mêmes règles.
§2.L'indexation commence à zéro
Le premier caractère porte l'index 0, le deuxième l'index 1, et ainsi de suite. Pour une chaîne de n caractères, le dernier index est donc n − 1.
Cette convention déroute, puis devient naturelle. Elle vient d'une raison technique — l'index représente un DÉCALAGE depuis le début — et elle est universelle en informatique.
Python ajoute une commodité rare : les index négatifs. −1 désigne le dernier caractère, −2 l'avant-dernier. Plus besoin de calculer len(mot) − 1.
mot = "Python" print(mot[0]) # premierprint(mot[3]) # quatrièmeprint(mot[-1]) # dernierprint(mot[-2]) # avant-dernierprint(len(mot)) # nombre de caractèresLes index vont de 0 à 5 pour ce mot de 6 lettres. Écrire mot[6] provoque une IndexError : "string index out of range".
§4.Les index de « Python »
| Caractère | P | y | t | h | o | n |
|---|---|---|---|---|---|---|
| Index positif | 0 | 1 | 2 | 3 | 4 | 5 |
| Index négatif | -6 | -5 | -4 | -3 | -2 | -1 |
§5.Les tranches : extraire un morceau
La notation mot[debut:fin] extrait une portion. Comme pour range, la borne de DÉBUT est incluse et celle de FIN est exclue.
Cette règle a un avantage pratique : mot[0:3] contient exactement 3 caractères, et mot[:3] + mot[3:] reconstitue la chaîne entière sans trou ni doublon.
Les deux bornes sont facultatives : omettre le début signifie « depuis le commencement », omettre la fin signifie « jusqu'au bout ».
mot = "programmation" print(mot[0:4]) # de 0 à 3print(mot[:4]) # pareil, début sous-entenduprint(mot[4:]) # de 4 jusqu'au boutprint(mot[-4:]) # les quatre derniersprint(mot[2:8]) # une portion au milieuUne tranche hors limites ne plante pas : mot[50:] renvoie simplement une chaîne vide, là où mot[50] provoquerait une IndexError. C'est une différence utile à connaître.
§8.Inverser une chaîne
Retourner un texte est une opération si fréquente — palindromes, algorithmes de parcours — qu'elle mérite sa propre section.
La fonction reversed() parcourt une suite à l'envers. Elle ne renvoie pas directement une chaîne, mais une suite de caractères qu'on réassemble avec join().
mot = "Dakar" # Avec reversed() et join()print("".join(reversed(mot))) # À la main, avec un accumulateurresultat = ""for lettre in mot: resultat = lettre + resultatprint(resultat)La version manuelle mérite d'être comprise : à chaque tour, on colle la nouvelle lettre DEVANT ce qu'on a déjà. C'est le même principe que la conversion en binaire du chapitre sur les boucles.
mot = "bonjour" mot.upper() # renvoie une nouvelle chaîne… qu'on jetteprint(mot) mot = mot.upper() # il faut la récupérerprint(mot)L'erreur est fréquente : appeler une méthode sans stocker son résultat. Comme rien ne plante, on peut chercher longtemps pourquoi « ça ne marche pas ».
§13.Les méthodes de chaînes les plus utiles
- .upper() / .lower()
- Renvoient la chaîne tout en majuscules ou tout en minuscules.
- Exemple. Comparer sans tenir compte de la casse : if reponse.lower() == "oui":
- .strip()
- Enlève les espaces au début et à la fin. Indispensable sur une saisie utilisateur.
- Exemple. " Awa ".strip() donne "Awa".
- .replace(ancien, nouveau)
- Remplace toutes les occurrences.
- Exemple. "a-b-c".replace("-", " ") donne "a b c".
- .split(separateur)
- Découpe la chaîne en une LISTE de morceaux. Sans argument, découpe sur les espaces.
- Exemple. "12 7 5".split() donne ["12", "7", "5"].
- .count(x) / .find(x)
- Compte les occurrences ; renvoie l'index de la première (ou −1 si absente).
- Exemple. "banane".count("a") donne 3.
- .startswith(x) / .endswith(x)
- Teste le début ou la fin de la chaîne.
- Exemple. fichier.endswith(".py") vaut True ou False.
§14.Parcourir une chaîne
Deux façons de faire, et la première est presque toujours la bonne : la boucle for peut parcourir directement les caractères, sans passer par les index.
On ne recourt aux index que lorsqu'on a besoin de la POSITION du caractère, pas seulement de sa valeur.
mot = "Sénégal" # Directement sur les caractères — à privilégierfor lettre in mot: print(lettre, end=" ")print() # Par les index — quand la position comptefor i in range(len(mot)): print(i, mot[i])Le paramètre end=" " remplace le retour à la ligne habituel de print par un espace. C'est ce qui permet d'afficher sur une seule ligne.
Le motif du chapitre précédent s'applique tel quel au texte.
phrase = "programmation en python"voyelles = 0 for lettre in phrase: if lettre in "aeiouy": voyelles += 1 print(voyelles, "voyelles")L'opérateur in teste l'appartenance : lettre in "aeiouy" demande « cette lettre figure-t-elle parmi ces six-là ? ». C'est bien plus court que six comparaisons enchaînées avec or.
Un palindrome se lit pareil dans les deux sens. Avec l'inversion par tranche, ça tient en une ligne.
§18.split et join : le couple texte / liste
split découpe un texte en liste. join fait exactement l'inverse : il assemble une liste en texte, en glissant un séparateur entre les éléments.
Ce couple sert dès qu'on traite des données saisies sur une seule ligne — une série de notes, une liste de mots, des valeurs séparées par des virgules.
ligne = "12 7 15 9" morceaux = ligne.split()print(morceaux) total = 0for m in morceaux: total += int(m)print("Somme :", total) print("-".join(morceaux))Remarque les guillemets dans la liste affichée : split renvoie des CHAÎNES, pas des nombres. D'où le int(m) avant d'additionner. La syntaxe de join se lit à l'envers de ce qu'on attend : c'est le SÉPARATEUR qui porte la méthode.
À retenir
- Une chaîne est une suite indexée à partir de 0 ; −1 désigne le dernier caractère.
- Les tranches [debut:fin] excluent la fin ; une tranche hors limites renvoie une chaîne vide au lieu de planter.
- Pour inverser : "".join(reversed(mot)). L'idiome mot[::-1] est standard en Python mais indisponible dans l'interpréteur du navigateur.
- Une chaîne est IMMUABLE : les méthodes renvoient une nouvelle chaîne, il faut la récupérer.
- upper, lower, strip, replace, split, count, find, startswith : la trousse de base.
- for lettre in mot parcourt les caractères ; les index ne servent que si la position compte.
- in teste l'appartenance : if lettre in "aeiouy".
- split découpe en liste, join réassemble ; split renvoie des chaînes, pas des nombres.