Adloun

Somme et moyenne d'une liste

Exercice supplémentaire · niveau 1 (application) · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Boucles et listes

Énoncé

Écrire somme(L) et moyenne(L) sans utiliser sum. Que doit renvoyer moyenne sur une liste vide ?

Corrigé

Le code.

def somme(L):
    s = 0                  # element neutre de l'addition
    for x in L:
        s = s + x
    return s

def moyenne(L):
    if len(L) == 0:
        return None        # une liste vide n'a pas de moyenne
    return somme(L) / len(L)

print(somme([3, 1, 4, 1, 5]))     # 14
print(moyenne([3, 1, 4, 1, 5]))   # 2.8
print(moyenne([]))                # None

L'initialisation à . L'accumulateur doit partir de l'élément neutre de l'opération : pour une somme, pour un produit. Partir de L[0] obligerait à commencer la boucle au deuxième élément, et provoquerait une erreur sur une liste vide.

Le cas de la liste vide. somme([]) vaut , ce qui est correct : la somme d'aucun nombre est nulle. Mais moyenne([]) conduirait à une division par , et le programme s'arrêterait sur une erreur. Il faut donc traiter le cas à part — ici en renvoyant None, valeur qui signale l'absence de résultat.

Pourquoi c'est important. Une liste vide surgit naturellement d'un tri sélectif : « la moyenne des salaires des employés de plus de ans » sur un fichier qui n'en contient aucun. Le cas ne doit pas faire tomber le programme.

Le coût. La boucle fait un tour par élément : de l'ordre de opérations, ce qui est optimal — il faut bien lire chaque valeur au moins une fois.

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.