Écrire deux conditions ayant la même table de vérité mais dont l'une…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Court-circuit, tables et équivalences
Énoncé
Écrire deux conditions ayant la même table de vérité mais dont l'une seule est sûre lorsqu'une liste est vide. Indication : tester la longueur avant d'accéder au premier élément.
Corrigé
def sur(t):
"""Vrai si t est non vide et commence par un nombre positif."""
return len(t) > 0 and t[0] > 0
def fautif(t):
"""Meme table de verite... et pourtant plante sur []."""
return t[0] > 0 and len(t) > 0
>>> sur([])
False
>>> fautif([])
IndexError: list index out of range
>>> sur([3, 1]), fautif([3, 1])
(True, True)
Même table, deux comportements. Sur toute liste non vide, les deux fonctions rendent la même chose : les conjonctions et ont bien la même table de vérité. Mais la table décrit un résultat, jamais un ordre. Python évalue de gauche à droite et s'arrête dès que la réponse est connue : dans sur, len(t) > 0 est faux, donc t[0] n'est jamais évalué. Dans fautif, t[0] est évalué en premier — et lève une exception.
Le procédé, en une phrase : placer à gauche le test qui protège celui de droite. On l'appelle parfois le « test de garde ».
Erreur attendue : croire qu'écrire les deux tests dans n'importe quel ordre est affaire de style. C'est une différence de correction, pas de goût.
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.