为什么用`OR`检查多个值的变量只检查第一个值?

Leo*_*ban 31 python

我想检查变量是否具有多个值之一.我很困惑为什么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)

  • @iCodez:如果要检查的元素数量只有2,则元组会更快. (2认同)

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',正如你观察到的那样.


cdh*_*wie 6

or运算符返回第一个操作数,如果它是真实的,否则第二个操作数.所以在你的情况下,你的测试相当于if name == "Jesse".

正确的应用or是:

if (name == "Jesse") or (name == "jesse"):
Run Code Online (Sandbox Code Playgroud)


fal*_*tru 5

如果您需要不区分大小写的比较,请使用lowerupper:

if name.lower() == "jesse":
Run Code Online (Sandbox Code Playgroud)