is_prime
次のように bool フラグを使用して、指定された N までの素数を返す単純な python モジュールを作成しました。
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]
これは、ループ内で s が発生しない場合にのみfor-else
数n
が素数になるため、実際にはこの構造を使用するのに理想的なケースです。したがって、関数を次のように変更しました。break
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
その行を削除すると、コードは正しい出力を再び生成します。