我编写了一个简单的 python 模块,该模块返回给定 N 的素数,使用 bool 标志is_prime
,如下所示:
def generate_primes_up_to(M):
n = 2
primes = []
while n <= M:
is_prime = True
for p in primes:
if p**2 > n: break
if n % p == 0:
is_prime = False
break
if is_prime: primes.append(n)
n += 1
return primes
if __name__ == '__main__':
generate_primes_up_to(100)
输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
现在,这实际上是使用for-else
构造的理想情况,因为n
只有在循环中没有break
出现 s 时,数字才是素数。for
因此,我将函数更改为:
def generate_primes_up_to(M, flag='nonumpy'):
n = 2
primes = []
while n <= M:
for p in primes:
if p**2 > n: break
if n % p == 0: break
else: primes.append(n)
n += 1
return primes
但现在代码输出:
[2, 5, 27]
我不明白为什么该if p**2 > n: break
表达式会干扰for-else
子句的流程。如果我删除该行,代码将再次产生正确的输出。