Les séquences en Python

Il est possible de "stocker" plusieurs grandeurs dans une même structure, ce type de structure est appelé une séquence.
De façon plus précise, nous définirons une séquence comme un ensemble fini et ordonné d'éléments indicés de 0 à n-1 (si cette séquence comporte n éléments).
Rassurez-vous, nous reviendrons ci-dessous sur cette définition.
Nous allons étudier plus particulièrement 3 types de séquences :

  • les chaînes de caractères
  • les tuples
  • les tableaux

(il en existe d'autres que nous n'évoquerons pas ici).

I. Chaînes de caractères

Les chaînes de caractères ne sont pas comme les entiers, les flottants et les booléens.
Une chaîne de caractères est une séquence, ce qui signifie que c'est une collection ordonnée d'autres valeurs.
Dans cette partie, vous verrez comment accéder aux caractères qui composent une chaîne, et vous apprendrez à utiliser certaines des méthodes que les chaînes de caractères fournissent.

1. Une chaîne de caractères est une séquence

Une chaîne de caractères est une séquence de caractères.

Les chaînes de caractères sont immuables (on dit aussi non mutables), ce qui signifie que vous ne pouvez pas modifier une chaîne existante.
Le mieux que vous puissiez faire est de créer une nouvelle chaîne qui est une variation sur l'original :

Vous pouvez accéder aux caractères un par un, en utilisant l'opérateur [] d'indexation

In [2]:
fruit = 'banane'
lettre = fruit[1]

La seconde instruction sélectionne le caractère numéroté par 1 de fruit et l'affecte à lettre.

L'expression entre crochets s'appelle un indice.
L'indice indique quel caractère de la séquence vous voulez (d'où son nom).

Mais il se peut que vous n'obteniez pas ce que vous attendez :

In [3]:
lettre
Out[3]:
'a'

Pour la plupart des gens, la première lettre du mot 'banane' est b , et non a.
Mais pour les informaticiens, l'indice est un décalage à partir du début de la chaîne, et le décalage de la première lettre est zéro.

In [ ]:
lettre = fruit[0]
lettre

Donc b est la lettre numéro 0 (la « zéro-ième ») de 'banane', a est la lettre numéro 1 (« un-ième »), et n est la lettre numéro 2 (« deux-ième »).

Remarque

Comme indice, vous pouvez utiliser une expression qui contient des variables et des opérateurs:

In [4]:
i = 1
fruit[i]
Out[4]:
'a'
In [5]:
fruit[i+1]
Out[5]:
'n'

Mais la valeur de l'indice doit être un entier. Sinon, vous obtenez l'erreur suivante :

In [6]:
lettre = fruit[1.5]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-42f61f666326> in <module>
----> 1 lettre = fruit[1.5]

TypeError: string indices must be integers

2. Fonction len()

len() est une fonction interne qui retourne le nombre des caractères d'une chaîne

In [7]:
fruit = 'banane'
len(fruit)
Out[7]:
6
Remarque

Attention
Pour obtenir la dernière lettre d'une chaîne de caractères, vous pourriez être tentés à écrire quelque chose comme ceci :

In [8]:
longueur = len(fruit)
dernier = fruit[longueur]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-8-388bf9eed3ed> in <module>
      1 longueur = len(fruit)
----> 2 dernier = fruit[longueur]

IndexError: string index out of range

Mais cela va provoquer une ERREUR. La raison de IndexError est qu'il n'y a aucune lettre dans 'banane' ayant l'indice 6.
Puisque nous avons commencé à compter à partir de zéro, les six lettres sont numérotées de 0 à 5.
Pour obtenir le dernier caractère, vous devez soustraire 1 de longueur :

In [9]:
dernier = fruit[longueur - 1]
dernier
Out[9]:
'e'
Astuce

Vous pouvez utiliser des indices négatifs, qui comptent à l'envers à partir de la fin de la chaîne.
L'expression :

  • fruit[-1] donne la dernière lettre,
  • fruit[-2] donne l'avant-dernière,
  • et ainsi de suite.
In [10]:
fruit[-1]
Out[10]:
'e'
In [11]:
fruit[-2]
Out[11]:
'n'

