Подтвердить что ты не робот

Почему проверка переменной на несколько значений с помощью `OR` проверяет только первое значение?

Я хочу проверить, имеет ли переменная одно из нескольких значений. Я смущен, почему or не работает в этой ситуации. Я следовал учебнику, в котором приведен пример if (a or b):, но когда я пытаюсь это сделать, он проверяет только переменную с первым значением. Что не так с моей проверкой?

name = raw_input('Please type in your name:')

if len(name) < 5:
    print "Your name has fewer than 5 characters"
elif len(name) == 5:
    print "Your name has exactly 5 characters"
    if name == ("Jesse" or "jesse"):
        print "Hey Jesse!"
else:
    print "Your name has greater than 5 characters"
4b9b3361

Ответ 1

("Jesse" or "jesse")

Вышеприведенное выражение проверяет, имеет ли значение "Jesse" значение True. Если это так, то выражение вернет его; в противном случае он вернет "Jesse". Выражение эквивалентно записи:

"Jesse" if "Jesse" else "jesse"

Потому что "Jesse" - это непустая строка, но она всегда будет оцениваться как True и, следовательно, будет возвращена:

>>> bool("Jesse")  # Non-empty strings evaluate to True in Python
True
>>> bool("")  # Empty strings evaluate to False
False
>>>
>>> ("Jesse" or "jesse")
'Jesse'
>>> ("" or "jesse")
'jesse'
>>>

Это означает, что выражение:

name == ("Jesse" or "jesse")

в основном эквивалентно написанию этого:

name == "Jesse"

Чтобы исправить вашу проблему, вы можете использовать оператор in:

# Test whether the value of name can be found in the tuple ("Jesse", "jesse")
if name in ("Jesse", "jesse"):

Или вы можете ввести значение name с помощью str.lower, а затем напрямую сравнить его с "Jesse":

# This will also handle inputs such as "JeSSe", "jESSE", "JESSE", etc.
if name.lower() == "jesse":

Ответ 2

if name in ("Jesse", "jesse"):

будет правильным способом сделать это.

Хотя, если вы хотите использовать or, инструкция будет

if name == 'Jesse' or name == 'jesse':

>>> ("Jesse" or "jesse")
'Jesse'

оценивается как 'Jesse', поэтому вы не тестируете 'Jesse', когда выполняете if name == ("Jesse" or "jesse"), так как он проверяет только на равенство 'Jesse' и не проверяет на 'Jesse', как вы заметили.

Ответ 3

Оператор or возвращает первый операнд, если он истинен, в противном случае второй операнд. Поэтому в вашем случае ваш тест эквивалентен if name == "Jesse".

Правильное применение or будет:

if (name == "Jesse") or (name == "jesse"):

Ответ 4

Если вы хотите нечувствительность к регистру, используйте lower или upper:

if name.lower() == "jesse":