NSI (première) · Chapitre 7 · Application directe du cours
Écrire contient(t, v), qui rend un booléen, à partir de recherche
Parcourir, trier, prouver · Dérouler, compter, vérifier · niveau 1 (application)
É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.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 16 autres exercices corrigés dans ce chapitre, et 20 à chercher avec le tuteur
- Le podcast et la vidéo du chapitre et la correction filmée du TD : 2 minutes sans compte
Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.