Python 中的 Prime Sieve 算法:帮助解释

Prime Sieve algorithm in Python : Help Explaining

我使用我隐约理解的枚举函数遇到了这个素数筛选,我理解代码背后的一般思想,即将 'True' 列表中的所有非素数转换为 'False' 然后从中创建一个素数列表。但是我不确定如何解释第 5 行之后的代码,is_prime 是函数还是变量?我有点困惑

def prime_sieve(n):
    sieve = [True] * n #Generates a list of 'True' of length n
    sieve[:2] = [False, False]  #  0 and 1 are not primes
    primes = []
    for prime, is_prime in enumerate(sieve): 
        if not is_prime:
            continue
        primes.append(prime)
        for not_prime in range(prime*prime, n, prime):
            sieve[not_prime] = False 
    return primes, sieve

试试这个:

sieve = [True,True,True]
for x,y in enumerate(sieve):
   print(x,y)

你现在明白了吗?

def prime_sieve(n):
    sieve = [True] * n #Generates a list of 'True' of length n
    sieve[:2] = [False, False]  #  0 and 1 are not primes
    primes = []

声明函数,设置变量。 Sieve 是一个布尔值列表,用于表示给定索引的数字是否为素数。 Primes 被设置为到目前为止找到的空素数列表。

    for prime, is_prime in enumerate(sieve): 

遍历所有数字的枚举列表及其对应的布尔值。枚举就像遍历一个列表,但也有所有列表变量的索引。由于 enumerate 为每个列表元素提供两个变量,因此您需要使用两个变量来解包它。 'prime' 将是一个数字,被访问的列表元素的索引,'is_prime' 是该索引处的布尔值。

        if not is_prime:
            continue

如果一个数字之前被声明为 'not prime',则跳过它。

primes.append(prime)

如果不是,将其添加到已找到的素数列表中。

        for not_prime in range(prime*prime, n, prime):
            sieve[not_prime] = False 

从素数的平方开始到最后,所有能被素数整除的数都设为假

 return primes, sieve

Returns所有质数的列表,以及筛中所有数字的布尔列表。

如果 is_prime 是一个函数,那么它就不会是 False,所以 not is_prime 总是 return False,无论 is_prime 是。请注意,函数和函数之间存在差异return;如果 is_prime 是一个函数,那么 is_prime() 就是 is_prime() returns,它可能是 False,但是 is_prime 就是函数对象本身,它不是 False。函数可以returnFalse,但不能False.