📊 Graphiques, List, Set
🏗️ en construction 🏗
- Liste (list)
- For (séquence)
- Compréhension de liste
- Matplotlib
- Ensemble (set)
- Exercices
Jusqu'ici nous avons vu les 4 types de données de base en Python :
- les entiers (
int
) : 5, -3, 42, 0, ... - les nombres à virgule (
float
) : 3.14, -0.001, 2.0, ... - les chaînes de caractères (
str
) : "Bonjour", 'a', "123", ... - les booléens (
bool
) :True
,False
Mais Python propose aussi des types de données plus complexes, comme les listes, les tuples, les ensembles et les dictionnaires.
Nous allons commencer par les listes.
Une liste est une collection ordonnée et modifiable d'éléments, qui peuvent être de n'importe quel type de données.
Les listes sont définies par des crochets []
, avec les éléments séparés par des virgules.
Par exemple :
ma_liste = [1, 2, 3, 4, 5]
noms = ["Alice", "Bob", "Charlie"]
mixte = [1, "deux", 3.0, True]
On peut accéder aux éléments d'une liste en utilisant leur index, qui commence à 0.
Par exemple, pour accéder au premier élément de ma_liste
, on écrit ma_liste[0]
:
print(ma_liste[0]) # Affiche 1
print(noms[1]) # Affiche "Bob"
print(mixte[2]) # Affiche 3.0
On peut aussi utiliser des indices négatifs pour accéder aux éléments en partant de la fin de la liste :
print(ma_liste[-1]) # Affiche 5 (dernier élément)
print(noms[-2]) # Affiche "Bob" (avant-dernier élément)
print(mixte[-3]) # Affiche "deux" (troisième élément en partant de la fin)
On peut aussi utiliser la notation de tranche (slicing) pour accéder à une sous-liste :
print(ma_liste[1:4]) # Affiche [2, 3, 4] (éléments d'index 1 à 3)
print(noms[:2]) # Affiche ["Alice", "Bob"] (2 premiers éléments)
print(mixte[2:]) # Affiche [3.0, True] (à partir de l'index 2 jusqu'à la fin)
On peut modifier les éléments d'une liste en utilisant leur index et en leur assignant une nouvelle valeur :
ma_liste[0] = 10
print(ma_liste) # Affiche [10, 2, 3, 4, 5]
On peut ajouter des éléments à une liste en utilisant la méthode append()
pour ajouter un élément à la fin de la liste :
ma_liste.append(6)
print(ma_liste) # Affiche [10, 2, 3, 4, 5, 6]
Ou la méthode insert()
pour insérer un élément à une position spécifique :
ma_liste.insert(1, 15) # Insère 15 à l'index 1
print(ma_liste) # Affiche [10, 15, 2, 3, 4, 5, 6]
On peut supprimer des éléments en utilisant la méthode remove()
pour supprimer la première occurrence d'une valeur spécifique :
ma_liste.remove(15)
print(ma_liste) # Affiche [10, 2, 3, 4, 5, 6]
Ou la méthode pop()
pour supprimer un élément à une position spécifique (par défaut, le dernier élément) et le retourner :
dernier = ma_liste.pop()
print(dernier) # Affiche 6
print(ma_liste) # Affiche [10, 2, 3, 4, 5]
On peut obtenir la longueur d'une liste (le nombre d'éléments qu'elle contient) en utilisant la fonction intégrée len()
:
print(len(ma_liste)) # Affiche 5
On peut vérifier si un élément est présent dans une liste en utilisant l'opérateur in
:
if 3 in ma_liste:
print("3 est dans la liste")
else:
print("3 n'est pas dans la liste")
3 in ma_liste
est une expression booléenne qui renvoie True
si 3
est dans ma_liste
, sinon False
.
Les listes en Python sont ordonnées, ce qui signifie que les éléments conservent leur ordre d'insertion.
On peut utiliser la fonction sorted()
pour obtenir une nouvelle liste triée sans modifier l'originale :
liste_triee = sorted(ma_liste)
print(liste_triee) # Affiche [2, 3, 4, 5, 10]
print(ma_liste) # Affiche [10, 2, 3, 4, 5] (originale non modifiée)
On peut aussi trier une liste en utilisant la méthode sort()
pour trier la liste en place (modifie la liste originale) :
ma_liste.sort()
print(ma_liste) # Affiche [2, 3, 4, 5, 10]
On peut trier dans l'ordre décroissant en passant le paramètre reverse=True
:
noms.sort(reverse=True)
print(noms) # Affiche ['Charlie', 'Bob', 'Alice']
Dans cet exemple, la liste noms
est triée en ordre alphabétique décroissant, car les chaînes de caractères sont comparées selon l'ordre lexicographique.
Si on fait :
liste1 = [1, 2, 3]
liste2 = liste1
alors liste2
n'est pas une copie de liste1
, mais une autre référence vers la même liste.
Donc si on modifie liste2
, liste1
est aussi modifiée :
liste2.append(4)
print(liste1) # Affiche [1, 2, 3, 4]
Pour faire une vraie copie, on peut utiliser la méthode copy()
:
liste1 = [1, 2, 3]
liste2 = liste1.copy()
liste2.append(4)
print(liste1) # Affiche [1, 2, 3]
print(liste2) # Affiche [1, 2, 3, 4]
On peut concaténer deux listes en utilisant l'opérateur +
:
liste1 = [1, 2, 3]
liste2 = [4, 5, 6]
liste3 = liste1 + liste2
print(liste3) # Affiche [1, 2, 3, 4, 5, 6]
On peut aussi répéter une liste en utilisant l'opérateur *
:
liste = [1, 2, 3]
liste_repetee = liste * 3
print(liste_repetee) # Affiche [1, 2, 3, 1, 2, 3, 1, 2, 3]
Vous l'aurez peut-être deviné, on peut même avoir des listes de listes :
liste_de_listes = [[1, 2, 3], ["a", "b", "c"], [True, False]]
print(liste_de_listes[0]) # Affiche [1, 2, 3]
print(liste_de_listes[1][1]) # Affiche "b"
Une boucle for
peut aussi être utilisée pour itérer directement sur les éléments d'une liste (ou d'autres collections comme les tuples, ensembles, dictionnaires, etc.).
La syntaxe est la suivante :
for element in liste:
# instructions à exécuter
Voici un exemple simple d'utilisation de for
pour parcourir une liste de noms et les afficher :
noms = ["Alice", "Bob", "Charlie"]
for nom in noms:
print("Bonjour", nom)
Dans cet exemple, la boucle for
parcourt chaque élément de la liste noms
et l'affecte à la variable nom
à chaque itération.
Ensuite, elle exécute l'instruction print()
pour afficher un message de bienvenue pour chaque nom.
Exécutez ce code en mode débogage pour bien comprendre son fonctionnement.
Mettez un point d'arrêt sur la ligne 2 et avancez une ligne à la fois pour suivre l'évolution de la variable nom
.
On peut réécrire la boucle for
ci-dessus en utilisant une boucle while
ou une boucle for
avec la fonction range()
comme suit :
Boucle while
noms = ["Alice", "Bob", "Charlie"]
i = 0
while i < len(noms):
nom = noms[i]
print("Bonjour", nom)
i += 1
Boucle for
avec range()
noms = ["Alice", "Bob", "Charlie"]
for i in range(len(noms)):
nom = noms[i]
print("Bonjour", nom)
Remarquez que dans ces deux versions, nous utilisons la fonction len()
pour obtenir la longueur de la liste noms
et nous accédons aux éléments de la liste en utilisant leur index ([i]
).
Cependant, la version avec la boucle for nom in noms
est plus concise et plus facile à lire.
- Selon le contexte, une boucle
for
sur une liste peut être plus efficace et plus claire qu'une bouclewhile
ou une bouclefor
avecrange()
, surtout lorsque l'on n'a pas besoin de l'index des éléments. - Mais parfois, on a besoin de l'index pour certaines opérations.
- Aussi, la boucle
while
offre plus de flexibilité pour des conditions d'arrêt plus complexes.
Voici un autre exemple qui utilise une boucle for
pour créer une nouvelle liste contenant les carrés des nombres d'une liste initiale :
nombres = [1, 2, 3, 4, 5]
carres = []
for nombre in nombres:
carres.append(nombre ** 2) # Ajoute le carré du nombre à la liste carres
print("Les carrés des nombres sont :", carres)
Dans cet exemple, la boucle for
parcourt chaque nombre dans la liste nombres
, calcule son carré (nombre ** 2
) et l'ajoute à la liste carres
en utilisant la méthode append()
.
Exécutez-le en mode débogage pour suivre l'évolution des listes nombres
et carres
à chaque itération.
Parfois, on a besoin à la fois de l'index et de la valeur des éléments lors de l'itération sur une liste.
Dans ce cas, on peut utiliser la fonction intégrée enumerate()
, qui renvoie à la fois l'index et la valeur de chaque élément.
Voici comment l'utiliser :
noms = ["Alice", "Bob", "Charlie"]
for index, nom in enumerate(noms):
print(f"Index {index} : Bonjour {nom}")
Dans cet exemple, enumerate(noms)
renvoie des paires (index, nom)
pour chaque élément de la liste noms
, où index
est l'index de l'élément et nom
est la valeur de l'élément.
Exécutez-le en mode débogage pour suivre l'évolution des variables index
et nom
à chaque itération.
La compréhension de liste est une manière concise et élégante de créer des listes en Python. Elle permet de générer une nouvelle liste en appliquant une expression à chaque élément d'une séquence (comme une liste, un tuple, etc.) et en option, en filtrant les éléments selon une condition.
La syntaxe générale de la compréhension de liste est la suivante :
nouvelle_liste = [expression for element in sequence if condition]
expression
: l'opération ou la transformation à appliquer à chaque élément.element
: la variable qui prend chaque valeur de la séquence.sequence
: la séquence (comme une liste) que l'on parcourt.condition
(optionnelle) : une condition pour filtrer les éléments.
Voici un exemple simple pour créer une liste des carrés des nombres pairs d'une liste initiale :
nombres = [1, 2, 3, 4, 5, 6]
carres_pairs = [x ** 2 for x in nombres if x % 2 == 0]
print(carres_pairs) # Affiche [4, 16, 36]
Dans cet exemple :
- Nous parcourons chaque nombre
x
dans la listenombres
. - Nous calculons le carré de
x
(x ** 2
) uniquement six
est pair (if x % 2 == 0
). - Le résultat est une nouvelle liste
carres_pairs
contenant les carrés des nombres pairs.
Exécutez ce code en mode débogage pour bien comprendre son fonctionnement.
Mettez un point d'arrêt sur la ligne 2 et avancez une ligne à la fois pour suivre l'évolution de la variable x
et de la liste carres_pairs
.
- Concision : La compréhension de liste permet d'écrire moins de lignes de code pour accomplir la même tâche.
- Lisibilité : Elle rend le code plus lisible en exprimant clairement l'intention de cr éer une nouvelle liste basée sur une transformation ou un filtrage.
- Performance : La compréhension de liste est souvent plus rapide que l'utilisation de boucles
for
traditionnelles pour créer des listes.
Vous l'aurez peut-être deviné, on peut même avoir des compréhensions de liste imbriquées (nested list comprehensions) :
liste = [[j for j in range(i)] for i in range(5)]
print(liste) # Affiche [[ ], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]
Matplotlib est une bibliothèque de visualisation de données en Python qui permet de créer des graphiques statiques, animés et interactifs. Elle est largement utilisée pour l'analyse de données, la science des données et l'apprentissage-machine (machine learning).
Afin de pouvoir utiliser Matplotlib dans un projet, il faut d'abord installer la bibliothèque Matplotlib dans votre projet.
Matplotlib est une bibliothèque qui contient plusieurs modules.
Le module le plus couramment utilisé pour créer des graphiques est pyplot
.
Pour l'importer dans un script, on utilise la commande suivante :
import matplotlib.pyplot as plt
Ici, nous importons le module pyplot
de Matplotlib et lui donnons l'alias plt
pour simplifier son utilisation dans le code.
Nous pourrons ainsi appeler les fonctions du module pyplot
en utilisant le préfixe plt.
Par exemple :
plt.plot(x, y) # Pour tracer un graphique linéaire
plt.show() # Pour afficher le graphique
Plutôt que :
matplotlib.pyplot.plot(x, y)
matplotlib.pyplot.show()
qui est plus long et moins lisible.
Créons d'abord un graphique très simple, avec un seul point :
import matplotlib.pyplot as plt
# Données à tracer
x = [0] # Liste contenant un seul point x=0
y = [0] # Liste contenant un seul point y=0
# Créer le graphique
plt.plot(x, y, 'o') # 'o' indique que nous voulons un point
# Afficher le graphique
plt.show()
Exécutez ce code.
Dans cet exemple :
- Nous importons la bibliothèque Matplotlib en utilisant
import matplotlib.pyplot as plt
. - Nous définissons deux listes
x
ety
qui contiennent les coordonnées du point à tracer, sous la forme de listes. - Nous utilisons la fonction
plt.plot(x, y, 'o')
pour créer le graphique. Le troisième paramètre'o'
indique que nous voulons afficher des points (des cercles) aux coordonnées spécifiées. - Enfin, nous affichons le graphique avec
plt.show()
.
Ajoutons maintenant plus de points (en modifiant les listes x
et y
) :
x = [-100, -50, 0, 50, 100] # Liste des points x
y = [10000, 2500, 0, 2500, 10000] # Liste des points y (carré de x)
Exécutez votre script modifié.
Nous allons maintenant ajouter encore plus de points pour obtenir une courbe :
x = [i for i in range(-100, 101)] # Liste des entiers de -100 à 100
y = [i ** 2 for i in x] # Liste des carrés des entiers
Exécutez encore votre script.
Puisqu'il y a maintenant beaucoup de points, on peut remplacer le marqueur 'o'
par '-'
pour tracer une ligne continue :
plt.plot(x, y, '-') # Tracer une ligne sans marqueur
Exécutez encore votre script pour voir la différence.
Vous devriez voir une belle parabole s'afficher.
On veut maintenant afficher en rouge les points où x est un multiple de 10 :
# Ajouter des points rouges pour x multiple de 10
x_rouge = [i for i in x if i % 10 == 0]
y_rouge = [i ** 2 for i in x_rouge]
plt.plot(x_rouge, y_rouge, 'ro') # 'ro' indique des points rouges
Ajoutez ce code avant plt.show()
et exécutez encore votre script.
Ajoutons maintenant la courbe miroir en vert pour y = -x² :
# Ajouter la courbe miroir y = -x² en vert
y_miroir = [-i ** 2 for i in x]
plt.plot(x, y_miroir, 'g-') # 'g-' indique une ligne verte
Ajoutez ce code avant plt.show()
et exécutez encore votre script.
Pour rendre le graphique plus compréhensible, on peut ajouter un titre et des étiquettes (labels) aux axes :
plt.title("Graphique de y = x² et y = -x²")
plt.xlabel("Axe des X")
plt.ylabel("Axe des Y")
Ajoutez ce code avant plt.show()
et exécutez encore votre script.
L'étiquette de l'axe des Y se retrouve un peu coupée ?
On peut ajuster la mise en page avec :
plt.tight_layout() # Ajuste la mise en page pour éviter les coupures
Ajoutez ce code avant plt.show()
et exécutez encore votre script.
On peut aussi ajouter une grille pour mieux visualiser les points :
plt.grid(True) # Active la grille
Ajoutez ce code avant plt.show()
et exécutez encore votre script.
Aussi, si vous avez plusieurs courbes, vous pouvez ajouter une légende pour les différencier.
Pour ce faire, ajoutez une valeur (sous forme de str
) au paramètre label à chaque courbe dans les appels à
plt.plot()` :
plt.plot(x, y, '-', label='y = x²')
plt.plot(x_rouge, y_rouge, 'ro', label='x multiple de 10')
plt.plot(x, y_miroir, 'g-', label='y = -x²')
puis ajoutez l'appel à la fonction plt.legend()
avant plt.show()
:
plt.legend() # Affiche la légende
Exécutez encore votre script.
Au lieu d'afficher le graphique à l'écran avec plt.show()
, on peut le sauvegarder dans un fichier image (PNG, JPG, SVG, etc.) en utilisant la fonction plt.savefig()
:
plt.savefig("mon_graphique.png") # Sauvegarde le graphique en format PNG
plt.savefig("mon_graphique.svg") # Sauvegarde le graphique en format SVG
plt.savefig("mon_graphique.jpg") # Sauvegarde le graphique en format JPG
plt.savefig("mon_graphique.pdf") # Sauvegarde le graphique en format PDF
Ajoutez ce code avant plt.show()
et exécutez encore votre script.
Vous devriez voir les fichiers image créés dans le répertoire de votre script.
Matplotlib offre de nombreuses fonctionnalités avancées pour personnaliser vos graphiques. Voici quelques exemples :
- Graphiques à barres : Utilisez
plt.bar()
pour créer des graphiques à barres. - Histogrammes : Utilisez
plt.hist()
pour créer des histogrammes. - Graphiques en nuage de points : Utilisez
plt.scatter()
pour créer des graphiques en nuage de points. - Personnalisation des couleurs et des styles : Vous pouvez personnaliser les couleurs, les styles de ligne, les marqueurs, etc.
- Sous-graphiques : Utilisez
plt.subplot()
pour créer plusieurs graphiques dans une même figure. - Annotations : Ajoutez des annotations à vos graphiques avec
plt.annotate()
.
Pour en savoir plus sur ces fonctionnalités et d'autres options avancées, consultez la documentation officielle de Matplotlib.
Nous verrons plus tard la bibliothèque Numpy qui permet de manipuler efficacement des tableaux de données, ce qui est souvent utile en combinaison avec Matplotlib pour la visualisation de données.
Voici un exemple simple de création d'un graphique à barres avec Matplotlib :
import matplotlib.pyplot as plt
# Données à tracer
categories = ['A', 'B', 'C', 'D']
valeurs = [10, 15, 7, 12]
# Créer le graphique à barres
plt.bar(categories, valeurs, color='skyblue')
# Ajouter un titre et des étiquettes
plt.title("Graphique à barres")
plt.xlabel("Catégories")
plt.ylabel("Valeurs")
# Afficher le graphique
plt.show()
On peut ajouter des barres d'erreur :
erreurs = [1, 2, 1, 2]
plt.bar(categories, valeurs, yerr=erreurs, capsize=5, color='skyblue')
On peut créer plusieurs graphiques dans une même figure en utilisant la fonction plt.subplot()
.
Voici un exemple :
import matplotlib.pyplot as plt
import math
# Créer une figure avec 4 sous-graphiques (2 lignes, 2 colonnes)
plt.subplot(2, 2, 1) # Premier sous-graphique
x1 = [i/10 for i in range(-100, 101)]
y1 = [i ** 2 for i in x1]
plt.plot(x1, y1, 'b-')
plt.title("y = x²")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.subplot(2, 2, 3) # Troisième sous-graphique
x2 = [i/10 for i in range(-100, 101)]
y2 = [math.sin(i) for i in x2]
plt.plot(x2, y2, 'r-')
plt.title("y = sin(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.subplot(2, 2, 2) # Deuxième sous-graphique
categories = ['A', 'B', 'C', 'D']
valeurs = [10, 15, 7, 12]
erreurs = [1, 2, 1, 2]
plt.bar(categories, valeurs, yerr=erreurs, capsize=5, color='skyblue')
plt.title("Graphique à barres")
plt.xlabel("Catégories")
plt.ylabel("Valeurs")
plt.subplot(2, 2, 4) # Quatrième sous-graphique
x = [i for i in range(-100, 101)]
y = [i ** 2 for i in x]
plt.plot(x, y, '-', label='y = x²')
x_rouge = [i for i in x if i % 10 == 0]
y_rouge = [i ** 2 for i in x_rouge]
plt.plot(x_rouge, y_rouge, 'ro', label='x multiple de 10')
y_miroir = [-i ** 2 for i in x]
plt.plot(x, y_miroir, 'g-', label='y = -x²')
plt.title("Graphique de y = x² et y = -x²")
plt.xlabel("Axe des X")
plt.ylabel("Axe des Y")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show() # Afficher les 4 sous-graphiques
Résultat :
Un ensemble (set
) est une collection non ordonnée et non indexée d'éléments uniques en Python. Les ensembles sont utiles lorsque vous souhaitez stocker des éléments sans doublons et effectuer des opérations mathématiques comme l'union, l'intersection et la différence.
Les ensembles sont définis par des accolades {}
ou en utilisant la fonction set()
. Par exemple :
mon_ensemble = {1, 2, 3, 4, 5}
autre_ensemble = set([4, 5, 6, 7, 8])
- Unicité : Les ensembles ne peuvent pas contenir de doublons. Si vous essayez d'ajouter un élément déjà présent dans l'ensemble, il ne sera pas ajouté :
mon_ensemble.add(2) # Ne fait rien car 2 est déjà dans l'ensemble
print(mon_ensemble) # Affiche {1, 2, 3, 4, 5}
- Non ordonné : Les éléments d'un ensemble n'ont pas d'ordre spécifique. Vous ne pouvez pas accéder aux éléments par index.
- Modifiable : Comme avec une liste, vous pouvez ajouter ou supprimer des éléments d'un ensemble après sa création.
Voici quelques opérations courantes que vous pouvez effectuer avec les ensembles en Python :
- Ajouter un élément : Utilisez la méthode
add()
pour ajouter un élément à un ensemble.
mon_ensemble.add(6)
print(mon_ensemble) # Affiche {1, 2, 3, 4, 5, 6}
- Supprimer un élément : Utilisez la méthode
remove()
pour supprimer un élément spécifique (lève une erreur si l'élément n'existe pas) oudiscard()
(ne lève pas d'erreur).
mon_ensemble.remove(3)
mon_ensemble.discard(10) # Ne fait rien si 10 n'est pas dans l'ensemble
print(mon_ensemble) # Affiche {1, 2, 4, 5, 6}
- Vérifier l'appartenance : Utilisez l'opérateur
in
pour vérifier si un élément est dans un ensemble.
if 4 in mon_ensemble:
print("4 est dans l'ensemble")
- Union : Utilisez l'opérateur
|
pour obtenir l'union de deux ensembles.
union = mon_ensemble | autre_ensemble
print(union) # Affiche {1, 2, 4, 5, 6, 7, 8}
- Intersection : Utilisez l'opérateur
&
pour obtenir l'intersection de deux ensembles.
intersection = mon_ensemble & autre_ensemble
print(intersection) # Affiche {4, 5}
- Différence : Utilisez l'opérateur
-
pour obtenir la différence entre deux ensembles.
difference = mon_ensemble - autre_ensemble
print(difference) # Affiche {1, 2, 6}
Vous pouvez utiliser une boucle for
pour itérer sur les éléments d'un ensemble, bien que l'ordre des éléments ne soit pas garanti :
for element in mon_ensemble:
print(element)
✏️ Exercices de compréhension
Sans ordinateur, dessinez sur papier la figure qui sera générée par ce code Matplotlib :
import matplotlib.pyplot as plt
...
plt.show()
🔨 Exercices de création
La suite de Conway (ou suite audioactive) est une suite de nombres entiers où chaque terme est généré en décrivant le terme précédent.
- Le premier terme est 1.
- Le deuxième terme est 11 (un 1).
- Le troisième terme est 21 (deux 1).
- Le quatrième terme est 1211 (un 2, un 1).
- Le cinquième terme est 111221 (un 1, un 2, deux 1).
- Le sixième terme est 312211 (trois 1, deux 2, un 1).
- ...
Écrivez un programme qui calcule et affiche les 10 premiers termes de cette suite.