3. Parcours avec une boucle for

Beaucoup de calculs impliquent le traitement d'une chaîne caractère par caractère.
Souvent, ils commencent au début, sélectionnent chaque caractère à tour de rôle, lui font quelque chose et continuent jusqu'à la fin.
Ce modèle de traitement est appelé un parcours.
Une façon d'écrire un tel parcours est une boucle while

In [12]:
index = 0
while index < len(fruit):
    lettre = fruit[index]
    print(lettre)
    index = index + 1
b
a
n
a
n
e

Cette boucle parcourt la chaîne et affiche chaque lettre sur une ligne individuelle.
La condition de la boucle est index < len(fruit),
donc lorsque l'indice devient égal à la longueur de la chaîne, la condition devient fausse, et le corps de la boucle ne s'exécute plus.
Le dernier caractère accédé est celui d'indice len(fruit) -1, qui est le dernier caractère de la chaîne.

Une autre façon d'écrire un parcours est d'utiliser une boucle for:

In [13]:
for lettre in fruit:
    print(lettre)
b
a
n
a
n
e

À chaque passage dans la boucle, le caractère suivant dans la chaîne est affecté à la variable lettre.
La boucle continue jusqu'à ce qu'il n'y ait aucun caractère restant.

4. Tranches de chaînes de caractères

Un segment de chaîne de caractères s'appelle une tranche ou slice en anglais.
La sélection d'une tranche est similaire à la sélection d'un caractère

Exemple

>>> texte = 'Monty Python'
>>> texte[0:5]
'Monty'
>>> texte[6:12]
'Python'

L'opérateur [n:m] retourne la partie de la chaîne allant du « n-ième » caractère, y compris celui-ci, au« m-ième » caractère, en excluant ce dernier.
Ce comportement est contre-intuitif, mais si vous imaginez les indices comme pointant entre les caractères, comme sur la Figure ci-dessous, cela peut vous aider. image.png

Remarques
  • Si vous omettez le premier indice(avant le deux-points), la tranche commence au début de la chaîne.
    Si vous omettez le second indice, la tranche s'étend jusqu'à la fin de la chaîne
>>> fruit = 'banane'
>>> fruit[:3]
'ban'
>>> fruit[3:]
'ane'
  • Si le premier indice est supérieur ou égal au second,
    le résultat est une chaîne vide, représentée par deux guillemets simples
>>> fruit = 'banane'
>>> fruit[3:3]
''

5. Méthodes de chaînes de caractères

Les chaînes de caractères fournissent des méthodes qui effectuent une variété d'opérations utiles.

Une méthode est semblable à une fonction - elle prend des arguments et renvoie une valeur -, mais la syntaxe d'appel est différente.

Au lieu de la syntaxe de fonction upper(mot), elle utilise la syntaxe de méthode, mot.upper().
Cette forme de notation pointée indique le nom de la méthode, upper, et le nom de la chaîne sur laquelle on applique la méthode, mot.
Les parenthèses vides indiquent que cette méthode ne prend aucun argument.

Un appel de méthode est appelé une invocation ; dans ce cas, nous dirions que nous invoquons upper sur mot.

  • Par exemple, la méthode upper prend une chaîne de caractères et retourne une nouvelle chaîne avec toutes les lettres en majuscule.
In [14]:
mot = 'banane'
nouveau_mot = mot.upper()
nouveau_mot
Out[14]:
'BANANE'
  • Méthode find

Cette méthode permet de trouver la position (l'indice) où le caractère choisi apparaît dans une chaine de caractère.

In [15]:
mot = 'banane'
index = mot.find('a')
index
Out[15]:
1

Dans cet exemple, nous invoquons find sur mot et passons la lettre que nous recherchons en tant que paramètre.

Remarque

Pour trier les lettres d'une chaîne de caractères, on utlise la fonction sorted(). Cette fonction retourne une liste rangée dans l'ordre alphabétique.

In [16]:
mot = 'banane'
sorted(mot)
Out[16]:
['a', 'a', 'b', 'e', 'n', 'n']
In [ ]: