Listes - Notions de base#
Lecture d'une base de données en Python#
Une base de données est particulièrement utile quand elle est connectée à une application. Avec Python, cela est par exemple possible grâce au module sqlite3. Sur cette page, ce module a déjà été chargé. De plus, la base de données de l'application de commande d'une pizzeria a été créée. Son schéma relationnel est donné ci-dessous.
import pathlib
import sqlite3
path = pathlib.Path('database.sqlite')
exists = path.exists()
db = sqlite3.connect(path)
if not exists:
db.executescript(pathlib.Path('pizzeria.sql').read_text())
def execute_sql(request):
results = db.execute(request).fetchall()
if results == None or results == [] :
return
if len(results[0]) == 1:
return [x[0] for x in results]
return results
On peut dès lors utiliser la fonction execute_sql() prenant en paramètre la requête SQL que l'on souhaite exécuter sur cette base de données. On peut récupérer le résultat de cette requête en faisant précéder la fonction d'une variable (de manière analogue à un input()).
Ainsi, le code ci-dessous permet de récupérer tous les noms de pizzas, et de les stocker dans la variable noms avant de les afficher.
noms = execute_sql('select nom from Pizza')
print(noms)
De manière similaire, en modifiant la requête SQL, on pourrait récupérer et afficher tous les prix des pizzas :
résultats = execute_sql('select prix from Pizza')
print("Prix des pizzas : ", résultats)
Evidemment, les requêtes SQL peuvent contenir toutes les instructions vues dans le précédent chapitre, comme, par exemple, des WHERE :
cheap_pizzas = execute_sql('select nom from Pizza WHERE prix <= 15')
print("Les pizzas les moins chères sont :", cheap_pizzas)
Qu'est-ce qu'une liste ?#
Comme vous pouvez le constater dans les exemples ci-dessus, le code Python contient à chaque fois une seule variable (noms, résultats, cheap_pizzas). Cependant, lorsqu'on affiche cette variable, de nombreuses valeurs sont affichées. C'est parce que ces variables sont des listes.
Là où une variable de type int, float, str, ou bool ne pouvait contenir qu'une seule valeur, une list peut en contenir plusieurs. Celles-ci sont très pratiques quand un programme contient une grande quantité de données, afin de toutes les enregistrer dans une seule variable.
Les listes précédentes ont été créées via la base de données, mais il est également possible de les créer soi-même. Une liste est entourée de crochets [] et les valeurs sont séparées par des virgules ,.
panier = ["Poires", "Champignons", "Raviolis", "Pêches"]
print("Dans le panier il y a :", panier)
notes_math = [3.5, 4.8, 5.7, 4.1, 4.5, 5, 3.8, 5.9, 3.2, 4.4, 6]
print("Mes notes en math sont :", notes_math)
Astuce
Pour écrire des crochets sur :
Windows :
[AltGr+ è ou]AltGr+ !Mac :
[Option+ 5 ou]Option+ 6
Indexation#
L'indexation permet d'accéder à un élément précis d'une liste. Pour ce faire, on peut faire suivre une liste d'une paire de crochets [] entre lesquelles on écrit l'index de l'élément souhaité. L'index correspond à la position de l'élément dans la liste, sachant que le premier élément a l'index 0, le deuxième l'index 1, etc.
utilisateurs = execute_sql("SELECT nom FROM Utilisateur")
print("Liste complète :", utilisateurs)
print("Premier utilisateur", utilisateurs[0])
print("5ème utilisateur :", utilisateurs[4])
Avec l'exemple suivant, on peut sélectionner n'importe quel utilisateur grâce à son index.
utilisateurs = execute_sql("SELECT nom FROM Utilisateur")
index = int(input("Quel index sélectionnes-tu ?"))
utilisateur_sélectionné = utilisateurs[index]
print("Tu as sélectionné :", utilisateur_sélectionné)
Important
Le premier élément d'une liste est toujours à l'index 0.
Dans une liste de n éléments, le dernier élément sera à l'index n-1.
Fonctions sur les listes#
En Python, il existe de nombreuses fonctions très pratiques pouvant être utilisées sur les listes. En voici quelques-unes qui seront utiles dans le cadre de ce cours.
len(ma_liste): retourne le nombre (=la longueur) d'éléments dansma_listelettres = ["S", "A", "L", "U", "T"] print(len(lettres))
ma_liste.append(element): ajoute un élément à la fin dema_listeoutils = ["tournevis", "vis", "vis", "vis", "clous", "marteau"] outils.append("scie") outils.append("hache") print(outils)ma_liste.remove(element): retire 1x l'élément dema_listeoutils = ["tournevis", "vis", "vis", "vis", "clous", "marteau"] outils.remove("clous") outils.remove("vis") print(outils)
Exercices#
Exercice 1#
Répondez aux questions ci-dessous sans exécuter de programme, en lisant simplement la liste.
animaux = ["chat", "chien", "lapin", "hamster", "furet"]
Que vaut
animaux[0]?Que vaut
animaux[3]?Que vaut
len(animaux)?Que vaut
animaux[len(animaux) - 1]?Que vaut
animaux[5]? (écrivezerreursi cette instruction ne fonctionne pas)
Solution
Le premier élément est à l'index 0, donc le quatrième est à l'index 3.
La liste contient 5 éléments, mais le dernier est à l'index 4 : animaux[len(animaux) - 1]
est la façon habituelle d'atteindre le dernier élément d'une liste sans connaître sa longueur à
l'avance.
animaux[5] provoque une erreur list index out of range : c'est l'erreur la plus courante avec
les listes. Dans une liste de n éléments, les index valides vont de 0 à n-1.
Exercice 2#
Les trois instructions ci-dessous sont exécutées l'une après l'autre. Suivez le contenu de la liste à la main, puis répondez.
sac = ["pomme", "pain", "eau"]
sac.append("pomme")
sac.remove("pomme")
À la fin, que vaut
len(sac)?À la fin, que vaut
sac[0]?À la fin, que vaut
sac[2]?
Solution
Après le append, la liste vaut ["pomme", "pain", "eau", "pomme"].
Le remove ne retire qu'une seule occurrence, et c'est la première rencontrée : c'est
donc la pomme du début qui disparaît, pas celle de la fin. La liste finale vaut
["pain", "eau", "pomme"].
La liste a donc bien retrouvé sa longueur de départ, mais son contenu a changé d'ordre : le
premier élément n'est plus pomme mais pain.
Exercice 3#
Chacun des programmes suivants comporte au moins une erreur. Parfois, cette erreur fait directement buguer le programme avec un message d'erreur rouge. D'autres fois, le programme s'exécute correctement, mais son résultat n'est pas logique.
Corrigez chacun de ces codes de manière à ce qu'ils s'exécutent correctement et affichent un résultat logique.
1couleurs_arc_en_ciel = "rouge" "orange" "jaune" "vert" "bleu" "indigo" "violet" 2print(couleurs_arc_en_ciel)
1profs_d_informatique = [Canvel, Marro, Dutoit, Blank, Lehmann, Jan] 2print(profs_d_informatique)
1ordre_d_arrivée = ["Isaac", "Victor", "Pascal", "Lucien", "Bruno", "Aurélien"] 2print("Gagnant de la course :", ordre_d_arrivée[1])
1pizzas = execute_sql("SELECT nom FROM Pizza") 2 3n_pizzas = pizzas.len() 4print("Il y a", n_pizzas, "pizzas différentes")
1sac = [] #Définit une liste vide 2objet = input("Quel objet veux-tu mettre dans ton sac ?") 3while objet != "STOP": 4 append(sac.objet) 5 objet = input("Quel autre objet veux-tu mettre dans ton sac ?") 6print("Contenu du sac", sac)
1#Retire tous les 0 de la liste 2bits = [1, 0, 1, 1, 0, 1, 0] #Ne pas toucher à cette ligne 3bits.remove(0) 4print(bits)
Solution
1couleurs_arc_en_ciel = ["rouge", "orange", "jaune", "vert", "bleu", "indigo", "violet"] 2print(couleurs_arc_en_ciel)
1profs_d_informatique = ["Canvel", "Marro", "Dutoit", "Blank", "Lehmann", "Jan"] 2print(profs_d_informatique)
1#La 1ère personne est la 1ère arrivée à la fin de la course 2ordre_d_arrivée = ["Isaac", "Victor", "Pascal", "Lucien", "Bruno", "Aurélien"] 3print("Gagnant de la course :", ordre_d_arrivée[0])
1pizzas = execute_sql("SELECT nom FROM Pizza") 2 3n_pizzas = len(pizzas) 4print("Il y a", n_pizzas, "pizzas différentes")
1sac = [] #Définit une liste vide 2objet = input("Quel objet veux-tu mettre dans ton sac ?") 3while objet != "STOP": 4 sac.append(objet) 5 objet = input("Quel autre objet veux-tu mettre dans ton sac ?") 6print("Contenu du sac", sac)
1#Retire tous les 0 de la liste 2bits = [1, 0, 1, 1, 0, 1, 0] #Ne pas toucher à cette ligne 3bits.remove(0) 4bits.remove(0) 5bits.remove(0) 6print(bits)
remove()ne retire qu'une seule occurrence de la valeur, et la liste en contient trois : il faut donc l'appeler trois fois. Répéter une instruction autant de fois que nécessaire n'est évidemment pas satisfaisant : à la page suivante,if ... in ...permettra d'écrirewhile 0 in bits: bits.remove(0), qui fonctionne quel que soit le nombre de zéros.
Exercice 4#
Ecrivez un programme qui recherche toutes les adresses emails des utilisateurs de l'application de la pizzeria, les stocke dans une variable
emails, puis les affiche.
1
Ecrivez un programme qui recherche tous les numéros de téléphone commençant par
078puis les affiche.
1
Solution
1emails = execute_sql("SELECT email FROM Utilisateur")
2print("Emails :", emails)
1tel = execute_sql("SELECT telephone FROM Utilisateur WHERE telephone LIKE '078%'")
2print("n° de téléphone commençant par 078 :", tel)
Exercice 5#
Complétez le programme suivant en utilisant l'indexation de manière à ce que le programme affiche le texte suivant:
rouge
noir
brun
bleu
1couleurs = ["noir", "blanc", "brun", "gris", "rouge", "jaune", "bleu"]
2
3#Complétez les index corrects
4print(couleurs[...])
5print(couleurs[...])
6print(couleurs[...])
7print(couleurs[...])
Solution
1couleurs = ["noir", "blanc", "brun", "gris", "rouge", "jaune", "bleu"]
2print(couleurs[4])
3print(couleurs[0])
4print(couleurs[2])
5print(couleurs[6])
Exercice 6#
Le programme ci-dessous recherche tous les prix des pizzas et, avec le ORDER BY, les trie du plus petit au plus grand. Complétez ce programme de manière qu'il affiche uniquement le prix le plus bas et le plus élevé. Souvenez-vous que :
Le 1er élément d'une liste est toujours à l'index 0
Le dernier élément d'une liste de longueur n est à l'index n-1
La longueur d'une liste est donnée avec la fonction
len()
1prix = execute_sql("SELECT prix FROM Pizza ORDER BY prix ASC")
2
3print("Prix le plus bas :")
4print("Prix le plus haut:")
Solution
1prix = execute_sql("SELECT prix FROM Pizza ORDER BY prix ASC")
2
3print("Prix le plus bas :", prix[0])
4print("Prix le plus haut:", prix[len(prix) - 1])
Comme la requête trie les prix du plus petit au plus grand, le prix le plus bas est
forcément le premier élément de la liste, donc celui d'index 0. Le prix le plus haut est
le dernier, donc celui d'index len(prix) - 1. Écrire prix[len(prix)] provoquerait une
erreur, car cet index n'existe pas.
Exercice 7#
Créez une liste, nommée
sportsavec les éléments suivants:kayak,escrimeetescalade.Affichez la liste et son nombre d'éléments.
Demandez un sport à l'utilisateur et ajoutez-le à la liste
sports.Afficher la liste et son nombre d'éléments.
Effacez l'élément
escalade.Affichez la liste et son nombre d'éléments.
1# Écrivez le programme ici
Solution
1sports = ["kayak", "escrime", "escalade"]
2print(sports, len(sports))
3sport = input("Entrer un sport: ")
4sports.append(sport)
5print(sports, len(sports))
6sports.remove("escalade")
7print(sports, len(sports))
Exercice 8#
Dans la base de données de la pizzeria, la colonne description de la table Pizza contient les ingrédients. Le programme ci-dessous doit alors permettre de sélectionner toutes les descriptions possédant respectivement l'ingrédient jambon et champignon, puis d'afficher leur nombre. Finalement, le programme affichera quel ingrédient est le plus utilisé.
Complétez le programme ci-dessous de manière qu'il fonctionne correctement.
1pizza_avec_jambon = execute_sql("SELECT nom FROM Pizza WHERE description ...")
2pizza_avec_champignons = execute_sql("SELECT nom FROM Pizza WHERE description ...")
3
4print("Nombre de pizzas avec du jambon :", ...)
5print("Nombre de pizzas avec des champignons :", ...)
6
7if ... :
8 print("Il y a plus de pizzas avec champignons")
9else:
10 print("Il y a plus de pizzas avec du jambon")
Solution
1pizza_avec_jambon = execute_sql("SELECT nom FROM Pizza WHERE description LIKE '%jambon%'")
2pizza_avec_champignons = execute_sql("SELECT nom FROM Pizza WHERE description LIKE '%champignon%'")
3
4print("Nombre de pizzas avec du jambon :", len(pizza_avec_jambon))
5print("Nombre de pizzas avec des champignons :", len(pizza_avec_champignons))
6
7if len(pizza_avec_champignons) > len(pizza_avec_jambon):
8 print("Il y a plus de pizzas avec champignons")
9else:
10 print("Il y a plus de pizzas avec du jambon")
Il y a 10 pizzas au jambon et 6 aux champignons. Notez le % de part et d'autre du mot
recherché : sans lui, le LIKE chercherait une description exactement égale à jambon.
Exercice 9#
Dans l'application de la pizzeria, on souhaite ajouter une fonctionnalité permettant aux utilisateurs de composer leur propre pizza avec les ingrédients de leur choix. Ainsi, le programme ci-dessous doit continuellement demander à l'utilisateur un ingrédient à rajouter, jusqu'à ce qu'il écrive "STOP".
Un exemple d'exécution pourrait être le suivant :
Quel ingrédient voulez-vous ajouter ? <--- [ananas]
Quel ingrédient voulez-vous ajouter ? <--- [jambon]
Quel ingrédient voulez-vous ajouter ? <--- [ananas]
Quel ingrédient voulez-vous ajouter ? <--- [ananas]
Quel ingrédient voulez-vous ajouter ? <--- [STOP]
Votre pizza sera faite de : ['sauce tomate', 'mozzarella', 'ananas', 'jambon', 'ananas', 'ananas']
L'algorithme de ce programme est le suivant
Définir une liste contenant les ingrédients de base d'une pizza (sauce tomate et mozzarella)
Demander à l'utilisateur un nouvel ingrédient à ajouter et le stocker dans la variable choix
Tant que choix est différent de "STOP"
Ajouter le choix à la liste des ingrédients
Redemander un ingrédient à ajouter et le stocker dans la variable choix
Afficher la liste des ingrédients finale
Ecrivez ce programme au complet ci-dessous
1#Ecrivez votre code ici
Solution
1ingredients = ["sauce tomate", "mozzarella"]
2ingredient = input("Quel ingredient veux-tu ajouter ?")
3while ingredient != "STOP":
4 ingredients.append(ingredient)
5 ingredient = input("Quel ingredient veux-tu ajouter ?")
6print("Liste d'ingrédients finale :", ingredients)