Tuples

Objectifs

À la fin de cette séquence vous serez capable de :

  • Manipuler les objets de base Python
  • Parcourir séquentiellement un tuple
  • Indicer et découper un tuple

1. Définition et syntaxe

Un tuple est une collection ordonnée d’objets de types quelconques séparés par des virgules. En français, on parle aussi de n-uplet pour désigner un tuple.
Comme une chaîne de caractères, un tuple, une fois créé, est immuable c’est-à-dire non modifiable. Cela signifie qu'un tuple est défini une fois pour toutes à sa création ; il ne peut pas être modifié ensuite.
Syntaxe :

In [ ]:
mon_objet = "spam", "egg", 10, True, 5.7, "Hello world"
print(mon_objet)
In [ ]:
catalogue = "café", "farine", "yaourts", "jus de fruits", "pâtes", "jambon", "petits gâteaux"
print(catalogue)

Bonnes pratiques : Pour améliorer la lisibilité du code, il est vivement conseillé d’encadrer le tuple par des parenthèses.
Ainsi :

In [ ]:
catalogue = ("café", "farine", "yaourts", "jus de fruits", "pâtes", "jambon", "petits gâteaux")
In [ ]:
# mieux encore
catalogue = ("café",
            "farine",
            "yaourts",
            "jus de fruit",
            "pâtes",
            "jambon",
           "petits gâteaux"
            )

Remarque :
Un tuple est aussi appelé un enregistrement.

Un tuple composé d'un seul objet

In [ ]:
t = ('spam',) 

Un tuple vide

In [ ]:
tuple_vide = ()
In [ ]:
type(tuple_vide)

2. Accéder aux éléments d'un tuple

Comme les chaînes de caratères, un tuple est une séquence en Python. Autrement dit, un ensemble fini et ordonné d’objets numérotés de \(0\) à \(n-1\) si le tuple est composé de \(n\) objets.
Ainsi, un tuple peut être parcouru objet par objet. On dit qu’un tuple est un objet itérable.
On considère le tuple ci-après.

In [2]:
catalogue = ("café",
            "farine",
            "yaourts",
            "jus de fruit",
            "pâtes",
            "jambon",
           "petits gâteaux")
In [ ]:
index = int(input("\nSaisir le numéro d'indice d'un article dans le catalogue : "))
print(f"À l'indice {index} on a {catalogue[index]}")

Que renvoie les instructions suivantes :

In [ ]:
un_tuple[2]
In [ ]:
un_tuple[-1]
In [ ]:
un_tuple[1:]
In [ ]:
un_tuple[:2]
In [ ]:
un_tuple[-6:5]

3. Manipuler les tuples

Déterminer le nombre d'éléments d'un tuple

In [ ]:
len(catalogue)

Concaténer des tuples

In [ ]:
(1, 2, 3) + ('a', 'b', 'c')

Test d'appartenance ou de non appatenance à un tuple

In [ ]:
"pâtes" in catalogue
In [ ]:
"pâtes" not in un_tuple

Connaître les méthodes applicables aux tuples

In [ ]:
dir(tuple)

Construire un tuple à partir d'une chaîne de caractères

In [1]:
adn = 'ATGCCGCGAT'
In [2]:
tuple_adn = tuple(adn)
In [3]:
print(tuple_adn)
Out[3]:
('A', 'T', 'G', 'C', 'C', 'G', 'C', 'G', 'A', 'T')

Le tuple unpacking (affectation multiple ou simultanée, on dit aussi déballage)

In [ ]:
a, b, c = ('spam', 3, 'guanine')
In [ ]:
print(a)
In [ ]:
b
In [ ]:
c

Permuter les variables référençants deux objets

In [ ]:
i = 2
j = 5
In [ ]:
# On permute les valeurs de i et j à l'aide d'une variable temporaire
tmp = i
i = j
j = tmp
In [1]:
var1 = 7
var2 = 10
In [ ]:
# On permute les valeurs de var1 et var2
var1, var2 = var2, var1

Un tuple est non mutable non (modifiable)

In [2]:
catalogue = ("café",
            "farine",
            "yaourts",
            "jus de fruit",
            "pâtes",
            "jambon",
           "petits gâteaux")
  • Que renvoie l'expression catalogue[2] ?
  • Est-ce que catalogue.append("eau") fonctionne ? Pourquoi ?
  • Est-ce que catalogue[0] = "malware" fonctionne ? Pourquoi ?

4. Parcourir un tuple à l'aide d'une boucle for

Comme avec une chaîne de caractères, on utilise, l'algorithme du parcours séquentiel.

In [2]:
catalogue = ("café",
            "farine",
            "yaourts",
            "jus de fruit",
            "pâtes",
            "jambon",
           "petits gâteaux"
            )
In [ ]:
for produit in catalogue:
    print(produit)

L'autre variante du parcours utilisant les indices

In [ ]:
#Parcourir une chaîne par les index 
for i in range(len(catalogue)):
    print(catalogue[i])

5. La sous-classe namedtuple du module collections

5.1. Définition

Cette sous-classe permet de créer un tuple avec des champs nommés ; ce qui rend le code plus lisible et explicite. Les tuples nommés peuvent être utilisés partout où les n-uplets natifs sont utilisés, et ils ajoutent la possibilité d'accéder à leurs champs par leur nom au lieu de leur index de position.

5.2. Syntaxe

In [ ]:
from collections import namedtuple

# Avec une liste
nom_du_tuple = namedtuple("nom_du_tuple", ["champ1", "champ2", ..., "champN"])

# Avec une chaîne d'espaces
nom_du_tuple = namedtuple("nom_du_tuple", "champ1 champ2 ... champN")

# Avec une chaîne de champs séparés par des virgules
nom_du_tuple = namedtuple("nom_du_tuple", "champ1, champ2,..., champN")
In [ ]:
M = (3, 5)
In [ ]:
M[0]
In [ ]:
from collections import namedtuple
In [ ]:
Point = namedtuple("Point", "x y")
In [ ]:
M = Point(3, 5)
In [ ]:
M

Nous avons maintenant un point avec deux champs nommés de manière appropriée, x et y.
Ce point fournit une représentation plus conviviale et descriptive, Point(x = 3, y = 5). Il permet d'accéder aux coordonnées en utilisant la notation par points, ce qui est pratique, lisible et explicite.
On peut également utiliser des indices pour accéder à la valeur de chaque coordonnée comme avec un tuple.

In [ ]:
#Un autre exemple
Vecteur = namedtuple("Vecteur", ["x", "y"])
In [ ]:
u = Vecteur(-1, 4)
In [ ]:
u
In [ ]:
Vecteur = namedtuple("Vecteur", "x, y")
In [ ]:
v = Vecteur(-3, -7)
In [ ]:
v

5.2. Accéder aux éléments d'un n-uplet nommé

In [ ]:
#Accès par le nom
M.x
In [ ]:
#Accès par index
M[0]
In [ ]:
# Accès par la fonction built-in (intégrée) getattr()
getattr(v, 'x')
In [ ]:
getattr(v, 'y')
In [ ]:
Musicien = namedtuple("Musicien", "nom titres")
In [ ]:
Jackson = Musicien("Michael Jackson", ["Billie Jean", "Beat it"])
In [ ]:
Jackson
In [ ]:
Johnny_halliday = Musicien("Jean-Philippe Smet", ["L'Envie", "Allumer le feu", "Que je t'aime"])
In [ ]:
Johnny_halliday
In [ ]:
m = Musicien("Bach", ["Toccata", "Fugue"])
print(m.nom)
print(m.titres)