Les séquences immutables

Nous abordons maintenant des structures de données permettant de stocker plusieurs valeurs à la fois.

N-uplets - tuple

Un n-uplet (ou tuple en anglais) est une séquence de valeurs regroupées en un tout. On utilise les paranthèses pour représenter les n-uplets en Python, les valeurs sont séparées par des virgules. Par exemple le n-uplet (1, 4, 'a') contient trois valeurs 1, 4 et 'a'. On remarque ici qu’un n-uplet peut contenir des valeurs de types différents. Une variable peut être liée à un n-uplet.




(python_tuple)

Les valeurs contenues dans le n-uplet sont indicées (en commençant à 0). Il est possible d’accéder aux valeurs contenu dans un n-uplet avec la notation crochet : a[indice].




(python_tuple2)

Il faut veiller à ne pas tenter d’accéder à valeur en utilisant un indice trop grand. Dans l’exemple suivant, le n-uplet a possède 3 valeurs. Il est donc impossible d’accéder à la valeur d’indice 3 (on numérote en débutant à 0). Python génère une erreur dont le message est explicite : “tuple index out of range”.




(python_tuple3)

Il n’est pas possible de modifier les valeurs contenues dans un n-uplet. C’est un type dit immutable. L’exemple suivant entraine une erreur dont le message est là encore très clair : “‘tuple’ object does not support item assignment”.




(python_tuple4)

Pyhton dispose d’une fonction len qui permet de connaître le nombre de valeurs contenues dans un n-uplet.




(python_tuple5)

Il est impossible de modifier le contenu d’un n-uplet mais il est possible de concaténer des n-uplets ensemble pour en créer un nouveau avec l’opérateur +. Dans l’exemple suivant on utilise la fonction id qui permet d’obtenir l’identité d’un objet (son adresse en mémoire) afin de montrer que le n-uplet résultant de la concaténation est bien nouveau.




(python_tuple6)

Python permet de comparer des n-uplets afin de déterminer s’ils sont égaux où non.




(python_tuple7)

Il est possible de tester si un valeur est contenue dans un n-uplet avec l’opération in. Le résultat sera une valeur booléenne.




(python_tuple8)

Les n-uplets servent à regrouper des valeurs ensembles et à les manipuler comme un tout. Une fonction qui ne peut renvoyer qu’une seule valeur avec le mot return peut utiliser un n-uplet pour regrouper plusieurs valeurs en un tout.

L’exemple suivant propose une fonction qui trouve les zéro d’un polynome de degré deux. Suivant le polynome, il peut y avoir 0, 1 ou 2 solution. Un n-uplet nous permet de traiter tous les cas de manière identique.




(python_tuple9)

Chaînes de caractères - str

Nous avons déjà manipuler les chaînes de caractères sans vraiment expliquer leur fonctionnement. En Python, une chaîne de caractètes est une séquence et à ce titre est très proche d’un n-uplet. Ainsi, tout comme un n-uplet, il est possible d’accéder à un caractère en particulier de la chaîne à partir de son indice.




(python_str)

Tout comme un n-uplet il est impossible de modifier une chaine : “‘str’ object does not support item assignment”.




(python_str2)

Tout comme un n-uplet il est possible de connaître la longueur d’une chaine avec la fonction len, de concaténer des chaînes ensembles, de déterminer si deux chaînes sont égales ou de tester si une sous-chaine est contenue.




(python_str3)

Séquence de nombres - range

Python permet de générer automatiquement des séquences de nombres entiers. Une séquence est générée en utilisant la fonction range. En fonction du nombre de paramètre donné à range son fonctionnement varie. Avec une seule valeur v, range crée une séquence d’entiers compris entre 0 inclu et v exclu. Dans l’exemple suivant on crée tout d’abord une séquence de nombre entre 0 inclu et 10.




(python_range)

Attention, le comportement observé ici est en réalité différent de celui de Python. En théorie range ne produit pas des listes mais un générateur, c’est à dire un objet permet de parcourir toutes les valeurs souhaitées.

Pour réellement voir réellement les diffétentes valeurs de la séquence, il faudrait la convertir en list avec la fonction list ou en tupple comme dans l’exemple ci-dessous.

Le principe est que pour optimiser l’utilisation de sa mémoire, Python ne produit réellement la séquence de nombres que lorsqu’on lui demande explicitement. Dans la mesure du possible, il essaira de ne pas le faire.




(python_range2)

Comme toute séquence, il est possible d’utiliser les opérations que nous avons vu précédement comme la notation [] ou la longueur len.




(python_range3)

Python propose de construire des séquences de nombre entre deux valeurs et également entre deux valeurs avec un pas.




(python_range4)

Ce dernière notation nous permet de faire des séquences de nombres décroissants.




(python5)

Le slicing

Une opération particulièrement importante avec les séquences est le slicing. C’est la possibilité d’extraire une sous-séquence. L’exemple suivant extrait la sous-chaine contenant les 10 premiers caractères d’une chaine. On indique l’indice du premier et dernier élément à extraire séparé par ":". Tout comme pour range, le premier est inclu alors que le dernier est exclu.




(python_slicing)

On peut également indiquer que l’on part du début pour aller jusqu’à un certain indice, ou bien d’un certain indice pour aller jusqu’à la fin.




(python_slicing2)

Il est possible de préciser un pas. Ici, on extrait les valeurs depuis la première et jusqu’à la dernière mais on n’en conserve qu’une sur deux.




(python_slicing3)

Utiliser des indices négatifs indique que l’on débute depuis la fin de la liste. L’indice -1 représente donc le dernier élément de notre séquence, -2 l’avant dernier, ...




(python_slicing4)

Les séquences que nous manipulons sont immutables. Cela signifie que le résultat d’un slicing est bien une nouvelle séquence. L’opération de slicing est un moyen simple d’obtenir la copie d’une séquence.

Quelques clarifications

Voici des éléments supplémentaires et des clarifications sur le comportement des fonctions.

Next Section - Itérer sur les éléments des séquences