Почему проверка переменной на несколько значений с помощью `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"
Ответы
Ответ 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":