Simple prime number generator in Python

前端 未结 26 2169
感情败类
感情败类 2020-11-22 07:16

Could someone please tell me what I\'m doing wrong with this code? It is just printing \'count\' anyway. I just want a very simple prime generator (nothing fancy).

26条回答
  •  深忆病人
    2020-11-22 08:05

    Another simple example, with a simple optimization of only considering odd numbers. Everything done with lazy streams (python generators).

    Usage: primes = list(create_prime_iterator(1, 30))

    import math
    import itertools
    
    def create_prime_iterator(rfrom, rto):
        """Create iterator of prime numbers in range [rfrom, rto]"""
        prefix = [2] if rfrom < 3 and rto > 1 else [] # include 2 if it is in range separately as it is a "weird" case of even prime
        odd_rfrom = 3 if rfrom < 3 else make_odd(rfrom) # make rfrom an odd number so that  we can skip all even nubers when searching for primes, also skip 1 as a non prime odd number.
        odd_numbers = (num for num in xrange(odd_rfrom, rto + 1, 2))
        prime_generator = (num for num in odd_numbers if not has_odd_divisor(num))
        return itertools.chain(prefix, prime_generator)
    
    def has_odd_divisor(num):
        """Test whether number is evenly divisable by odd divisor."""
        maxDivisor = int(math.sqrt(num))
        for divisor in xrange(3, maxDivisor + 1, 2):
            if num % divisor == 0:
                return True
        return False
    
    def make_odd(number):
        """Make number odd by adding one to it if it was even, otherwise return it unchanged"""
        return number | 1
    

提交回复
热议问题