W3docs

Déballage de tuples en Python : Guide complet

Apprenez le déballage de tuples Python : syntaxe de base, expressions star, tuples imbriqués, déballage en boucle et erreurs courantes avec des exemples.

Le déballage de tuple (aussi appelé déballage d'itérable) vous permet d'affecter les éléments d'un tuple — ou de tout itérable — à des variables individuelles en une seule instruction. Cette page couvre tout, de la syntaxe de base aux modèles avancés tels que les expressions star, le déballage imbriqué et le déballage en boucle.

Qu'est-ce que le déballage de tuple ?

Lorsque vous déballez un tuple, Python associe chaque élément à une variable correspondante sur le côté gauche de =. Le nombre de variables doit correspondre exactement au nombre d'éléments (sauf si vous utilisez une expression star, abordée ci-dessous).

python— editable, runs on the server

Les parenthèses autour du tuple sont facultatives — 1, 2, 3 est aussi un tuple. Ces deux lignes sont équivalentes :

a, b, c = (1, 2, 3)
a, b, c = 1, 2, 3   # same result

Pourquoi utiliser le déballage de tuple ?

Affectation de variables concise

Sans déballage, vous avez besoin d'une ligne par élément :

python— editable, runs on the server

Échanger des variables

Le déballage permet d'échanger deux valeurs en une seule ligne. Python évalue entièrement le côté droit avant d'effectuer l'affectation, donc aucune variable temporaire n'est nécessaire :

python— editable, runs on the server

Lire les valeurs de retour d'une fonction

Les fonctions qui renvoient plusieurs valeurs retournent en réalité un tuple. Le déballage donne immédiatement un nom significatif à chaque valeur :

def min_max(numbers):
    return min(numbers), max(numbers)

lo, hi = min_max([3, 1, 4, 1, 5, 9, 2, 6])

print(lo)  # 1
print(hi)  # 9

Sans déballage, vous écririez result[0] et result[1], ce qui est moins lisible.

Déballage étendu avec l'opérateur star

Lorsque vous ne connaissez pas (ou ne vous souciez pas) du nombre d'éléments intermédiaires, préfixez une variable avec * pour capturer tout ce qui ne correspond pas à un emplacement nommé. La variable avec star reçoit toujours une liste, même si elle ne capture aucun élément.

Capturer une queue

first, *rest = (1, 2, 3, 4, 5)

print(first)  # 1
print(rest)   # [2, 3, 4, 5]

Capturer une tête

*start, last = (1, 2, 3, 4, 5)

print(start)  # [1, 2, 3, 4]
print(last)   # 5

Capturer une section intermédiaire

first, *middle, last = (10, 20, 30, 40, 50)

print(first)   # 10
print(middle)  # [20, 30, 40]
print(last)    # 50

Seule une variable avec star est autorisée par instruction de déballage. En utiliser deux ou plus lève une SyntaxError.

Ignorer des éléments avec _

La convention Python utilise _ comme nom de variable de rebut. C'est un identifiant valide — Python l'affecte normalement — mais par convention il signale « je n'ai pas besoin de cette valeur ».

x, _, z = (10, 99, 30)

print(x)  # 10
print(z)  # 30
# _ holds 99 but we do not use it

Combinez _ avec une expression star pour ignorer de nombreux éléments :

first, *_ = (10, 20, 30, 40)

print(first)  # 10
# *_ swallows 20, 30, 40

Déballage de tuples imbriqués

Si un tuple contient un autre tuple, vous pouvez déballer les deux niveaux en une seule instruction en reproduisant l'imbrication avec des parenthèses :

python— editable, runs on the server

Cela fonctionne à n'importe quelle profondeur, mais un imbrication trop profonde nuit à la lisibilité — envisagez plutôt de déballer en plusieurs étapes.

Déballage dans les boucles for

Vous pouvez déballer chaque élément d'un itérable directement dans l'instruction for. C'est particulièrement utile avec des listes de tuples :

pairs = [(1, 'one'), (2, 'two'), (3, 'three')]

for num, word in pairs:
    print(num, word)

# 1 one
# 2 two
# 3 three

Déballage avec enumerate()

enumerate() retourne des paires (index, valeur) que vous pouvez déballer directement :

fruits = ('apple', 'banana', 'cherry')

for i, fruit in enumerate(fruits):
    print(i, fruit)

# 0 apple
# 1 banana
# 2 cherry

Cela évite le suivi manuel des index et constitue le modèle Python idiomatique pour itérer sur une séquence lorsque vous avez besoin à la fois de la position et de la valeur.

Déballage avec zip()

zip() associe les éléments de deux itérables, et vous pouvez déballer chaque paire dans la boucle :

names = ('Alice', 'Bob', 'Carol')
scores = (92, 87, 95)

for name, score in zip(names, scores):
    print(name, score)

# Alice 92
# Bob 87
# Carol 95

Erreurs courantes

Trop ou pas assez de valeurs

Python lève une ValueError si le nombre de variables ne correspond pas au nombre d'éléments (et qu'aucune expression star n'est présente) :

a, b = (1, 2, 3)
# ValueError: too many values to unpack (expected 2)
a, b, c = (1, 2)
# ValueError: not enough values to unpack (expected 3, got 2)

Corrigez la discordance ou utilisez une expression star pour absorber les éléments supplémentaires.

Deux variables avec star

first, *middle, *last = (1, 2, 3, 4)
# SyntaxError: multiple starred expressions in assignment

Seule une variable * est autorisée par instruction de déballage.

Référence rapide

ModèleExempleCe que ça fait
Basiquea, b, c = tAffecte chaque élément à une variable nommée
Star en queuefirst, *rest = tPremier élément nommé ; le reste capturé dans une liste
Star en tête*start, last = tDernier élément nommé ; le reste capturé dans une liste
Star au milieufirst, *mid, last = tPremier et dernier nommés ; le milieu capturé dans une liste
Ignorer unx, _, z = tÉlément du milieu ignoré par convention
Ignorer plusieursfirst, *_ = tSeul le premier élément est conservé
Imbriquéa, (b, c), d = tTuple interne déballé dans la même instruction
Bouclefor x, y in pairs:Chaque paire déballée à chaque itération

Chapitres associés

Pratique

Pratique
What does Python assign to the starred variable when you write `first, *rest = (1, 2, 3, 4, 5)`?
What does Python assign to the starred variable when you write `first, *rest = (1, 2, 3, 4, 5)`?
Was this page helpful?