我想检查变量是否具有多个值之一.我很困惑为什么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"
Run Code Online (Sandbox Code Playgroud)
iCo*_*dez 53
("Jesse" or "jesse")
Run Code Online (Sandbox Code Playgroud)
上面的表达式测试是否"Jesse"评估True.如果是,那么表达式将返回它; 否则,它将返回"jesse".表达式相当于写作:
"Jesse" if "Jesse" else "jesse"
Run Code Online (Sandbox Code Playgroud)
因为它"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'
>>>
Run Code Online (Sandbox Code Playgroud)
这意味着表达式:
name == ("Jesse" or "jesse")
Run Code Online (Sandbox Code Playgroud)
基本上相当于写这个:
name == "Jesse"
Run Code Online (Sandbox Code Playgroud)
为了解决您的问题,您可以使用in运算符:
# Test whether the value of name can be found in the tuple ("Jesse", "jesse")
if name in ("Jesse", "jesse"):
Run Code Online (Sandbox Code Playgroud)
或者,您可以小写namewith 的值,str.lower然后将其"jesse"直接比较:
# This will also handle inputs such as "JeSSe", "jESSE", "JESSE", etc.
if name.lower() == "jesse":
Run Code Online (Sandbox Code Playgroud)
Suk*_*lra 10
if name in ("Jesse", "jesse"):
Run Code Online (Sandbox Code Playgroud)
这将是正确的方法.
虽然,如果你想使用or,声明将是
if name == 'Jesse' or name == 'jesse':
Run Code Online (Sandbox Code Playgroud)
>>> ("Jesse" or "jesse")
'Jesse'
Run Code Online (Sandbox Code Playgroud)
评估为'Jesse',所以你基本上没有测试'jesse'你做什么if name == ("Jesse" or "jesse"),因为它只测试相等'Jesse'和不测试'jesse',正如你观察到的那样.
该or运算符返回第一个操作数,如果它是真实的,否则第二个操作数.所以在你的情况下,你的测试相当于if name == "Jesse".
正确的应用or是:
if (name == "Jesse") or (name == "jesse"):
Run Code Online (Sandbox Code Playgroud)