NSI (première) · Chapitre 4 · Exercice de TD
Écrire moyenne glissante(t, k) , qui renvoie les moyennes de toutes…
Les types construits · Tableaux et compréhensions · niveau 2
Énoncé
Écrire moyenne_glissante(t, k), qui renvoie les moyennes de toutes les fenêtres de valeurs consécutives de t. Donner la précondition, la longueur exacte du résultat, et écrire la fonction deux fois : par compréhension, puis par boucles. Vérifier que les deux coïncident.
Corrigé
def moyenne_glissante(t, k):
"""Moyennes des fenetres de k valeurs consecutives de t.
Precondition : 1 <= k <= len(t).
Postcondition : le resultat a len(t) - k + 1 elements.
"""
assert 1 <= k <= len(t), "fenetre impossible"
r = [sum(t[i + j] for j in range(k)) / k for i in range(len(t) - k + 1)]
assert len(r) == len(t) - k + 1
return r
La longueur du résultat, . C'est la source d'erreur numéro un. La première fenêtre commence à l'indice , la dernière à l'indice : il y en a donc , pas . On le contrôle sur les deux extrêmes : pour , on retrouve fenêtres (chaque élément est sa propre moyenne) ; pour , une seule fenêtre, celle du tableau entier. Les deux cas passent bien par la formule.
La précondition. interdit la division par zéro ; interdit une longueur négative. Écrire seulement assert k > 0 laisserait passer moyenne_glissante([1, 2], 5), qui rendrait le tableau vide — silencieusement.
La version par boucles.
def moyenne_glissante_boucle(t, k):
assert 1 <= k <= len(t)
r = []
for i in range(len(t) - k + 1):
s = 0
for j in range(k):
s = s + t[i + j]
r.append(s / k)
return r
Vérification croisée.
assert moyenne_glissante([1, 2, 3, 4], 2) == [1.5, 2.5, 3.5]
assert moyenne_glissante([1, 2, 3, 4], 1) == [1.0, 2.0, 3.0, 4.0]
assert moyenne_glissante([1, 2, 3, 4], 4) == [2.5]
for _ in range(500):
t = [random.randint(0, 20) for _ in range(random.randint(1, 12))]
k = random.randint(1, len(t))
assert moyenne_glissante(t, k) == moyenne_glissante_boucle(t, k)
Les trois cas nommés et les comparaisons passent.
Laquelle préférer ? Ici, la version par boucles est probablement plus claire : la compréhension contient une seconde compréhension imbriquée, et la règle du cours — « préférez la compréhension quand elle tient sur une ligne lisible » — n'est plus tout à fait respectée. Le critère est la lisibilité, pas la brièveté.
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.