This question already has an answer here:
-
How to test multiple variables against a value?
19 answers
-
Elif and if not working or me not understanding [duplicate]
3 answers
I want to check if a variable has one of multiple values. I\'m confused about why or
doesn\'t work in this situation. I was following a tutorial that gave the example if (a or b):
, but when I try to do this it only checks the variable against the first value. What is wrong with my check?
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\"
(\"Jesse\" or \"jesse\")
The above expression tests whether or not \"Jesse\"
evaluates to True
. If it does, then the expression will return it; otherwise, it will return \"jesse\"
. The expression is equivalent to writing:
\"Jesse\" if \"Jesse\" else \"jesse\"
Because \"Jesse\"
is a non-empty string though, it will always evaluate to True
and thus be returned:
>>> 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\'
>>>
This means that the expression:
name == (\"Jesse\" or \"jesse\")
is basically equivalent to writing this:
name == \"Jesse\"
In order to fix your problem, you can use the in
operator:
# Test whether the value of name can be found in the tuple (\"Jesse\", \"jesse\")
if name in (\"Jesse\", \"jesse\"):
Or, you can lowercase the value of name
with str.lower
and then compare it to \"jesse\"
directly:
# This will also handle inputs such as \"JeSSe\", \"jESSE\", \"JESSE\", etc.
if name.lower() == \"jesse\":
if name in (\"Jesse\", \"jesse\"):
would be the correct way to do it.
Although, if you want to use or
, the statement would be
if name == \'Jesse\' or name == \'jesse\':
>>> (\"Jesse\" or \"jesse\")
\'Jesse\'
evaluates to \'Jesse\'
, so you\'re essentially not testing for \'jesse\'
when you do if name == (\"Jesse\" or \"jesse\")
, since it only tests for equality to \'Jesse\'
and does not test for \'jesse\'
, as you observed.
The or
operator returns the first operand if it is true, otherwise the second operand. So in your case your test is equivalent to if name == \"Jesse\"
.
The correct application of or
would be:
if (name == \"Jesse\") or (name == \"jesse\"):
If you want case-insensitive comparison, use lower
or upper
:
if name.lower() == \"jesse\":