I. Créer une liste
Une liste rassemble plusieurs valeurs sous un seul nom, dans un ordre fixé. Là où une variable ne retient qu'un nombre, une liste en retient autant qu'on veut, ce qui permet de travailler sur une série entière.
Définir une liste en extension consiste à écrire tous ses éléments, séparés par des virgules, entre crochets.
notes = [12, 15, 8, 17, 11]
La liste vide s'écrit [], et la fonction len donne le nombre d'éléments : ici, len(notes) vaut .
La méthode append ajoute un élément à la fin d'une liste. Partir d'une liste vide et la remplir dans une boucle est le schéma le plus courant.
carres = []
for i in range(1, 11):
carres.append(i * i)
À la fin, la liste carres contient les carrés des entiers de à .
La définition en compréhension décrit la liste par la règle qui produit ses éléments, à la manière d'un ensemble défini par une propriété.
carres = [i * i for i in range(1, 11)]
pairs = [n for n in range(20) if n % 2 == 0]
La première ligne remplace la boucle précédente. La seconde ajoute une condition de filtrage.
Les deux écritures produisent exactement la même liste. La compréhension est plus courte, la boucle plus souple lorsque le calcul de chaque terme demande plusieurs lignes.
II. Indices et modification
Chaque élément d'une liste porte un numéro de position appelé indice. La numérotation commence à zéro.
notes = [12, 15, 8, 17, 11]
notes[0] # 12, le premier élément
notes[4] # 11, le dernier
notes[-1] # 11 également, en comptant depuis la fin
Une liste de éléments a des indices allant de à . Écrire notes[5] pour une liste de cinq éléments provoque une erreur. Ce décalage d'une unité est la première source de bugs sur les listes.
| instruction | effet |
|---|---|
L[i] = v | remplace l'élément d'indice par |
L.append(v) | ajoute à la fin |
L.insert(i, v) | insère à l'indice |
L.remove(v) | supprime la première occurrence de |
del L[i] | supprime l'élément d'indice |
Ces instructions modifient la liste sur place, sans en créer une nouvelle.
III. Parcourir une liste
Le parcours par éléments convient lorsque seule la valeur compte.
for note in notes:
print(note)
Le parcours par indices devient nécessaire lorsque la position elle-même intervient, par exemple pour comparer deux listes de même longueur.
for i in range(len(notes)):
print(i, notes[i])
def somme(L):
s = 0
for x in L:
s = s + x
return s
def moyenne(L):
return somme(L) / len(L)
La seconde fonction réutilise la première : c'est le principe de la programmation modulaire, où chaque fonction fait une seule chose et sert de brique aux suivantes.
def maximum(L):
m = L[0]
for x in L:
if x > m:
m = x
return m
La variable m retient le plus grand élément rencontré jusque-là. Elle est initialisée avec le premier élément, et non avec zéro, sans quoi une liste de nombres négatifs donnerait un résultat faux.
Le schéma est presque toujours le même : initialiser une variable de travail, parcourir la liste en mettant cette variable à jour, puis renvoyer le résultat après la boucle.
L'erreur classique consiste à placer le return à l'intérieur de la boucle : la fonction s'arrête alors au premier tour, sans avoir vu le reste de la liste.
IV. Listes et suites numériques
Les listes servent naturellement à stocker les premiers termes d'une suite, notion étudiée dans le chapitre d'algèbre de l'année.
Pour la suite définie par et :
def premiers_termes(n):
L = [2]
for i in range(n):
L.append(3 * L[-1] - 1)
return L
L'écriture L[-1] désigne le dernier terme calculé, c'est-à-dire celui dont on a besoin pour obtenir le suivant.
def fibonacci(n):
L = [0, 1]
for i in range(n):
L.append(L[-1] + L[-2])
return L
Une boucle non bornée convient lorsque le nombre d'étapes n'est pas connu à l'avance.
def seuil(limite):
u = 2
n = 0
while u <= limite:
u = 3 * u - 1
n = n + 1
return n
La fonction renvoie le rang à partir duquel la suite dépasse la valeur demandée.
Passer à la pratique
9 exercices corrigés sur ce chapitre.
