else 分支在您找到一个不能被i 整除的数字时执行。在这种情况下,这意味着任何奇数都被添加,因为它们不能被2整除,但所有偶数都是。 9 和 15 可能不是素数,但它们是奇数。
只有在for 循环测试了范围内的所有整数时才应该添加一个数字,而不是在if 测试失败时添加一个数字。您可以通过 unindenting else 分支来做到这一点,以便它与 for 循环匹配。
而不是与if匹配:
for ...:
if ...:
else:
匹配for循环:
for ...:
if ...:
else:
因为只有当for 循环不使用break 语句结束时才会执行,例如当所有数字都经过测试并且无法除以x:
for i in range(0, 20):
for x in range(2, i):
if i%x == 0:
break
else:
p = p + [i]
请注意,break 然后可以从else 套件中删除,因为到那时您不再处于循环中。
请注意,要找到一个质数,您只需要测试该数的平方根即可;如果x 可以被数字i 整除,那么它也可以被i 的所有除数整除。见Why do we check up to the square root of a prime number to determine if it is prime?
在列表中添加数字也可以使用list.append() 来完成,这比在另一个列表中使用加法运算符要清晰一些:
for i in range(20):
if i < 2:
continue # not prime numbers either
for x in range(2, int(i ** 0.5) + 1):
if i % x == 0:
# found a divisor, abort search
break
else:
p.append(i)
演示:
>>> p = []
>>> for i in range(20):
... if i < 2:
... continue # not prime numbers either
... for x in range(2, int(i ** 0.5) + 1):
... if i % x == 0:
... # found a divisor, abort search
... break
... else:
... p.append(i)
...
>>> p
[2, 3, 5, 7, 11, 13, 17, 19]