NSI (première) · Chapitre 6 · Exercice de TD
Écrire moyenne colonne(table, colonne)
Traiter des données en tables · Sélectionner, projeter, agréger · niveau 2
Énoncé
Écrire moyenne_colonne(table, colonne). Quelles préconditions faut-il — et pourquoi la postcondition ne doit-elle pas s'écrire avec une égalité stricte (chapitre 2) ?
Corrigé
Trois préconditions. La table est non vide (sinon division par zéro) ; la colonne existe dans chaque ligne ; ses valeurs sont des nombres — c'est-à-dire que convertir a déjà été appelé.
def moyenne_colonne(table, colonne):
"""Moyenne arithmétique d'une colonne numérique.
Préconditions : table non vide ; colonne présente dans chaque ligne ;
valeurs numériques (donc converties à l'import).
Postcondition : min <= résultat <= max, à la tolérance des flottants près.
"""
assert len(table) > 0, "table vide"
assert all(colonne in l for l in table), "colonne absente"
total = 0
for ligne in table:
total = total + ligne[colonne]
return total / len(table)
Contrôle. moyenne_colonne(eleves, "moyenne") rend , et .
Pourquoi pas d'égalité stricte. Une moyenne est une somme de flottants divisée par un entier ; l'addition flottante n'est ni exacte ni associative. Le contre-exemple tient en trois valeurs :
t = [{"m": 0.1}, {"m": 0.2}, {"m": 0.3}]
moyenne_colonne(t, "m") # 0.20000000000000004
moyenne_colonne(t, "m") == 0.2 # False
abs(moyenne_colonne(t, "m") - 0.2) < 1e-9 # True
Sur triplets de valeurs tirées au hasard à deux décimales, l'addition séquentielle diffère de dans cas, soit % du temps. Une postcondition écrite assert m == attendu échouerait donc une fois sur sept sur du code juste. La bonne écriture est celle du chapitre 2 : assert abs(m - attendu) < 1e-9.
Remarque : sur la table eleves l'égalité stricte passe par chance. C'est bien pourquoi il ne faut pas s'y fier : un test qui passe par hasard est un test qui échouera un jour sans que rien n'ait changé.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.