Un panier associe des articles à des quantités
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 5 — Les dictionnaires · Itérer, regrouper, comparer
Énoncé
Un panier associe des articles à des quantités ; deux tables donnent les prix et les catégories. Écrire total_par_categorie(panier). Quelle précondition protège des données incomplètes ?
Corrigé
PRIX = {"pain": 1.10, "lait": 0.95, "pomme": 0.40, "savon": 2.50}
CATEGORIE = {"pain": "epicerie", "lait": "frais",
"pomme": "fruits", "savon": "menage"}
def total_par_categorie(panier, prix=PRIX, categorie=CATEGORIE):
"""categorie -> montant, pour un panier {article: quantite}.
Precondition : tout article du panier figure dans prix ET dans categorie.
"""
for article in panier:
assert article in prix, "prix inconnu : " + article
assert article in categorie, "categorie inconnue : " + article
totaux = {}
for article, quantite in panier.items():
cat = categorie[article]
totaux[cat] = totaux.get(cat, 0) + quantite * prix[article]
return totaux
**La précondition est vérifiée avant de commencer à additionner**, dans une boucle séparée. Ce n'est pas de la coquetterie : si l'on testait au fil du calcul, l'échec surviendrait sur un dictionnaire totaux à moitié rempli. En vérifiant d'abord, la fonction échoue sans avoir rien produit — elle ne laisse pas de résultat partiel qu'un appelant distrait pourrait utiliser.
Vérification.
panier = {"pain": 2, "pomme": 6, "lait": 1}
t = total_par_categorie(panier)
assert set(t) == {"epicerie", "fruits", "frais"}
assert abs(t["epicerie"] - 2.20) < 1e-9
assert abs(sum(t.values()) - (2 * 1.10 + 6 * 0.40 + 0.95)) < 1e-9
try:
total_par_categorie({"caviar": 1})
assert False
except AssertionError as e:
assert "inconnu" in str(e)
Les montants sont des flottants : on compare avec abs(... ) < 1e-9, jamais avec ==. C'est la leçon du chapitre 2, et celle de l'exercice de TD sur les fréquences.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.