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))
