<p>有一些不清楚的行为使你的第一个代码工作,而第二个代码却没有发生。在</p>
<p>如果一个<code>for</code>循环能够在没有<code>break</code>的情况下自然完成,则执行<code>else</code>语句。在</p>
<p>上面印着“好的!”公司名称:</p>
<pre><code>for i in range(10):
if i == 11: break # Condition not reached, loop ends naturally
else:
print('Ok!')
</code></pre>
<p>但这不能:</p>
^{pr2}$
<p>如果你像以前那样做:</p>
<pre><code>pnumber1b = list(range(3, 101))
for x in pnumber1b:
for i in range(2, x):
if x % i == 0:
pnumber1b.remove(x)
else:
break
</code></pre>
<p>然后它将自然到达<code>for i in range(2, x):</code>的末尾,将触发<code>else</code>并跳出外循环,而不检查大多数值。在</p>
<p>您可以删除<code>else</code>:</p>
<pre><code>pnumber1b = list(range(3, 101))
for x in pnumber1b:
for i in range(2, x):
if x % i == 0:
pnumber1b.remove(x)
print(pnumber1b)
</code></pre>
<p>这将失败,因为对于具有多个倍数的数字,它将尝试删除该项两次,并在找不到已删除的项时引发异常。在</p>
<p>在找到第一个倍数后,可以添加一个中断以停止查找倍数:</p>
<pre><code>pnumber1b = list(range(3, 101))
for x in pnumber1b:
for i in range(2, x):
if x % i == 0:
pnumber1b.remove(x)
break
print(pnumber1b)
</code></pre>
<p>除了在迭代列表时删除列表项会导致迭代出现问题外,<em>会起作用。您将看到它将开始只删除偶数。在</p>
<p>有效的方法是创建一个新列表,将非素数添加到该列表中,然后在</em>迭代列表后,删除它们:</p>
<pre><code>to_remove = []
pnumber1b = list(range(3, 101))
for x in pnumber1b:
for i in range(2, x):
if x % i == 0:
to_remove.append(x)
break
for r in to_remove:
pnumber1b.remove(r)
print(pnumber1b)
</code></pre>