Python 如何计算 or 语句中的多个条件?

How does Python evaluate multiple conditions in or statement?

偶尔,我在想检查的地方遇到这个问题:

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%。在 'string1' in aTrue 的情况下,Python 是否仍会评估 'string2' in a?还是这样写在技术上更有效率:

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]]

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

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

or stalemate 和 if ladder 在这种情况下是等价的。 or 语句应该是首选,因为它减少了代码重复。如果其中一个字符串在给定字符串中,并且您想做一些不同的事情,您只需更改一段代码。

如果您要搜索许多字符串,您可能会发现使用 any 函数和生成器更可取。

any(s in a for s in strings) 

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

我知道这不是你的问题,但你应该考虑在这种情况下使用集合。

而不是:

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

你可以这样做:

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

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

编辑:请注意,以上内容仅适用于检查之间没有白色 space 的单个单词的存在。