Les tuples en langage Python#
En Python, un tuple (ou n-uplet) est une séquence ordonnée d'éléments semblable à une liste, mais présentant une caractéristique fondamentale : il est strictement immuable (immutable). Une fois créé en mémoire, il est impossible de lui ajouter, d'en retirer ou de modifier ses éléments.
1. Création et le piège du singleton#
On définit habituellement un tuple en entourant ses éléments de parenthèses (...) séparés par des virgules :
# Tuple vide
vide = ()
vide_alt = tuple()
# Tuple de coordonnées géographiques
coordonnees_paris = (48.8566, 2.3522)
# Les parenthèses sont optionnelles : c'est la virgule qui crée le tuple !
point = 10, 20
print(type(point)) # <class 'tuple'>
[!WARNING] Le piège classique du tuple à un seul élément :
Si vous écrivezt = (42), Python interprète les parenthèses comme une priorité mathématique et assigne un entier (int) !
Pour créer un tuple d'un seul élément (singleton), vous devez obligatoirement inclure une virgule terminale :
2. Pourquoi utiliser un tuple plutôt qu'une liste ?#
Pourquoi s'encombrer d'une structure immuable alors que les listes peuvent tout faire ?
| Avantage | Explication |
|---|---|
| Intégrité des données | Protège les constantes critiques (paramètres réseau, dimensions d'écran) contre toute modification accidentelle dans le code. |
| Performance et mémoire | Les tuples consomment moins de RAM et sont alloués plus rapidement par l'interpréteur CPython que les listes dynamiques. |
Hachabilité (hash) |
Les tuples peuvent servir de clés dans un dictionnaire ou d'éléments dans un ensemble (set), ce qui est strictement interdit pour les listes ! |
# Tentative de modification directe :
jours_semaine = ("Lundi", "Mardi", "Mercredi")
# jours_semaine[0] = "Dimanche" -> Lève immédiatement un TypeError !
3. Le déballage de tuples (Tuple Unpacking)#
Le déballage permet d'extraire simultanément chaque élément d'un tuple dans des variables distinctes en une seule affectation :
point_3d = (12.5, -4.0, 7.8)
# Déballage classique (le nombre de variables doit correspondre exactement)
x, y, z = point_3d
print(f"X={x}, Y={y}, Z={z}")
Déballage étendu avec l'opérateur étoile * (PEP 3132)#
Si vous ne connaissez pas à l'avance la taille de la séquence ou si vous ne vous intéressez qu'aux extrémités :
scores = (95, 88, 72, 65, 54, 40)
# Le premier score, le dernier score, et tout le reste dans une sous-liste :
premier, *intermediaires, dernier = scores
print("Vainqueur :", premier) # 95
print("Autres :", intermediaires) # [88, 72, 65, 54] (liste)
print("Dernier :", dernier) # 40
4. Retour de valeurs multiples dans une fonction#
En Python, une fonction ne peut formellement retourner qu'un seul objet. Toutefois, pour renvoyer plusieurs résultats à la fois, les développeurs Python tirent parti des tuples :
def calculer_statistiques(nombres: list[float]) -> tuple[float, float, float]:
"""Retourne simultanément la moyenne, le minimum et le maximum."""
moyenne = sum(nombres) / len(nombres)
minimum = min(nombres)
maximum = max(nombres)
# Retourne implicitement un tuple : (moyenne, minimum, maximum)
return moyenne, minimum, maximum
# Récupération immédiate par déballage
notes = [15.0, 12.0, 18.0, 10.0]
moy, note_min, note_max = calculer_statistiques(notes)
print(f"Moyenne = {moy:.2f} | Min = {note_min} | Max = {note_max}")
5. Les tuples nommés : collections.namedtuple#
Lorsque vous manipulez des tuples contenant de nombreux champs, y accéder par des indices numériques (personne[0], personne[1]) nuit à la lisibilité. La bibliothèque standard propose namedtuple pour créer des tuples dont les champs sont accessibles par leur nom :
from collections import namedtuple
# Définition du modèle de données
Ville = namedtuple("Ville", ["nom", "pays", "population"])
# Instanciation
lome = Ville("Lome", "Togo", 1_800_000)
paris = Ville("Paris", "France", 2_160_000)
# Accès par attribut lisible (dot notation)
print(f"Capitale : {lome.nom} ({lome.pays}) - Hab : {lome.population:,}")
6. Défi d'application#
Écrivez une fonction echanger_extremes(t: tuple) qui prend en entrée un tuple de longueur au moins 2 et retourne un nouveau tuple où le premier et le dernier élément sont intervertis, en exploitant le déballage étendu avec l'opérateur étoile *.
Commentaires