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
.
我使用我隐约理解的枚举函数遇到了这个素数筛选,我理解代码背后的一般思想,即将 '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
.