On définit la fonction suivante.
def moyenne(L):
return sum(L) / len(L)a) Que renvoie moyenne([12, 15, 9, 14]) ? b) Écrire une fonction variance(L) utilisant une liste en compréhension, et donner sa valeur pour la même liste. c) Que se passe-t-il si L est vide ? Comment s'en protéger ?
Voir la correction
a) sum(L) vaut 12 + 15 + 9 + 14 = 50 et len(L) vaut 4 : la fonction renvoie 50 / 4, soit 12.5. Le résultat est un flottant, même quand la division tombe juste.
b) La variance est la moyenne des carrés des écarts à la moyenne. On calcule la moyenne une seule fois, puis la liste des carrés des écarts par compréhension :
def variance(L):
m = moyenne(L)
return sum([(x - m) ** 2 for x in L]) / len(L)Pour [12, 15, 9, 14], les écarts à 12,5 sont −0,5 ; 2,5 ; −3,5 ; 1,5, leurs carrés 0,25 ; 6,25 ; 12,25 ; 2,25, de somme 21 : la variance vaut 214 = 5,25 et l'écart type √5,25 ≈ 2,29.
c) Si L est vide, len(L) vaut 0 et la division déclenche une erreur ZeroDivisionError. On se protège en testant ce cas au début de la fonction, par exemple if len(L) == 0: return None, ou en signalant explicitement l'erreur avec raise ValueError("liste vide"). Préciser ce comportement fait partie de la spécification de la fonction.