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']
это лучший способ подойти к этому.)