Как можно выполнить цикл в бесконечном генераторе, чтобы удалить некоторые элементы?

#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 Ок. Мне было интересно, есть ли у вас что-то более близкое к оригиналу. Я сделал это , но это никуда не годится.