RosettaCodeData/Task/Extensible-prime-generator/Python/extensible-prime-generator-...

27 lines
926 B
Python

from itertools import count, takewhile, islice
def prime_sieve():
sieved = count(2)
prime = next(sieved)
yield prime
primes = [prime]
for x in sieved:
possible_prime_divs = takewhile(lambda p: p <= x**0.5, primes)
if any(x % prime == 0 for prime in possible_prime_divs):
continue
yield x
primes.append(x)
if __name__ == '__main__':
def leq_150(x): return x <= 150
def leq_8000(x): return x <= 8000
print("Show the first twenty primes.\n =",
list(islice(prime_sieve(), 20)))
print("Show the primes between 100 and 150\n =",
[x for x in takewhile(leq_150, prime_sieve()) if x >= 100])
print("Show the number of primes between 7,700 and 8,000.\n =",
sum(1 for x in takewhile(leq_8000, prime_sieve()) if x >= 7700))
print("Show the 10,000th prime.\n =",
next(islice(prime_sieve(), 10000-1, 10000)))