#python #python-3.x #generator
#python #python-3.x #генератор
Вопрос:
Недавно я посмотрел видео, описывающее лень в Python с примером, который находит простые числа.
Мы получили функцию, которая выдает число из бесконечного потока чисел:
def nums(n):
yield n
yield from nums(n 1)
Здесь нет ничего особенного. Часть, которую я не понимаю, находится i for i in s if i%n != 0
в sieve
функции, которая отвечает за поиск фактических простых чисел.
def sieve(s):
n = next(s)
yield n
yield from sieve(i for i in s if i%n != 0)
Кажется, что он создает новый генератор, передавая его в sieve
функцию, сохраняя только числа, которые не кратны n
.
Мой вопрос в том, что это не s
бесконечный поток? Как можно выполнить цикл во всем этом, чтобы удалить необходимые числа, создавая новый генератор?
Я думаю, что эта часть тоже ленива… Является ли это i for i in s if i%n != 0
каким-то однострочным генератором, который повторяется один за другим при next(s)
запуске?
Короче, что я получаю из этого, так это то, что мы уточняем генератор, передаваемый sieve
при каждом его запуске.
Комментарии:
1. Я думаю, ответ «Да, вы правы»…
2. Это действительно должно быть итеративным, а не рекурсивным
3. @wjandrea Как бы вы сделали
sieve
итеративный?4. @superb со списком просмотренных чисел
5. @wjandrea Ок. Мне было интересно, есть ли у вас что-то более близкое к оригиналу. Я сделал это , но это никуда не годится.