Вопрос по boolean, operator-keyword, return, inequality, python – python: ошибка простых операторов логического неравенства

2

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

Вот мой код

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

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

DeMorgan 's:x != a or y != b такой же как!(x == a and y == b), Должно быть ясно, что, так какx == y а такжеa != b это создает корунд:!(x == a and x == b) - & GT;!(true and false) or !(false and true) - & GT;!(false) - & GT;true :) user166390

Ваш Ответ

6   ответов
0
def weekend(day):
    # your code here
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False
6

Fixed version:

Better version:

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

Why or doesn't work:

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

If Saturday is not Saturday or Saturday is not Sunday

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

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

if True or False  # day = Sunday
if False or True  # day = Saturday
if True or True   # any other day
спасибо тебе большое !!! Maria
спасибо за ответ, но не могли бы вы сказать мне, почему? не работает? Maria
Действительно, последняя версия - безусловно, самый ясный и самый питонский способ сделать это.
@ user1561559 Я добавил объяснение, почему «или»; здесь не работает
+1 для включения объяснения проблемы и «лучшей версии» способ сделать это. (Ударь меня в удар, пока я писал свой многословный ответ, ха-ха.)
0

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

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

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

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

Цикл имени пользователя на английском языке выглядит примерно так: & quot; Продолжайте цикл, еслиusername либо не равенuser1или не равноuser2. & Quot; Если не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]:

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

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

0

Tip for the future: продумайте свой код, как если бы вы были компьютеромin excruciating detail, Например, я бы буквально имел этот разговор с собой:

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

def weekend(day):

Okay that seems good from now on I'll replace day with 'Saturday' anytime I see it...

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

Okay so I'll mentally translate this to if 'Saturday' != 'Saturday' or 'Saturday' != 'Sunday': . Now I'll simplify it by evaluating the comparisons. 'Saturday' != 'Saturday' becomes False 'Saturday' != 'Sunday': becomes True Plugging those in, I see that the if statement is saying if False or True, which is the same as if True. So that means that day = Saturday leads to a return value of 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'] это лучший способ подойти к этому.)

1

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

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

Переверните это!if day == 'Saturday' or day == 'Sunday': return True
Действительно, плохо, я все правильно объяснил, но написал пример неправильно. Исправлена.
5

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

Похожие вопросы