python:bases:tuples

Dictionnaires Listes Sommaire Python et microPython

[Mise à jour le : 30/6/2021]

  • Mots-clés : immuable, unpacking, tuple
Les mots ci-dessous sont dits “réservés”. Ils ne peuvent pas être utilisés comme nom de variable. Les mots soulignés sont une nouveauté de Python 3. Les mots en gras sont utilisés dans cette page.
and continue finally is raise
as def for lambda return
assert del from None True
async elif global nonlocal try
await else if not while
break except import or with
class False in pass yield
  • Fonctions natives (built-in)1) utilisées dans les exemples : list(), print(), range(), tuple().

Le tuple est une séquence. Comme la liste, il référence des objets hétérogène. On peut lui appliquer le test d'appartenance avec in, accéder aux différents éléments avec un crochet, faire du slicing etc. La raison d'être principale du type tuple est de construire des objets globalement immuables.

Un tuple, ou n-uplet est une liste de constantes. Il est immuable donc non modifiable. Les parenthèses ( ) délimitent les tuples.

Exemple

*.py
tp = () # Création d'un tuple vide (peu d'intérêt)
# Création de tuples
tp = (6,) # un élément nécessite une virgule
tp = (1,True,4.5,8) # différent types
Un tuple avec un seul élément nécessite une virgule.
*.py
# Accès à une valeur en lecture
print(tp[2]) # Résultat : 4
  • par addition
Bien que le type tuple soit immuable, il est tout à fait légal d'additionner deux tuples, et l'addition va produire un nouveau tuple

Exemple

*.py
tuple1 = (1, 2,)
tuple2 = (3, 4,)
print('addition', tuple1 + tuple2) # addition (1, 2, 3, 4)
  • à partir d'une liste

Exemple

*.py
liste = list(range(10)) # résultat[0,1,2,3,4,5,6,7,8,9]
liste[9] = 'Inconnu' # résultat[0,1,2,3,4,5,6,7,8,'Inconnu']
del liste [2:5] # résultat : [0, 1, 5, 6, 7, 8, 'Inconnu']
mon_tuple = tuple(liste) # résultat : (0, 1, 5, 6, 7, 8, 'Inconnu')
Comme l'objet est immuable, la modification est impossible. Il faut transformer le tuple en liste et créer un nouveau tuple à partir de la liste modifiée.

Exemple

*.py
 
L'affectation dans Python peut concerner plusieurs variables à la fois.

Exemple 1

*.py
couple = (100, 'spam')
gauche, droite = couple
print('gauche:', gauche, 'droite:', droite) # résultat gauche: 100 droite: spam

Exemple 2

*.py
# membre droit: une liste
liste = [1, 2, 3]
# membre gauche : un tuple
gauche, milieu, droit = liste
print('gauche:', gauche, 'milieu:', milieu, 'droit:', droit) # gauche: 1 milieu: 2 droit: 3
Les seules contraintes fixées par Python sont que :
- le terme à droite du signe = soit un itérable (tuple, liste, string, etc.) ;
- le terme à gauche soit écrit comme un tuple ou une liste - notons tout de même que l'utilisation d'une liste à gauche est rare et peu pythonique ;
- les deux termes aient la même longueur - en tout cas avec les concepts que l'on a vus jusqu'ici, mais voir aussi plus bas l'utilisation de *arg avec le extended unpacking.

Exemple 3

Il est possible de faire une boucle for qui itère sur une seule liste mais qui agit sur plusieurs variables.
*.py
entrees = [(1, 2), (3, 4), (5, 6)]
for a, b in entrees:
    print(f"a={a} b={b}") 
 
'''
a=1 b=2
a=3 b=4
a=5 b=6
'''
Le mécanisme ici est une extension de sequence unpacking ; Python vous autorise à mentionner une seule fois, parmi les variables qui apparaissent à gauche de l'affectation, une variable précédée de *.

Exemple 1

*.py
reference = [1, 2, 3, 4, 5]
a, *b, c = reference
print(f"a={a} b={b} c={c}") # a=1 b=[2, 3, 4] c=5

Cela peut s'avérer pratique, lorsque par exemple on s'intéresse seulement aux premiers éléments d'une structure :

Exemple 2

*.py
# si on sait que data contient prenom, nom, 
# et un nombre inconnu d'autres informations
data = [ 'Jean', 'Dupont', '061234567', '12', 'rue du four', '57000', 'METZ', ]
 
# on peut utiliser la variable _
# ce n'est pas une variable spéciale dans le langage,
# mais cela indique au lecteur que l'on ne va pas s'en servir
prenom, nom, *_ = data
print(f"prenom={prenom} nom={nom}") # résultat : prenom=Jean nom=Dupont
On peut utiliser plusieurs fois la même variable dans la partie gauche de l'affectation.

Cette technique n'est utilisée en pratique que pour les parties de la structure dont on n'a que faire dans le contexte. Dans ces cas-là, il arrive qu'on utilise le nom de variable _.

Exemple 3

*.py
entree = [1, 2, 3]
# 
_, milieu, _ = entree
print('milieu', milieu) # résultat : milieu 2
 
ignored, ignored, right = entree
print('right', right)   # résultat :right 3


1)
Fonctions toujours disponibles.
  • python/bases/tuples.txt
  • Dernière modification: 2021/08/11 18:05
  • de phil