Adloun

É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 &gt; 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.