Развёрнутое пояснение:
1. Вызов orders() создаёт объект генератора, но его тело пока не выполняется.
2. next(stream) запускает генератор: печатается open, затем выполнение доходит до yield 101 и приостанавливается.
3. Внешний print получает значение 101 и печатает его.
4. Следующий print выводит done, поскольку генератор всё ещё приостановлен на yield.
5. stream.close() передаёт в точку приостановки служебное исключение GeneratorExit. Обычное продолжение после yield не происходит, поэтому строка next не печатается.
6. Перед завершением генератор обязательно выполняет блок finally, который печатает close. Итоговый порядок строк: open, 101, done, close.
Почему это важно
Задача проверяет жизненный цикл генераторов и гарантированную очистку ресурсов. В потоковой обработке генератор может удерживать файл, соединение или транзакцию; если потребитель прекращает чтение досрочно, явный вызов close() запускает очистку из finally, но не продолжает обычную обработку оставшихся элементов.
Post #4909
150
Python: задачки и вопросы