Exercices

Gaston ne se souvient plus ...

Gaston veut afficher le nombre de poules qu'il a dans sa ferme.

Solution

Pour vous aider à répondre, lisez "II. Comment accéder à une valeur ?" en suivant ce lien: Opérations

Gaston achète des animaux ...

Gaston achète 3 moutons. Il veut compléter le dictionnaire.

Solution

Pour vous aider à répondre, lisez "V. Comment ajouter une paire clé/valeur ?" en suivant ce lien: Opérations

Gaston vend des animaux

ferme_gaston = {"lapin": 5, "vache": 7, "cochon": 1, "cheval": 4}

Gaston a décidé de vendre un animal de chaque espèce. Evidemment, il possède au moins un animal de chaque espèce. Compléter la fonction suivante, qui diminue chaque valeur de 1 dans le dictionnaire "en place".

👉 Pour mettre au point votre script, vous pouvez passer le assert en commentaire en cliquant sur ### en haut à droite. Cliquer encore une fois reviendra en arrière.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013cPw- sSfbgn3k]vei(hlmdo0p:_2)=tay1/[ur050w0q0F0G0r0u0g0f0b0u0G0g0g0E010F0r0z010406050g0L0v0v0G0M0H040h0x0u0L0%0x0l050J0.0:0=0@0,0z040517101a0J170,0w0r0p0V0X0Z0#0X0l0k0L0G0k0q0e0z0H0F0t0~0f0t0r0k0t0u1C0t0F0*050Q0j0u0q1j0Y0!011B1D1F1D0F1L1N1J0F0M181x0V0`0g0z0G0l0#0C011P1l010i0S0q0l0G0v0q1J1+1-1=1R1^1N1{1}0*0a0f0c0M0x0z0x0g0r0}0l0f0O1)0M0M0q0b2i10200l180J1x2v1#1%1$1K0w221m0r0l1`2f1J1g1i0W1Q2F2H0l0x2L1J0z2o182t2v2Y0-1,2j2N1?2R0M0;0u1J0G1A2o0i0#030B0B0b2S0q1F2Q0x0e0y0e0I0*0I100G2Z2$0+2#212(1R2*2,2.2:0q2=012@2_2{2}2I300e1:040C36381-3a2t2E013f0G2-182/0t2;2?2^2`0O3p2R3r0m0*0m3w2s391b2W102L2y0w1%2D3d0#3M1~183!193Y2!113W3+2X2$0f0r0w0#2^2t3r333G3`3|013L3o2G3q31330f260q3}3n3N483P4a1J0J373b2%1k1R0n0*0O0i3V3y0f4o3B0l0i0*0p1`0w4w2u4z3)010)040s4H3^3c4q0#0l0*0i0q2+0q4P4J4S4L0*0D0A4P0,3=3y4z3{4f3 313t052/4:454g2|4i2 4?1;4d4f3+3O4 3s4l370f5a4y3A4K4s040i0x0M4P5c3_4K4U040W4Z4-2u5l4R2O010x0d0*2G5k4#5w5o4W4Y4!5d4$4M4*5s3a5N4/443~2$3Q3h4`464h2~5U4c1|4e4{544~5U2v595b5.5D2)4V4X1}5I5m5K0*0K5^5v5;5p1N5}4p5w4M0o5C5J5w0x0*0E675_5E5=5H5P681?4M5|6i6e5 5q623B656d5~1R6a040e6u631?0v0r344+4!0J3@3X0q2v3.2w3$102z6Q0G1M6L3Z1h5O0O0Q0S0g04.
Solution
🐍 Script Python
def vend(ferme):
    for cle in ferme:
        ferme[cle] = ferme[cle] - 1
Gaston vend encore des animaux

ferme_gaston = {"lapin": 5, "vache": 7, "cochon": 1, "cheval": 4}

Gaston a décidé de vendre un animal de chaque espèce. Evidemment, il possède au moins un animal de chaque espèce.

Compléter la fonction suivante, qui diminue chaque valeur de 1 dans le dictionnaire. On modifiera directement le dictionnaire (on dit que la modification est « en place »).

La solution de l'exercice précedent ne lui convient pas. En effet, un animal qui a un effectif de 0 ne doit pas se trouver dans le dictionnaire.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Aide

Python interdit de modifier un dictionnaire lors de son parcours...

👉 Vous pouvez utiliser une liste Python a_supprimer

Solution
🐍 Script Python
def vend_encore(ferme):
    a_supprimer = []
    for cle in ferme:
        ferme[cle] = ferme[cle] - 1
        if ferme[cle] == 0:
            a_supprimer.append(cle)
    for cle in a_supprimer :
        del ferme[cle]
Gaston fait ses courses

Gaston a décidé de préparer sa liste de courses qu'il va commander, avant d'aller la chercher au DRIVE de son supermarché. Quel va être le montant de sa facture ? Écrire une fonction calcul_prix(produits, catalogue) où :

  • produits est un dictionnaire contenant, comme clés, les produits souhaités par Gaston et comme valeurs associées, la quantité désirée de chacun d’entre eux.
  • catalogue est une dictionnaire contenant tous les produits du magasin avec leur prix associé.
  • La fonction renvoie le montant total des achats de Gaston.

Vous pourrez supposer que les arguments passés à la fonction sont du bon type, et que les produits souhaités par Gaston figurent bien dans le catalogue du magasin.

Exemple :
L’appel suivant de la fonction :

🐍 Script Python
calcul_prix({"brocoli":2, "mouchoirs":5, "bouteilles d'eau":6},
            {"brocoli":1.50, "bouteilles d'eau":1,  "bière":2,
            "savon":2.50, "mouchoirs":0.80})

