Écrire contient(t, v), qui rend un booléen, à partir de recherche
Application directe du cours · niveau 1 (application) · NSI (première), chapitre 7 — Parcourir, trier, prouver · Dérouler, compter, vérifier
Énoncé
Écrire contient(t, v), qui rend un booléen, à partir de recherche. Pourquoi la convention « si absent » demande-t-elle de la prudence en Python ?
Corrigé
def contient(t, v):
"""Vrai si v figure dans t.
Postcondition : équivaut à (v in t).
"""
return recherche(t, v) != -1
Contrôle : contient([3, 1, 4], 4) vaut True, contient([3, 1, 4], 5) vaut False. L'équivalence avec v in t a été vérifiée sur tableaux tirés au hasard.
Le danger du . En Python, est un indice valide : il désigne le dernier élément. Sur [3, 1, 4], t[-1] vaut , sans la moindre erreur. Donc le code suivant est faux, et silencieusement :
i = recherche(t, v)
print("trouve :", t[i]) # si v est ABSENTE, affiche le dernier element !
Il annonce avoir trouvé la valeur cherchée, et affiche autre chose. C'est le pire mode de panne : pas d'exception, pas de message, juste un résultat faux.
Les deux parades. Ou bien tester le avant tout usage de l'indice — ce que fait contient ; ou bien ne pas rendre d'indice du tout quand on ne veut qu'un booléen. La seconde est meilleure : une fonction qui rend un booléen ne peut pas être mal utilisée de cette façon. Le bon type de retour élimine la classe d'erreur entière.
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.