偶尔,我有这个问题需要检查:
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}}
答案 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语句更简洁,也更快。
编辑:请注意,上述内容仅用于检查单个字之间是否存在空格。