TP 2
STRUCTURES DE DONNÉES ET ITÉRATION – AKA PYTHONNERIES
Les exercices proposés sont (sauf erreur) faisables en n’utilisant que les concepts qui ont déjà été exposés. Cepen-
dant, il est souvent possible d’écrire quelque chose de plus «idiomatique» à l’aide de structures décrites plus loin
dans le TP ou en utilisant des fonctions de la bibliothèque standard. C’est ce qui a été fait dans le corrigé, tout en
essayant de ne pas sombrer dans l’ésotérisme.
Python 2, Python 3. . .
Le TD a été rédigé en utilisant Python 3, certains exemples peuvent donc demander une petite adaptation si l’on
travaille avec Python 2. En particulier :
print a été profondément modifié : c’était un statement en Python 2 (comme for,return. . .), c’est devenu une
fonction en Python 3. Je trouve personnellement que c’est une très bonne chose, et je vous encourage donc
à utiliser une solution très simple : from __future__ import print_function. Si vous rajoutez cette ligne au
début de votre fichier, print se comportera comme en Python 3 (et donc comme dans les exemples du TD).
L’utilisation de la fonction print est simple : elle accepte un nombre quelconque d’arguments, séparés par une
virgule, et les ache. Par défaut, elle rajoutera un espace entre chaque argument et un retour à la ligne à la fin,
ce que l’on peut modifier à l’aide des arguments optionnels sep et end :
>>> from __future__ import print_function
>>> a, b, c = t o t o , 42, [2, 3, 7]
>>> print(a, b, c, 11 + 12)
toto 42 [2 , 3, 7] 23
>>> print(a, b , c, 11 + 12, sep= ++ )
toto ++ 42 ++ [2 , 3, 7] ++ 23
>>> f o r ii n range (3):
print(i)
0
1
2
>>> f o r ii n range (3):
print(i, sep = , end = )
012
Une diérence un peu plus subtile est la prolifération d’itérateurs dits paresseux en Python 3. L’exemple le plus
simple est celui de range : en Python 2, range(5) renvoie la liste [0, 1, 2, 3, 4], en Python 3 une boîte noire
appelée range object. Le plus souvent cela ne change rien : for iin range(3): print(i) fait exactement la
même chose en Python 2 et en Python 3. Cependant, si l’on veut réellement générer une liste (et pas seulement
parcourir ses éléments), une étape supplémentaire est nécessaire en Python 3 :
Python 2
>>> l = range (5)
>>> print(l)
[0, 1, 2, 3, 4]
>>> print(list (l))
[0, 1, 2, 3, 4]
Python 3
>>> l = range (5)
>>> print(l)
range (0, 5)
>>> print(list (l))
[0, 1, 2, 3, 4]
Stage Python – ENS Lyon 1
Jean-Baptiste Bianquis [email protected]
1 Listes
1.1 Généralités
La structure de données sans doute la plus utilisée en python est la liste. Les listes python sont en fait des tableaux
dynamiques : on peut accéder à n’importe quel élément du tableau et le modifier en temps constant et on peut au
besoin ajouter des éléments en queue de tableau, dans le cas le pire en temps proportionnel à la taille du tableau et
en temps amorti constant 1.
Pour créer une liste, il sut de donner ses éléments :
>>> l = [ 1, 2, 3, ’ soleil ]
Comme on le voit, python n’impose pas que tous les éléments de la liste soient du même type.
1.2 Accès
On peut alors accéder à un élément par son numéro. Les éléments sont en eet indexés par leur numéro, en
commençant à zéro pour le premier :
>>> l[3]
’ soleil
>>> l[0]
1
Mais on peut aussi compter à partir du dernier :
>>> l[ -1]
’ soleil
>>> l[ -2]
3
>>> l[ -4]
1
Autrement dit, dans le cas où on lui donne un index négatif, python ajoute à celui-ci le nombre d’élément de la
liste avant d’aller chercher l’élément.
1.3 Modification
On peut changer la valeur de l’élément numéro 2 pour qu’elle vaille 7 par la commande l[2]=7
On peut obtenir la longueur d’une liste avec la fonction len.
1.4 Tranchage (slicing)
On peut découper une liste en «tranches» (opération connue sous le nom de «slicing» en anglais) :
Par exemple, pour obtenir les éléments de rangs 2 à 4 de la liste précédente :
>>> l[2:4]
[7, ’ soleil ]
Attention : ne pas oublier qu’en python, les intervalles d’entiers sont fermés à gauche et ouverts à droite. Quand
on demande les éléments de rangs compris entre 2 et 4, on obtient donc les éléments de rangs appartenant à ~2,4~.
On peut également remplacer une tranche d’une liste :
>>> l
[1, 2, 3, ’ soleil ]
>>> l[1:3] = [ ’ Bonjour , H e l l o ,’ Guten Tag ,’ Buongiorno ]
>>> l
[1, ’ Bonjour , H e l l o ,’ Guten Tag ,’ Buongiorno ,’ soleil ]
De manière générale, la syntaxe des tranches est l[start:stop:step] start désigne l’indice où commencer,
stop l’indice avant lequel il faut s’arrêter et step l’incrément à donner à l’indice à chaque étape. On peut omettre
ces valeurs start,stop,step, auquel cas python leur donne respectivement les valeurs 0, len(l) et 1. Ainsi
l[1::2] désigne les éléments de lde rang impair et l[::2] ceux de rang pair.
1. Autrement dit, l’ajout d’un unique élément à un tableau de taille npeut demander un temps constant, mais l’ajout de kéléments à un
tableau de taille ndemande au total au plus un temps proportionnel à n+k.
Stage Python – ENS Lyon 2
Jean-Baptiste Bianquis [email protected]
1.5 Aliasing
De manière générale, un objet python est représentée en machine par une suite d’octets dans la mémoire vive.
Lorsqu’on veut faire référence à un objet on le fait par son adresse en mémoire.
On peut obtenir l’adresse en mémoire d’un objet avec la fonction id
>>> a = [11 , 22, 33]
>>> id(a)
3072380108
(NB : l’adresse en question dépend de beaucoup de facteurs, vous n’obtiendrez pas la même que ci-dessus)
Dire qu’on met un objet dans une variable est un abus de langage : une variable python ne contient pas le moindre
objet mais seulement l’adresse d’un objet (on dit que la variable pointe vers l’objet).
Lorsqu’on copie le contenu d’une variable dans une autre, python se contente en fait de copier cette adresse :
>>> b = a
>>> id(b)
3072380108
Cela aura deux conséquences :
1. La copie du contenu d’une variable dans une autre se fait en temps constant (indépendant de la taille de l’objet
vers lequel elle pointe). C’est en particulier le cas lorsqu’on appelle une fonction : mettre un argument réel
de la fonction dans la variable jouant le rôle de paramètre formel se fait en temps constant.
2. Après la copie du contenu d’une variable dans une autre, les deux variables pointent vers le même objet.
Toute modification de l’un sera visible de l’autre, pour le meilleur et pour le pire. On dit que les deux
variables sont alias l’une de l’autre.
>>> a[0] = 44
>>> a
[44, 22, 33]
>>> b
[44, 22, 33]
Exercice 1
Comprendre la diérence entre :
>>> a = [11 , 22, 33]
>>> b = a
>>> a[0:3] = [17 , 42 , 561]
et
>>> a = [11 , 22, 33]
>>> b = a
>>> a = [17 , 42, 561]
Les questions d’aliasing sont récurrentes en informatique, et loin d’être spécifiques à python.
Exercice 2
Que valent aet baprès l’exécution du code suivant :
>>> a = [11 , 22, 33]
>>> b = [7, 14 , a]
>>> b
[7, 14, [11, 22, 33]]
>>> b[2][1]=17
>>> a[0] = 19
Stage Python – ENS Lyon 3
Jean-Baptiste Bianquis [email protected]
1.6 Concaténation
On peut concaténer deux listes avec +. C’est une opération qui renvoie une nouvelle liste :
>>> a = [2, 4, 6]
>>> b = [8, 10 , 12]
>>> c = a
>>> id(a)
3072535692
>>> id(c)
3072535692
>>> a = a + b
>>> id(a)
3072535852
>>> id(c)
3072535692
>>> a
[2, 4, 6, 8, 10 , 12]
>>> c
[2, 4, 6]
On peut concaténer une liste à la fin d’une liste existante avec +=. Attention, on modifie ainsi la liste donnée :
>>> a = [2, 4, 6]
>>> b = [8, 10 , 12]
>>> c = a
>>> id(a)
3072535468
>>> id(c)
3072535468
>>> a += b
>>> a
[2, 4, 6, 8, 10 , 12]
>>> id(a)
3072535468
>>> id(c)
3072535468
>>> a
[2, 4, 6, 8, 10 , 12]
>>> c
[2, 4, 6, 8, 10 , 12]
>>>
Au lieu de a += b, on peut aussi utiliser a.extend(b). Cette deuxième méthode est sans doute à privilégier «pé-
dagogiquement» (elle fait exactement la même chose, avec exactement les mêmes performances, mais lève toute
ambiguïté sur le fait que la liste a été modifiée en place).
On peut ajouter un élément à la fin d’une liste en utilisant la méthode append :
>>> a = [2, 4, 6]
>>> a. append (22)
>>> a
[2, 4, 6, 22]
1.7 Insertion
On peut insérer un élément à un index donné avec la méthode insert :
>>> a = [2, 4, 6]
>>> a. insert (2 , 18)
>>> a
[2, 4, 18 , 6]
Notez que l’index passé est la position qu’aura le nouvel élément. L’ancien élément qui était à cette position, ainsi
que tous les suivants, sont décalés d’un cran vers la droite. La méthode insert peut être remplacée par un coup de
slicing : a[2:2] = [18].
Stage Python – ENS Lyon 4
Jean-Baptiste Bianquis [email protected]
1.8 Suppression
Enfin, on peut enlever un élément avec l’instruction del :
>>> a = [2, 4, 6, 8, 10, 12, 14]
>>> d e l a[3]
>>> a
[2, 4, 6, 10, 12, 14]
>>> d e l a [2:4]
>>> a
[2, 4, 12 , 14]
Une autre façon d’enlever les éléments est la méthode pop, qui de plus retourne l’élément enlevé :
>>> a = [2, 4, 6, 8, 10, 12, 14]
>>> a.pop ()
14
>>> a
[2, 4, 6, 8, 10 , 12]
>>> a. pop (3)
8
>>> a
[2, 4, 6, 10, 12]
Enfin la méthode remove enlève le premier élément égal à l’élément donné :
>>> a = [2, 4, 6, 8, 10, 12, 14]
>>> a. remove (12)
>>> a
[2, 4, 6, 8, 10 , 14]
1.9 Appartenance
L’opérateur in permet de tester l’appartenance à une liste :
>>> 9 i n [3, 5, 7, 11 , 13]
False
>>> 7 i n [3, 5, 7, 11 , 13]
True
C’est une construction utile, qu’on trouve régulièrement sous la forme
>>> i f vi n premiers:
... print(v, " e s t un nombre p r e m i e r . " )
On dispose aussi de not in, qui s’utilise sous la forme vnot in l.
1.10 Autre
Voir les méthodes reverse,count,sort.
Voir également les fonctions sum,min,max et sorted.
2 Tuples
Les tuples, ou n-uplets, sont très similaires aux listes :
>>> l = (11 , 22, 33)
>>> l[2]
33
>>> len (l)
3
>>> u = l + (44 , 55, 66)
>>> u
(11, 22 , 33 , 44 , 55 , 66)
Stage Python – ENS Lyon 5
1 / 15 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !