<p>假设我们要计算<code>a or b</code>。<code>or</code>操作符的工作方式如下:</p>
<ol>
<li>如果<code>a</code>是truthy,则返回<code>a</code></li>
<li>否则,返回<code>b</code></李>
</ol>
<p>如果有两个以上的操作数,例如<code>a or b or c or d</code>,则它相当于<code>a or (b or (c or d))</code>,因此它将根据以下算法工作:</p>
<ol>
<li>如果<code>a</code>是truthy,则返回<code>a</code></li>
<li>否则,如果<code>b</code>是truthy,则返回<code>b</code></li>
<li>否则,如果<code>c</code>是truthy,则返回<code>c</code></li>
<li>否则,返回<code>d</code></李>
</ol>
<p>所以这个表达式:<code>('browser' or 'chrome') in 'start chrome'</code>将不会像您期望的那样工作。首先,<code>('browser' or 'chrome')</code>将计算为<code>'browser'</code>(因为<code>'browser'</code>和任何非空字符串一样是真实的,<code>'browser' in 'start chrome'</code>是<code>False</code></p>
<p>您可能希望使用的是:</p>
<pre class="lang-py prettyprint-override"><code>('browser' in 'start chrome') or ('chrome' in 'start chrome')
</code></pre>
<p>或者您可以使用<code>any</code>,并结合生成器:</p>
<pre class="lang-py prettyprint-override"><code>string = 'start chrome'
if any(substring in string for substring in ['browser', 'chrome', 'chromium']):
print('Ta da!')
</code></pre>
<p>或者,如果你真的喜欢<code>map</code></p>
<pre class="lang-py prettyprint-override"><code>if any(map(string.__contains__, ['browser', 'chrome', 'chromium'])):
print('Ta da!')
</code></pre>
<p>基本上,<code>any</code>返回<code>True</code>,如果给定iterable的至少一个元素是<code>truthy</code></p>
<p><code>a and b and c</code>的工作原理与<code>or</code>类似:
1.如果<code>a</code>为false,则返回<code>a</code>
1.否则,如果<code>b</code>为false,则返回<code>b</code>
1.否则,返回<code>c</code></p>
<p>您可能希望使用以下内容来代替<code>and</code>-y表达式:</p>
<pre class="lang-py prettyprint-override"><code>('start' in 'start chrome') and ('chrome' in 'start chrome')
</code></pre>
<p>或者您可以使用<code>all</code>,它类似于<code>any</code>,但实现了<code>and</code>-logic或者<code>or</code>-logic:<a href="https://docs.python.org/3/library/functions.html#all" rel="nofollow noreferrer">https://docs.python.org/3/library/functions.html#all</a></p>