Это домашнее задание, но урок уже дает мне ответ. У меня проблемы с переводом слов из ответа в строку кода
#Calculate all the primes below 1000
result = [1]
candidates = range(3, 1000)
base = 2
product = base
while candidates:
while product < 1000:
if product in candidates:
candidates.remove(product)
product = product + base
result.append(base)
base = candidates[0]
product = base
del candidates[0]
result.append(base)
print result
Это версия "Сита Эрастотена".
Это объяснение, которое мне было дано.
Новое в этом примере ...
Диапазон встроенных функций фактически возвращает список, который можно использовать, как и все остальные списки. (Он включает в себя первый индекс, но не последний.) Список может использоваться как логическая переменная. Если он не пустой, то это правда - если он пустой, то это ложь. Таким образом, тогда как кандидаты означают «пока список именованных кандидатов не пуст» или просто «пока есть кандидаты». Вы можете написать if someElement в someList, чтобы проверить, есть ли элемент в списке. Вы можете написать someList.remove (someElement), чтобы удалить someElement из someList. Вы можете добавить элемент в список, используя someList.append (что-то). На самом деле, вы тоже можете использовать + (как в someList = someList + [что-то]), но это не так эффективно. Вы можете получить элемент списка, указав его позицию в виде числа (где первый элемент, как ни странно, это элемент 0) в скобках после имени списка. Таким образом, someList [3] является четвертым элементом списка someList. (Подробнее об этом ниже.) Вы можете удалить переменные, используя ключевое слово del. Его также можно использовать (как здесь) для удаления элементов из списка. Таким образом, del someList [0] удаляет первый элемент someList. Если бы список был [1,2,3] до удаления, он был бы [2,3] после.
Прежде чем перейти к объяснению загадок индексирования элементов списка, я приведу краткое объяснение примера.
Это версия древнего алгоритма под названием «Сито Эрастотен» (или что-то похожее на это). Он рассматривает набор (или в данном случае список) номеров кандидатов, а затем систематически удаляет числа, о которых известно, что они не являются простыми числами. Откуда нам знать? Потому что они являются произведениями двух других чисел.
Мы начнем со списка кандидатов, содержащего числа [2..999] - мы знаем, что 1 - это простое число (на самом деле, это может или не может быть, в зависимости от того, кого вы спрашиваете), и мы хотели, чтобы все простые числа были меньше 1000 (На самом деле, наш список кандидатов [3.999], но 2 также является кандидатом, так как это наша первая база). У нас также есть список с именем result, который всегда содержит обновленные результаты. Начнем с того, что этот список содержит только номер 1. У нас также есть переменная с именем base. Для каждой итерации («раунда») алгоритма мы удаляем все числа, которые являются кратными этого базового числа (которое всегда является наименьшим из кандидатов). После каждой итерации мы знаем, что наименьшее оставшееся число - это простое число (поскольку все числа, которые были произведениями меньших, удалены - получите его?). Поэтому мы добавляем его к результату, устанавливаем новую базу на это число и удаляем его из списка кандидатов (чтобы мы не обрабатывали его снова.) Когда список кандидатов пуст, список результатов будет содержать все простые числа. , Умно, а?
Чего я не понимаю, так это того, где они говорят: «мы удаляем все числа, кратные этому базовому числу». Где это в строке кода? Может кто-нибудь построчно объяснить, что делает программа? Я новичок в этом, пытаясь понять механику каждой строки кода и почему. Спасибо за любую помощь.