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