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 a
是 True
的情况下,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 a
returnsTrue
,'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 的单个单词的存在。
偶尔,我在想检查的地方遇到这个问题:
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 a
是 True
的情况下,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 a
returnsTrue
,'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 的单个单词的存在。