2 votes

Erreur des opérateurs d'inégalité booléens simples

En utilisant les opérateurs d'inégalité, je dois définir une procédure weekend qui prend une chaîne de caractères en entrée et renvoie le booléen True si c'est "samedi" ou "dimanche" et False autrement.

Voici mon code

def weekend(day):
    if day != 'Saturday' or day != 'Sunday':
        return False
    else:
        return True

Cela semble renvoyer False à tous les jours, je ne sais pas pourquoi, logiquement ça devrait marcher... Quelqu'un peut-il m'expliquer ?

6voto

Paul Manta Points 9409

Version corrigée :

if day != 'Saturday' and day != 'Sunday'

Meilleure version :

return day in ['Saturday', 'Sunday']

Pourquoi or ne fonctionne pas :

Lorsque vous utilisez or si aujourd'hui n'est pas un samedi ou si aujourd'hui n'est pas un dimanche". Maintenant, remplacez "aujourd'hui" par "samedi" :

Si le samedi n'est pas un samedi ou si le samedi n'est pas un dimanche

L'énoncé "le samedi n'est pas le samedi" est évidemment faux et "le samedi n'est pas le dimanche" est évidemment vrai, de sorte que l'énoncé entier devient "si faux ou vrai", qui est toujours vrai.

Remplacez "aujourd'hui" par n'importe quel autre jour et vous constaterez que la phrase s'évalue toujours à l'une de ces phrases, qui sont toujours vraies :

if True or False  # day = Sunday
if False or True  # day = Saturday
if True or True   # any other day

5voto

Senthil Kumaran Points 14934

La meilleure façon de gérer ça, c'est d'utiliser quelque chose comme ça :

return day.lower() in ['saturday','sunday']

1voto

Hugo Points 3276

Vous voulez dire and

def weekend(day):
    if day != 'Saturday' and day != 'Sunday':
        return False
    else:
        return True

ou la version plus claire (qui applique simplement De Morgan à ce qui précède) :

def weekend(day):
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False

Le jour sera toujours différent de un des deux jours.

0voto

Matthew Adams Points 3528

Un conseil pour l'avenir : réfléchissez à votre code comme si vous étiez l'ordinateur. dans d'atroces détails . Par exemple, j'aurais littéralement cette conversation avec moi-même :

Hmm, quand day = 'Saturday' le code renvoie False même si je pense que ça ne devrait pas. Voyons ce qui se passe ligne par ligne.

def weekend(day):

  • Ok, ça semble bon, à partir de maintenant je vais remplacer day con 'Saturday' à chaque fois que je le vois...

if day != 'Saturday' or day != 'Sunday':

  • Ok, donc je vais mentalement traduire ça en if 'Saturday' != 'Saturday' or 'Saturday' != 'Sunday': .
  • Maintenant, je vais le simplifier en évaluant les comparaisons.
    • 'Saturday' != 'Saturday' devient False
    • 'Saturday' != 'Sunday': devient True
  • En les branchant, je vois que le if La déclaration dit if False or True qui est identique à if True . Cela signifie donc que day = Saturday conduit à une valeur de retour de False .

Aha, donc maintenant je vois ce qui n'allait pas avec le day = 'Saturday' l'affaire ; le day != 'Sunday' signifie que la if évalué à True .

Ainsi, alors que le code ci-dessous renvoie True para day = 'Saturday' ,

def weekend(day):
    if day != 'Saturday':
        return False
    else:
        return True

et ce code fonctionnerait pour day = 'Sunday' ,

def weekend(day):
    if day != 'Sunday':
        return False
    else:
        return True

les deux ne peuvent pas être combinés avec un or .

Essayez donc de vous parler comme ça à l'avenir - c'est super utile pour le débogage, surtout quand la logique booléenne est confuse.

(Pour mémoire, je pense que return day.lower() in ['saturday','sunday'] est la meilleure façon d'aborder la question).

0voto

David Odhiambo Points 315
def weekend(day):
    # your code here
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X