如何一次比较多个事物

时间:2014-12-10 02:00:57

标签: python operator-precedence

让我们说a ='hi'

我想知道a是否是以下“hi”,“yes”或“no”中的任何一个 我可以跑了

a='hi'
a=='hi' or a=='yes' or a=='no'
>>>True

但是,让我们说这是一个很长的可能性列表,所以我只是说

a='hi'
a==('hi' or 'yes')

当我这样做时,我得到答案为真 但是,当我做这样的事情时:

a==('yes' or 'hi')
>>>False

然后这也很奇怪

a==('yes' and 'hi')
>>>True

但如果我再次切换它们

a==('hi' and 'yes')
>>>False

有人可以解释这里发生的事情

3 个答案:

答案 0 :(得分:7)

您的某些行评估为True而其他行评估为False的原因仅仅归因于how and/or work in Python

  

表达式x and y首先评估x;如果x为false,则为其值   被退回;否则,评估y并得到结果值   返回。

     

表达式x or y首先评估x;如果x为真,则其值为   回;否则,评估y并得到结果值   返回。

因此,让我们来看看你的案例。

('hi' or 'yes')

'hi'是真实的,因此此表达式的计算结果为'hi'a == 'hi'评估为True

('yes' or 'hi')

相同的推理,除了它现在评估为'yes'a == 'yes'False

('yes' and 'hi')

由于'yes'是真实的,因此表达式的结果为'hi'a == 'hi'True

('hi' and 'yes')

最后,由于评估结果为'yes'a == 'yes'False

如果你想测试一个字符串是否是多个事物中的一个,测试它是否在一个集合中:

if a in {'hi', 'yes', 'no'}:
    # Do something

答案 1 :(得分:3)

这应该回答你的问题:

Python 2.7.6 (default, Dec  3 2013, 09:19:11) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
>>> ("yes" or "hi")
'yes'
>>> ("hi" or "yes")
'hi'
>>> ("yes" and "hi")
'hi'
>>> ("hi" and "yes")
'yes'

答案 2 :(得分:0)

这是关于布尔运算的python文档位,它解释了这种行为https://docs.python.org/2/library/stdtypes.html

These are the Boolean operations, ordered by ascending priority:

Operation   Result  Notes
x or y  if x is false, then y, else x   (1)
x and y if x is false, then x, else y   (2)
not x   if x is false, then True, else False    (3)
Notes:

(1) This is a short-circuit operator, so it only evaluates the second argument if the first one is False.
(2) This is a short-circuit operator, so it only evaluates the second argument if the first one is True.
(3) not has a lower priority than non-Boolean operators, so not a == b is interpreted as not (a == b), and a == not b is a syntax error.