doit renvoyer : 13.0

Compléter ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
🐍 Script Python
def calcul_prix(produits, catalogue):
    prix = 0
    for cle in produits: # On aurait aussi pu écrire : for cle in produits.keys()
        prix = prix + produits[cle]*catalogue[cle]
    return prix
Remarque : les flottants

Le résultat qui devrait s'afficher pour calcul_prix(produits, catalogue) est 63,8. Or il s'affiche 63.79999999999999.

C'est un problème lié à l'encodage des nombres flottants. Nous étudierons ceci pendant l'année.

L'instruction assert calcul_prix(produits, catalogue) == 63.8 provoquerait un message d'erreur d'assertion. Il ne faut jamais comparer des nombres flottants entre eux ainsi.

Gaston fait des histogrammes

Gaston s'entraîne au jeu de scrabble. Quelles sont les lettres nécessaires pour écrire le mot "brontosaurus" ? Il faut une lettre "b", deux lettres "r", deux lettres "o" etc.
Pour aider Gaston, compléter la fonction qui prend en paramètre une chaine de caracères et renvoie le dictionnaires dont les clés sont chaque caractère, et la valeur associée le nombre de fois qu'il apparaît dans le mot.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Aide

Vous pourrez définir un dictionnaire vide pour commencer.

Solution
🐍 Script Python
def histogramme(caracteres):
    histo = {}
    for caractere in caracteres:
        if caractere in histo:
            histo[caractere] += 1
        else:
            histo[caractere] = 1
    return histo
Top 3

Un jury doit attribuer le prix du « Codeur de l’année ».
Afin de récompenser les trois candidats ayant obtenu la meilleure note, nous vous demandons d’écrire une fonction top_3_candidats qui reçoit un dictionnaire contenant comme clés les noms des candidats et comme valeurs la note que chacun a obtenue.
Cette fonction doit renvoyer la liste contenant les noms des trois meilleurs candidats, par ordre décroissant de leurs notes.
Vous pourrez supposer que les candidats ont des notes différentes, et qu’ils sont plus que trois.

Exemple : L’appel suivant de la fonction :

🐍 Script Python
top_3_candidats({'Candidat 7': 2, 'Candidat 2': 38, 'Candidat 6': 85, 'Candidat 1': 8, 'Candidat 3': 17, 
'Candidat 5': 83,'Candidat 4': 33})

doit renvoyer :
['Candidat 6', 'Candidat 5', 'Candidat 2']

Compléter ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Astuce 1

Vous pouvez partir d'une liste vide

Astuce 2

Vous pouvez chercher la note maximale, supprimer la paire correspondante du dictionnaire de départ, ajouter le nom correspondant dans la liste cherchée. Il suffit de répéter ce processus 3 fois.

Astuce 3

La fonction pop peut vous aider.

Solution
🐍 Script Python
def top_3_candidats(notes):
    """
    Renvoie une liste contenant les 3 meilleurs candidats
    Prend en entrée un dictionnaire de noms/notes
    """

    top_liste = []  #Initialise une liste vide pour creer la liste des 3 meilleurs
    for i in range(3):  # On cherche les 3 premiers
        note_max = -1  # Initialisation pour entrer dans la boucle
                     # de recherche de la plus grande note
        for (nom, note) in notes.items(): #parcourt du dictionnaire
            if note > note_max:  # recherche de note maximale
                note_max = note
                premier = nom     # nom associe
        notes.pop(premier)   # supprime cet item du dictionnaire
                        # on cherche l'éleve de note maximale parmi
                        # ceux qui restent
        top_liste.append(premier) # Ajoute ce candidat à la liste des 3 vainqueurs
    return top_liste
Le bon enclos

Le bon enclos

Anniversaires

Anniversaires

Valeurs extrêmes

Valeurs extrêmes

Dictionnaire d'occurences

Dictionnaire d'occurences

Top likes

Top likes

Dictionnaire des antécédents

Dictionnaire des antécédents

Dictionnaire de likes

Dictionnaire de likes

Les Pokémon

⌛ Une correction viendra plus tard ...

🏰 🐉 Mini-projet 🐉 🏰

⌛ Une correction du mini-projet viendra plus tard ...

La ferme de gaston avec GUI

On nomme GUI une Interface Graphique Utilisateur. Jean-Louis Thirot en a préparé une pour aider Gaston à gérer sa ferme. Le code se trouve dans le fichier gestion_ferme.py

🌐 Vous devez télécharger ce fichier : gestion_ferme.py : "Clic droit", puis "Enregistrer la cible du lien sous".

😀 Vous n'avez pas besoin de regarder le code de ce fichier, toutes les fonctions seront importées dans le fichier que vous devez compléter, et qui permet à Gaston de bien gérer sa ferme.

🌐 Vous devez télécharger ce second fichier : gestion_stock_2023.py: "Clic droit", puis "Enregistrer la cible du lien sous".

👉 Vos deux fichiers doivent être placés dans le même dossier.

  1. Avec votre éditeur Python habituel, ouvrez les deux fichiers.
  2. Exécutez le fichier gestion_ferme.py. Vous verrez apparaître l'interface graphique. Vous pouvez la tester, mais elle ne fonctionne pas encore ...
  3. Compléter les fonctions du fichier gestion_stock_2023.py. Ne pas oublier d'enregistrer. Tester en exécutatnt gestion_ferme.py, et corriger votre code jusqu'à ce qu'il fonctionne comme Gaston le voudrait.
Solution

⏳ La correction viendra bientôt ...