Écrire moyenne glissante(t, k) , qui renvoie les moyennes de toutes…
Exercice de TD · niveau 2 · NSI (première), chapitre 4 — Les types construits · Tableaux et compréhensions
É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é.
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.