Python如何评估或声明多个条件?

时间:2015-01-23 16:29:08

标签: python conditional-statements boolean-logic

偶尔,我有这个问题需要检查:

a = 'my string'
if 'string1' in a or 'string2' in a or 'string3' in a ... or 'stringN' in a:
    [[do something]]
else:
    [[something else]]

假设我知道'string1' in a评估True的概率为90%。在'string2' in a'string1' in a的情况下,Python是否仍会评估True是否为if 'string1' in a: [[do something]] elif 'string2' in a: [[do something]] elif 'string3' in a: [[do something]] ... elif 'stringN' in a: [[do something]] else: [[something else]] ?或者在技术上写作更有效:

{{1}}

4 个答案:

答案 0 :(得分:9)

or and and both use short-circuiting;他们只会评估确定结果所需的条件。因此,如果'string1' in a返回True,则永远不会触及'string2' in a

答案 1 :(得分:1)

在这种情况下,或者僵局和if阶梯是等价的。 or语句应该是首选,因为它减少了代码重复。如果要在其中一个字符串位于给定字符串中时执行其他操作,则只需更改一段代码。

如果您有许多字符串要搜索它们,您可能会发现最好使用any函数和生成器。

any(s in a for s in strings) 

上面的评估与or语句相同,其中strings是您要搜索的字符串列表。它还会在第一次评估s in a时停止检查是否True

答案 2 :(得分:0)

在评估True时不会停止。因为在or运算符中,只有一个True足以处理该语句。如果任何条件返回True,例如string1为True,则其他条件不会处理。如您所知,除了False or False,每个条件都是True,因此无需检查其余条件。

答案 3 :(得分:-1)

我意识到这不是你的问题,但你应该考虑在这种情况下使用套装。

而不是:

if 'string1' in a or 'string2' in a or 'string3' in a ... or 'stringN' in a:

你可以这样做:

if set(a.split()).intersection({'string1','string2', ... }):

以这种方式使用集合比多个条件if语句更简洁,也更快。

编辑:请注意,上述内容仅用于检查单个字之间是否存在空格。