From dab09e41405c3b62814c25ac411d69e3190089c7 Mon Sep 17 00:00:00 2001 From: Dimitri Merejkowsky Date: Sat, 31 Oct 2020 13:42:26 +0100 Subject: [PATCH] Ajout d'un exercice sur les listes --- cours/source/06-listes/01-bases.rst | 108 +++++++++++ cours/source/06-listes/02-iteration.rst | 76 ++++++++ cours/source/06-listes/03-strings.rst | 40 ++++ cours/source/06-listes/04-booléens.rst | 48 +++++ cours/source/06-listes/05-exercice.rst | 50 +++++ cours/source/06-listes/index.rst | 232 +---------------------- cours/source/extraits/mots.txt | 241 ++++++++++++++++++++++++ cours/source/extraits/pendu.py | 50 +++++ 8 files changed, 620 insertions(+), 225 deletions(-) create mode 100644 cours/source/06-listes/01-bases.rst create mode 100644 cours/source/06-listes/02-iteration.rst create mode 100644 cours/source/06-listes/03-strings.rst create mode 100644 cours/source/06-listes/04-booléens.rst create mode 100644 cours/source/06-listes/05-exercice.rst create mode 100644 cours/source/extraits/mots.txt create mode 100644 cours/source/extraits/pendu.py diff --git a/cours/source/06-listes/01-bases.rst b/cours/source/06-listes/01-bases.rst new file mode 100644 index 0000000..cd00634 --- /dev/null +++ b/cours/source/06-listes/01-bases.rst @@ -0,0 +1,108 @@ +Principes fondamentaux +====================== + +Définition +---------- + +Une liste est une *suite ordonnée* d'éléments. + +Créer une liste +--------------- + +Avec des crochets: ``[``, ``]``, et les éléments séparés par des virgules:: + + liste_vide = [] + trois_entiers = [1, 2, 3] + + +Listes hétérogènes +------------------ + +On peut mettre des types différents dans la même liste:: + + ma_liste = [True, 2, "trois"] + +On peut aussi mettre des listes dans des listes:: + + liste_de_listes = [[1, 2], ["Germaine", "Gertrude"]] + +Connaître la taille d'une liste +------------------------------- + +Avec ``len()`` - encore une fonction native:: + + liste_vide = [] + taille = len(liste_vide) + print(taille) + # affiche: 0 + + trois_entiers = [1, 2, 3] + taille = len(trois_entiers) + print(taille) + # affiche: 3 + +Concaténation de listes +----------------------- + +Avec ``+``:: + + prénoms = ["Alice", "Bob"] + prénoms += ["Charlie", "Eve"] + print(prénoms) + # affiche: ['Alice', 'Bob', "Charlie", 'Eve'] + +On ne peut concaténer des listes que avec d'autres listes:: + + scores = [1, 2, 3] + scores += 4 + # erreur + + scores += [4] + print(scores) + # affiche: [1,2,3,4] + +Test d'appartenance +------------------- + +Avec ``in``:: + + prénoms = ["Alice", "Bob"] + print("Alice" in prénoms) + # affiche: True + + prénoms = ["Alice", "Bob"] + print("Charlie" in prénoms) + # affiche: False + +Modifier une liste +------------------- + +Encore une assignation:: + + fruits = ["pomme", "orange", "poire"] + fruits[0] = "abricot" + print(fruits) + # affiche: ["abricot", "orange", "poire"] + +Indéxer une liste +------------------ + +* Avec ``[]`` et un entier + +* Les index valides vont de 0 à ``n-1`` où ``n`` est la + taille de la liste:: + + fruits = ["pomme", "orange", "poire"] + + print(fruits[0]) + # affiche: "pomme" + + print(fruits[1]) + # affiche: "orange" + + print(list[2]) + # affiche: "poire" + + fruits[3] + # erreur: IndexError + diff --git a/cours/source/06-listes/02-iteration.rst b/cours/source/06-listes/02-iteration.rst new file mode 100644 index 0000000..64ddd30 --- /dev/null +++ b/cours/source/06-listes/02-iteration.rst @@ -0,0 +1,76 @@ +Itération +========= + +Itérer sur les éléments d'une liste +------------------------------------ + +Avec les mots-clés ``for`` et `` in``:: + + prénoms = ["Alice", "Bob", "Charlie"] + for prénom in prénoms: + # Chaque élément de la liste est assigné tour à tour + # à la variable 'prénom" + print("Bonjour", prénom) + +.. code-block:: text + + Bonjour Alice + Bonjour Bob + Bonjour Charlie + +break +----- + +Comme pour les boucles `while`, on peut interrompre la boucle `for` avec `break`:: + + prénoms = ["Alice", "Bob", "Charlie"] + for prénom in prénoms: + if prénom == "Bob": + break + print("Bonjour", prénom) + +.. code-block:: text + + Bonjour Alice + Bonjour Charlie + +continue +-------- + +On peut interrompre l'exécution *du bloc courant* (et uniqument le +bloc courant) avec le mot-clé ``continue``:: + + prénoms = ["Alice", "Bob", "Charlie"] + for prénom in prénoms: + if prénom == "Bob": + continue + print("Bonjour", prénom) + +.. code-block:: text + + Bonjour Alice + Bonjour Charlie + + +Indéxer une liste +------------------ + +* Avec ``[]`` et un entier + +* Les index valides vont de 0 à ``n-1`` où ``n`` est la + taille de la liste:: + + fruits = ["pomme", "orange", "poire"] + + print(fruits[0]) + # affiche: "pomme" + + print(fruits[1]) + # affiche: "orange" + + print(list[2]) + # affiche: "poire" + + fruits[3] + # erreur: IndexError + diff --git a/cours/source/06-listes/03-strings.rst b/cours/source/06-listes/03-strings.rst new file mode 100644 index 0000000..d3b7daa --- /dev/null +++ b/cours/source/06-listes/03-strings.rst @@ -0,0 +1,40 @@ +Relation avec les strings +========================= + +Les strings sont aussi des listes (presque). + +On peut itérer sur les caractères d'une string:: + + for c in "vache": + print(c) + +.. code-block: console + + v + a + c + h + e + +On peut tester si un caractère est présent:: + + print("e" in "vache") + # affiche: True + + print(x" in "vache") + # affiche: False + + +Mais on ne peut pas modifier une string:: + + prénom = "Charlotte" + l = prénom[0] + print(l) + # affiche: "C" + + l = prénom[3] + print(l) + # affiche: "r" + + prénom[0] = "X" + # erreur: TypeError diff --git a/cours/source/06-listes/04-booléens.rst b/cours/source/06-listes/04-booléens.rst new file mode 100644 index 0000000..3a2d168 --- /dev/null +++ b/cours/source/06-listes/04-booléens.rst @@ -0,0 +1,48 @@ +Listes et booléens +================== + +Falsy et truthy +---------------- + +Si on met une liste vide, ``if`` se comportera comme si on avait mis une valeur fausse, et si +la liste n'est pas vide , ``if`` se comportera comme si on avait mis une valeur vraie.:: + + ma_liste = [1, 2, 3] + if ma_liste: + print("ma_liste n'est pas vide") + # affiche: ma_liste n'est pas vide + + mon_autre_liste = [] + if not mon_autre_liste: + print("mon_autre_liste est vide") + # affiche: mon_autre_liste est vide + +On dit que les listes vides sont *Falsy* et les listes non-vides *Truthy* + +Test d'appartenance +------------------- + +On peut tester si un élément est dans une liste avec le mot-clé ``in``:: + + prénoms = ["Alice", "Bob"] + print("Alice" in prénoms) + # affiche: True + + prénoms = ["Alice", "Bob"] + print("Charlie" in prénoms) + # affiche: False + + +Comparaisons de listes +----------------------- + +On peut utiliser l'opérateur ``==`` avec deux listes de part et +d'autres. Les listes seront considérées comme égales si + +* Elles ont la même taille +* Tous leurs éléments sont égaux un à un en respectant l'ordre:: + + [1] == [2] # False + [1, 2] == [2, 1] # False + [1, 2] == [1, 2] # True + diff --git a/cours/source/06-listes/05-exercice.rst b/cours/source/06-listes/05-exercice.rst new file mode 100644 index 0000000..eb80b3b --- /dev/null +++ b/cours/source/06-listes/05-exercice.rst @@ -0,0 +1,50 @@ +Exercice +======== + +Le but de l'exercice est d'implémenter le jeu du pendu. + +Voila à quoi une session de jeu doit ressembler: + + + +.. code-block:: text + + ______ + entrer une lettre + e + _____e + entrer une lettre + a + _a___e + entrer une lettre + u + _au__e + entrer une lettre + q + _au__e + entrer une lettre + c + _auc_e + entrer une lettre + h + _auche + entrer une lettre + g + gauche + Gagné + +Consignes +--------- + +* Télécharger les fichiers ``pendu.py`` et ``mots.txt`` + +* S'assurer que le code fonctionne en lançant ``python3 pendu.py`` + +* À ce stade, vous devriez constater plusieurs problèmes: + + * Au lieu d'avoir un mot au hasard, le mot à deviner est toujours "accord" + * Au lieu d'afficher un indice, le code affiche une liste de tentatives + * Le jeu est impossible à gagner parce que la fonction `a_gagné` renvoie toujours False + +Le but de l'exercice est de corriger ces 3 problèmes. + diff --git a/cours/source/06-listes/index.rst b/cours/source/06-listes/index.rst index 223fed3..0ea3cf8 100644 --- a/cours/source/06-listes/index.rst +++ b/cours/source/06-listes/index.rst @@ -1,232 +1,14 @@ Chapitre 6 - Listes =================== -Définition ----------- +.. toctree:: + :maxdepth: 1 -Une liste est une *suite ordonnée* d'éléments. + ./01-bases.rst + ./02-iteration.rst + ./03-strings.rst + ./04-booléens.rst + ./05-exercice.rst -Créer une liste ---------------- -Avec des crochets: ``[``, ``]``, et les éléments séparés par des virgules:: - liste_vide = [] - trois_entiers = [1, 2, 3] - - -Listes hétérogènes ------------------- - -On peut mettre des types différents dans la même liste:: - - ma_liste = [True, 2, "trois"] - -On peut aussi mettre des listes dans des listes:: - - liste_de_listes = [[1, 2], ["Germaine", "Gertrude"]] - -Connaître la taille d'une liste -------------------------------- - -Avec ``len()`` - encore une fonction native:: - - liste_vide = [] - taille = len(liste_vide) - print(taille) - # affiche: 0 - - trois_entiers = [1, 2, 3] - taille = len(trois_entiers) - print(taille) - # affiche: 3 - -Concaténation de listes ------------------------ - -Avec ``+``:: - - prénoms = ["Alice", "Bob"] - prénoms += ["Charlie", "Eve"] - print(prénoms) - # affiche: ['Alice', 'Bob', "Charlie", 'Eve'] - -On ne peut concaténer des listes que avec d'autres listes:: - - scores = [1, 2, 3] - scores += 4 - # erreur - - scores += [4] - print(scores) - # affiche: [1,2,3,4] - -Test d'appartenance -------------------- - -Avec ``in``:: - - prénoms = ["Alice", "Bob"] - print("Alice" in prénoms) - # affiche: True - - prénoms = ["Alice", "Bob"] - print("Charlie" in prénoms) - # affiche: False - -Itérer sur les éléments d'une liste ------------------------------------- - -Avec les mots-clés ``for`` et `` in``:: - - prénoms = ["Alice", "Bob", "Charlie"] - for prénom in prénoms: - # Chaque élément de la liste est assigné tour à tour - # à la variable 'prénom" - print("Bonjour", prénom) - -.. code-block:: text - - Bonjour Alice - Bonjour Bob - Bonjour Charlie - -break ------ - -Comme pour les boucles `while`, on peut interrompre la boucle `for` avec `break`:: - - prénoms = ["Alice", "Bob", "Charlie"] - for prénom in prénoms: - if prénom == "Bob": - break - print("Bonjour", prénom) - -.. code-block:: text - - Bonjour Alice - Bonjour Charlie - -continue --------- - -On peut interrompre l'exécution *du bloc courant* (et uniqument le -bloc courant) avec le mot-clé ``continue``:: - - prénoms = ["Alice", "Bob", "Charlie"] - for prénom in prénoms: - if prénom == "Bob": - continue - print("Bonjour", prénom) - -.. code-block:: text - - Bonjour Alice - Bonjour Charlie - - -Indéxer une liste ------------------- - -* Avec ``[]`` et un entier - -* Les index valides vont de 0 à ``n-1`` où ``n`` est la - taille de la liste:: - - fruits = ["pomme", "orange", "poire"] - - print(fruits[0]) - # affiche: "pomme" - - print(fruits[1]) - # affiche: "orange" - - print(list[2]) - # affiche: "poire" - - fruits[3] - # erreur: IndexError - -Modifier une liste -------------------- - -Encore une assignation:: - - fruits = ["pomme", "orange", "poire"] - fruits[0] = "abricot" - print(fruits) - # affiche: ["abricot", "orange", "poire"] - -Les strings sont aussi des listes (presque) --------------------------------------------- - -On peut itérer sur les caractères d'une string:: - - for c in "vache": - print(c) - -.. code-block: console - - v - a - c - h - e - -On peut tester si un caractère est présent:: - - print("e" in "vache") - # affiche: True - - print(x" in "vache") - # affiche: False - - -Mais on ne peut pas modifier une string:: - - prénom = "Charlotte" - l = prénom[0] - print(l) - # affiche: "C" - - l = prénom[3] - print(l) - # affiche: "r" - - prénom[0] = "X" - # erreur: TypeError - - -Falsy et truthy ----------------- - - -En réalité on peut mettre autre chose qu'une comparaison ou une variable booléenne après le if. - -Si on met une liste vide, ``if`` se comportera comme si on avait mis une valeur fausse, et si -la liste n'est pas vide , ``if`` se comportera comme si on avait mis une valeur vraie.:: - - ma_liste = [1, 2, 3] - if ma_liste: - print("ma_liste n'est pas vide") - # affiche: ma_liste n'est pas vide - - mon_autre_liste = [] - if not mon_autre_liste: - print("mon_autre_liste est vide") - # affiche: mon_autre_liste est vide - -On dit que les listes vides sont *Falsy* et les listes non-vides *Truthy* - -Comparaisons de listes ------------------------ - -On peut utiliser l'opérateur ``==`` avec deux listes de part et -d'autres. Les listes seront considérées comme égales si - -* Elles ont la même taille -* Tous leurs éléments sont égaux un à un en respectant l'ordre:: - - [1] == [2] # False - [1, 2] == [2, 1] # False - [1, 2] == [1, 2] # True diff --git a/cours/source/extraits/mots.txt b/cours/source/extraits/mots.txt new file mode 100644 index 0000000..f96505f --- /dev/null +++ b/cours/source/extraits/mots.txt @@ -0,0 +1,241 @@ +accord +affaire +agent +aide +amour +appel +arbre +argent +arme +attention +avenir +avion +avis +balle +bateau +besoin +bois +bonheur +bonjour +bord +bouche +boulot +bout +bras +bruit +bureau +camp +capitaine +carte +cause +chambre +chance +chat +chef +chemin +cheval +cheveu +chien +choix +chose +ciel +classe +client +coin +colonel +compte +confiance +copain +corps +couleur +coup +cour +courant +cours +cuisine +dame +dent +dieu +docteur +doigt +dollar +doute +droit +droite +effet +endroit +enfant +ennemi +envie +erreur +escalier +esprit +exemple +face +faim +fait +famille +faute +femme +fille +film +fils +fleur +flic +fois +fond +force +forme +front +garde +gars +gauche +genre +gens +geste +gosse +gouvernement +grand +groupe +guerre +gueule +habitude +haut +heure +histoire +homme +honneur +image +impression +instant +jambe +jardin +joie +jour +journal +langue +lettre +lieu +ligne +livre +long +madame +main +maison +maman +marche +mari +mariage +matin +merci +merde +milieu +million +minute +mois +moment +monde +monsieur +mort +mouvement +moyen +musique +noir +nouveau +nuit +odeur +oeil +oiseau +ombre +oncle +ordre +oreille +paix +papa +papier +parent +parole +part +partie +passage +patron +pays +peau +peine +personne +petit +peuple +peur +photo +pied +pierre +place +plaisir +plan +poche +point +police +porte +pouvoir +premier +prince +prison +prix +professeur +propos +putain +quartier +question +raison +rapport +regard +reste +retard +retour +revoir +robe +route +salle +salut +sang +seconde +secret +seigneur +semaine +sens +sentiment +service +seul +signe +silence +situation +soeur +soir +soldat +soleil +sorte +sourire +souvenir +suite +sujet +table +temps +terre +tour +tout +train +travail +travers +trou +truc +type +vent +ventre +verre +vieux +village +ville +visage +voiture +voix +voyage diff --git a/cours/source/extraits/pendu.py b/cours/source/extraits/pendu.py new file mode 100644 index 0000000..8c21b4c --- /dev/null +++ b/cours/source/extraits/pendu.py @@ -0,0 +1,50 @@ +import random + + +def lire_mots(): + fichier = open("mots.txt") + contenu = fichier.read() + fichier.close() + mots = contenu.splitlines() + return mots + + +def choisir_mot_au_hasard(mots): + taille = len(mots) + index = random.randint(0, taille) + return mots[0] + + +def jouer(): + mots = lire_mots() + mot = choisir_mot_au_hasard(mots) + # pour débugger, il faudra enlever cet + # appel à print une fois le code terminé + print("Le mot à deviner est", mot) + tentatives = [] + while True: + afficher_indice(mot, tentatives) + lettre = demander_lettre() + if lettre not in tentatives: + tentatives += [lettre] + if a_gagné(mot, tentatives): + print(mot) + print("Gagné") + break + + +def a_gagné(mot, tentatives): + return False + + +def demander_lettre(): + print("entrer une lettre") + lettre = input() + return lettre + + +def afficher_indice(mot, tentatives): + print("tentatives", tentatives) + + +jouer()