Aller au contenu

Partie 1 : Les p-uplets (tuples)


Un p-uplet (ou tuple en anglais) est une collection ordonnée et non modifiable de valeurs. On dit qu'un tuple est immuable (immutable).

>>> coordonnees = (3, 7)
>>> couleur_rgb = (255, 128, 0)
>>> eleve = ("Dupont", "Marie", 16)

Un p-uplet peut contenir des éléments de types différents : entiers, flottants, chaînes, booléens, etc.

Le nom « p-uplet » vient de la généralisation des mots courants :

Nombre d'élémentsNom
2couple (ou paire)
3triplet
4quadruplet
nn-uplet
pp-uplet (cas général)

On crée un tuple avec des parenthèses (ou même sans, grâce à la virgule) :

>>> t1 = (1, 2, 3)
>>> t2 = 1, 2, 3 # les parenthèses sont facultatives
>>> t3 = (42,) # tuple d'un seul élément : la virgule est obligatoire
>>> t4 = () # tuple vide
>>> type(t1)
<class 'tuple'>

Comme pour les chaînes de caractères, on accède aux éléments par leur indice (en commençant à 0) :

>>> eleve = ("Dupont", "Marie", 16)
>>> eleve[0]
'Dupont'
>>> eleve[1]
'Marie'
>>> eleve[2]
16

Les indices négatifs permettent de compter depuis la fin :

>>> eleve[-1]
16
>>> eleve[-2]
'Marie'

La fonction len() renvoie le nombre d'éléments :

>>> len(eleve)
3

On peut parcourir un tuple avec une boucle for :

couleurs = ("rouge", "vert", "bleu")
for c in couleurs:
print(c)

Un tuple est non modifiable : on ne peut ni ajouter, ni supprimer, ni modifier un élément.

>>> point = (3, 7)
>>> point[0] = 5
TypeError: 'tuple' object does not support item assignment

C'est la différence fondamentale avec les listes (tableaux), qui sont modifiables.


On peut affecter chaque élément d'un tuple à une variable en une seule ligne. C'est le déballage (unpacking) :

>>> coordonnees = (3, 7)
>>> x, y = coordonnees
>>> x
3
>>> y
7

Le nombre de variables doit correspondre au nombre d'éléments :

>>> nom, prenom, age = ("Dupont", "Marie", 16)
>>> print(f"{prenom} {nom}, {age} ans")
Marie Dupont, 16 ans

Un tuple est le moyen naturel de renvoyer plusieurs valeurs depuis une fonction :

def min_max(liste):
"""Renvoie le minimum et le maximum d'une liste."""
return (min(liste), max(liste))
resultat = min_max([4, 7, 1, 9, 3])
print(resultat) # (1, 9)
# Avec déballage :
petit, grand = min_max([4, 7, 1, 9, 3])
print(petit) # 1
print(grand) # 9

Autre exemple :

def division_euclidienne(a, b):
"""Renvoie le quotient et le reste de a divisé par b."""
return (a // b, a % b)
q, r = division_euclidienne(17, 5)
print(f"17 = 5 x {q} + {r}") # 17 = 5 x 3 + 2

Même si un tuple est immuable, certaines opérations sont possibles car elles créent un nouveau tuple :

>>> (1, 2) + (3, 4) # concaténation
(1, 2, 3, 4)
>>> (1, 2) * 3 # répétition
(1, 2, 1, 2, 1, 2)
>>> 3 in (1, 2, 3, 4) # appartenance
True
>>> (1, 2, 3).index(2) # position d'un élément
1
>>> (1, 2, 2, 3, 2).count(2) # nombre d'occurrences
3

Avec un tuple classique, il faut se souvenir de la position de chaque information :

eleve = ("Dupont", "Marie", 16, "1ere3")
# eleve[0] = nom ? prenom ? On ne sait plus...

Python propose les namedtuples du module collections, qui associent un nom à chaque champ :

from collections import namedtuple
Eleve = namedtuple("Eleve", ["nom", "prenom", "age", "classe"])
e = Eleve("Dupont", "Marie", 16, "1ere3")
print(e.nom) # Dupont
print(e.prenom) # Marie
print(e.age) # 16
print(e.classe) # 1ere3

On accède aux champs par leur nom (plus lisible) tout en conservant l'accès par indice :

>>> e[0]
'Dupont'
>>> e.nom
'Dupont'
  • Le code est plus lisible : e.nom est plus clair que e[0].
  • Le tuple reste immuable : on ne peut pas modifier e.nom.
  • On peut l'utiliser comme un tuple classique (parcours, déballage, etc.).

PropriétéTuple
Syntaxe(a, b, c) ou a, b, c
OrdonnéOui (indice 0, 1, 2...)
ModifiableNon (immuable)
Types mélangésOui
Accès par indicet[0], t[-1]
Déballagex, y = (3, 7)
Usage principalRenvoyer plusieurs valeurs, données constantes
P-uplet nomménamedtuple : accès par nom (e.prenom)