Традиционно расширенные генераторы использовались в библиотеках, базирующихся на асинхронном вводе/выводе. В этом контексте они обычно называются сопрограммами или сопрограммами на базе генераторов
В приведенном виде функция выполняется бесконечно. Для закрытия генератора можно воспользоваться методом close()
Здесь исходный вызов r.send(None) нужен, чтобы генератор выполнил команды, ведущие к первому выражению yield. В этот момент он приостанавливается, ожидая отправки ему значения методом send() связанного объекта-генератора r. Значение, переданное send(), возвращается выражением yield в генераторе. При получении значения генератор выполняет команды до обнаружения следующего yield.
Но генераторы оказываются особенно эффективны для структурирования разных задач обработки данных, связанных с конвейерами и рабочими процессами.
yieldfrom избавляет вас от необходимости управлять перебором вручную
yieldfrom делегирует процесс перебора внешней конструкции.
Корректное освобождение ресурсов — непростая задача. Но пока вы используете такие конструкции, как try-finally или менеджер контекста, генераторы отработают правильно даже в случае преждевременного прерывания
Обычно вы не вызываете next() для генератора напрямую, а используете команду for или другую операцию, потребляющую элементы
9
При вызове next() функция-генератор выполняет команды до достижения yield
Если функция использует ключевое слово yield, она определяет объект, называемый генератором