Алгоритм Prime Sieve в Python: Объяснение справки
Я наткнулся на это простое сито, используя функцию enumerate, которую я смутно понимаю, я понимаю общую идею, лежащую в основе кода, то есть превращение всех не простых значений в списке "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
3 ответа
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 - это список логических значений, предназначенных для представления, является ли номер заданного индекса простым или нет. Для простых чисел задан пустой список найденных простых чисел.
for prime, is_prime in enumerate(sieve):
Перебирайте перечислимый список всех чисел и их логических аналогов. Перечисление похоже на итерацию по списку, но также имеет индекс всех переменных списка. Поскольку перечисление дает две переменные для каждого элемента списка, вам нужно использовать две переменные, чтобы распаковать его. 'prime' будет числом, индексом элемента списка, к которому осуществляется доступ, а 'is_prime' является логическим значением этого индекса.
if not is_prime:
continue
Если число ранее было объявлено как "не простое", пропустите его.
primes.append(prime)
Если нет, добавьте его в список уже найденных простых чисел.
for not_prime in range(prime*prime, n, prime):
sieve[not_prime] = False
Начиная с квадрата простого числа до конца, все числа, которые делятся на простое число, устанавливаются в False
return primes, sieve
Возвращает список всех простых чисел и логический список всех чисел в сите.
Попробуй это:
sieve = [True,True,True]
for x,y in enumerate(sieve):
print(x,y)
Вы понимаете теперь?
Если is_prime
были бы функцией, то не было бы False
, так not is_prime
всегда вернется False
независимо от того, что is_prime
является. Обратите внимание, что есть разница между функцией и возвратом функции; если is_prime
были функцией, то is_prime()
будет что is_prime()
возвращает, что может быть False
, но is_prime
будет сам объект функции, который не является False
, Функция может вернуть False
, но это не может быть False
,