<p><code>in</code>不一定在幕后使用循环。例如:</p>
<pre><code>r = range(100000000000)
print(333 in r) # prints True immediately without looping
</code></pre>
<p>如果要循环<code>r</code>,则需要相当长的时间,因此显然不会发生这种情况</p>
<p><code>in</code>基本上(在幕后)调用对象的<code>__contains__</code>方法。对于某些迭代器,它实际上会“循环”遍历所有内容,但情况并非总是如此</p>
<p>此示例与调用基本相同:</p>
<pre><code>r.__contains__(333)
</code></pre>
<p>正如在注释中指出的那样,<code>str</code>对象比普通循环具有更智能的算法,正如您所看到的<a href="https://stackoverflow.com/a/18139681/4669778">here</a></p>
<p>另见示例答案<a href="https://stackoverflow.com/questions/1964934/what-does-contains-do-what-can-call-contains-function">here</a></p>
<p>见文件<a href="https://docs.python.org/3/reference/datamodel.html#object.__contains__" rel="nofollow noreferrer">here</a></p>
<p>因为现实世界中的场景可能意味着<code>string1</code>可以任意长,但是要删除的字符集有限且很小,所以将不在<code>string2</code>中的所有字符相加可能会更有效。大概是这样的:</p>
<pre><code>def removeChars (string1, string2):
result = ''
for char in string1:
if char not in string2:
result += char
return result
</code></pre>
<p>这将涉及只在<code>string1</code>上循环一次,但使用<code>in</code>对<code>string2</code>进行多次检查。这可以进一步简化(以避免对结果进行<code>+=</code>循环):</p>
<pre><code>def removeChars (string1, string2):
return ''.join(char for char in string1 if char not in string2)
</code></pre>