python: ошибка простых операторов логического неравенства

Используя операторы неравенства, я должен определить процедуру выходного дня, которая принимает строку в качестве входных данных и возвращает логическое значение True, если это "суббота" или "воскресенье", и "Ложь" в противном случае.

Вот мой код

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

Это похоже возвращает False на каждый день, я не знаю почему, по логике это будет работать..o_o.. может кто-нибудь объяснить, пожалуйста, я слишком noob:S

5 ответов

Решение

Фиксированная версия:

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

Лучшая версия:

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

Зачем or не работает:

Когда вы используете or Ваше состояние будет выглядеть примерно так: "если сегодня не суббота или сегодня не воскресенье". Теперь замените "сегодня" на "суббота":

Если суббота не суббота или суббота не воскресенье

Утверждение "Суббота не суббота", очевидно, ложно, а "Суббота не воскресенье", очевидно, верно, поэтому все утверждение становится "если ложно или верно", что всегда верно.

Замените "сегодня" на любой другой день, и вы увидите, что предложение всегда соответствует одному из этих предложений, которые всегда верны:

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

Лучший способ справиться с этим, использовать что-то вроде этого:

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

Ты имеешь в виду and

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

или более ясная версия (которая только применила Де Моргана к вышеупомянутому):

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

День всегда будет отличаться от одного из двух дней.

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

Я написал этот ответ для Не могу получить "пока" для выполнения, но он был помечен как дубликат прямо перед тем, как я его отправил. И это точный логический дубликат (x != foo or y != bar), поэтому я публикую это здесь в надежде, что мой ответ может кому-нибудь помочь.

Ответ воспроизводится дословно.


Ваша проблема здесь:

while username != logindata.user1 or username != logindata.user2:
...
while password != logindata.passw1 or password != logindata.passw2:

Цикл имени пользователя на английском языке выглядит примерно так: "Продолжайте цикл, если username либо не равен user1или не равно user2"Если только user1 а также user2 одинаковы, ни одна строка не позволит False, Если имя пользователя равно user1, это не может быть равно user2 (опять же, предполагая, user1 != user2, который имеет место здесь).

Быстрое решение состоит в том, чтобы изменить or в and, Таким образом, вы проверяете, username не является ни одним из доступных вариантов. Лучший способ написать это было бы:

while not (username == logindata.user1 or username == logindata.user2):

Но я бы сказал, что правильный способ написать это, учитывая то, что вы пытаетесь сделать, это:

while username not in [logindata.user1, logindata.user2]:

На английском языке что-то вроде: "Продолжайте цикл, пока имя пользователя отсутствует в этом списке имен пользователей".

PS Я собирался использовать набор вместо списка для педантичной корректности, но это действительно не имеет значения, поэтому я подумал, что список будет проще для новичка. Просто упоминая это, прежде чем кто-то другой делает:).

Совет на будущее: продумайте свой код, как если бы вы были компьютером в мучительных деталях. Например, я бы буквально имел этот разговор с собой:

Хм когда day = 'Saturday'код возвращается False хотя я думаю, что это не должно Давайте посмотрим, что происходит построчно.

def weekend(day):

  • Хорошо, это кажется хорошим, теперь я заменю day с 'Saturday' каждый раз, когда я вижу это...

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

  • Хорошо, так что я мысленно переведу это if 'Saturday' != 'Saturday' or 'Saturday' != 'Sunday':,
  • Теперь я упросту это, оценивая сравнения.
    • 'Saturday' != 'Saturday' становится False
    • 'Saturday' != 'Sunday': становится True
  • Подключив их, я вижу, что if утверждение говорит if False or True, который так же, как if True, Так что это означает, что day = Saturday приводит к возвращаемому значению False,

Ага, так что теперь я вижу, что случилось с day = 'Saturday' дело; day != 'Sunday' состояние означало, что if оценивается в True,

Так что пока код ниже вернется True за day = 'Saturday',

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

и этот код будет работать для day = 'Sunday',

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

эти два не могут быть объединены с or,

Поэтому попробуйте поговорить с самим собой в будущем - это очень полезно для отладки, особенно когда есть сбивающая с толку логическая логика.

(Для справки, я думаю, что return day.lower() in ['saturday','sunday'] это лучший способ подойти к этому.)

Другие вопросы по тегам