import itertools
import math
def is_prime(n):
assert n >= 1, f"n must be >= 1, is {n}"
if n == 1:
return False
if n % 2 == 0:
return True
for i in range(3, math.floor(math.sqrt(n))+1, 2):
if n % i == 0:
return False
return True
only_pair_prime = iter([2])
odd_numbers = itertools.count(3, 2)
prime_candidates = itertools.chain(only_pair_prime, odd_numbers)
primes = filter(is_prime, prime_candidates)
first_20 = itertools.islice(primes, 20)
print(list(first_20))
aW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgbWF0aAoKCmRlZiBpc19wcmltZShuKToKICAgIGFzc2VydCBuID49IDEsIGYibiBtdXN0IGJlID49IDEsIGlzIHtufSIKICAgIGlmIG4gPT0gMToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIG4gJSAyID09IDA6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBmb3IgaSBpbiByYW5nZSgzLCBtYXRoLmZsb29yKG1hdGguc3FydChuKSkrMSwgMik6CiAgICAgICAgaWYgbiAlIGkgPT0gMDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgcmV0dXJuIFRydWUKCgpvbmx5X3BhaXJfcHJpbWUgPSBpdGVyKFsyXSkKb2RkX251bWJlcnMgPSBpdGVydG9vbHMuY291bnQoMywgMikKcHJpbWVfY2FuZGlkYXRlcyA9IGl0ZXJ0b29scy5jaGFpbihvbmx5X3BhaXJfcHJpbWUsIG9kZF9udW1iZXJzKQpwcmltZXMgPSBmaWx0ZXIoaXNfcHJpbWUsIHByaW1lX2NhbmRpZGF0ZXMpCmZpcnN0XzIwID0gaXRlcnRvb2xzLmlzbGljZShwcmltZXMsIDIwKQpwcmludChsaXN0KGZpcnN0XzIwKSkK
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]