Browse Source

Ajout d'un exercice sur les listes

master
Dimitri Merejkowsky 3 years ago
parent
commit
dab09e4140
8 changed files with 620 additions and 225 deletions
  1. +108
    -0
      cours/source/06-listes/01-bases.rst
  2. +76
    -0
      cours/source/06-listes/02-iteration.rst
  3. +40
    -0
      cours/source/06-listes/03-strings.rst
  4. +48
    -0
      cours/source/06-listes/04-booléens.rst
  5. +50
    -0
      cours/source/06-listes/05-exercice.rst
  6. +7
    -225
      cours/source/06-listes/index.rst
  7. +241
    -0
      cours/source/extraits/mots.txt
  8. +50
    -0
      cours/source/extraits/pendu.py

+ 108
- 0
cours/source/06-listes/01-bases.rst View File

@@ -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


+ 76
- 0
cours/source/06-listes/02-iteration.rst View File

@@ -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


+ 40
- 0
cours/source/06-listes/03-strings.rst View File

@@ -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

+ 48
- 0
cours/source/06-listes/04-booléens.rst View File

@@ -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


+ 50
- 0
cours/source/06-listes/05-exercice.rst View File

@@ -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.


+ 7
- 225
cours/source/06-listes/index.rst View File

@@ -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

+ 241
- 0
cours/source/extraits/mots.txt View File

@@ -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

+ 50
- 0
cours/source/extraits/pendu.py View File

@@ -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()