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


def next_prime_after(n):
    next_odd = (n + 1) | 1

    while not is_prime(next_odd):
        next_odd += 2

    return next_odd


def primes_from(n=2):
    if is_prime(n):
        yield n
    
    while True:
        n = next_prime_after(n)
        yield n


first_20_primes = itertools.islice(primes_from(2), 20)
print(list(first_20_primes))
