Найти в Дзене
Self Study

Конструкция yield from в Python

Введение Конструкция yield from используется для делегирования работы другому генератору. Она позволяет «вкладывать» один генератор в другой, то есть создавать субгенераторы. Это позволяет упростить код и избежать лишних циклов. Сравнение for + yield с yield from В самом простом случае, выражение yield from iterable - это просто сокращенная форма for item in iterable: yield item. Пример: Использование yield from с range Еще один пример использования yield from: Обход узлов бинарного дерева Конструкция yield from также может оказаться полезной при обходе узлов бинарного дерева. Давайте взглянем на пример: Но использование yield from как сокращенной записи обхода цикла - это недостаточная причина для введения новой инструкции, поэтому есть еще одно применение, которое мы должны упомянуть. Но для начала, нам нужно познакомиться с корутинами. Корутины Корутины или сопрограммы в Python - это особый вид функций, которые могут приостанавливать и возобновлять свое выполнение без потери со
Оглавление

Введение

Конструкция yield from используется для делегирования работы другому генератору. Она позволяет «вкладывать» один генератор в другой, то есть создавать субгенераторы. Это позволяет упростить код и избежать лишних циклов.

Сравнение for + yield с yield from

В самом простом случае, выражение yield from iterable - это просто сокращенная форма for item in iterable: yield item.

Пример:

Сравнение for + yield с yield from
Сравнение for + yield с yield from

Использование yield from с range

Еще один пример использования yield from:

Пример использования yield from с range
Пример использования yield from с range

Обход узлов бинарного дерева

Конструкция yield from также может оказаться полезной при обходе узлов бинарного дерева. Давайте взглянем на пример:

Обход узлов бинарного дерева
Обход узлов бинарного дерева

Но использование yield from как сокращенной записи обхода цикла - это недостаточная причина для введения новой инструкции, поэтому есть еще одно применение, которое мы должны упомянуть.

Но для начала, нам нужно познакомиться с корутинами.

Корутины

Корутины или сопрограммы в Python - это особый вид функций, которые могут приостанавливать и возобновлять свое выполнение без потери состояния. Они используются для асинхронного программирования, когда нужно выполнять несколько задач одновременно без блокировки основного потока. Корутины появились в Python как расширение генераторов, которые позволяют создавать итераторы. Для работы с корутинами в Python есть специальный модуль asyncio, который предоставляет инструменты для создания и управления сопрограммами и асинхронными операциями ввода-вывода.

Чтобы создать корутину в Python, нужно определить функцию с ключевым словом async def. Это называется функцией сопрограммы. Когда вы вызываете такую функцию, она возвращает объект сопрограммы, который можно запустить с помощью await или asyncio.run(). Внутри функции сопрограммы вы можете использовать await для приостановки выполнения и ожидания результата другой сопрограммы или асинхронной операции. Вы также можете использовать yield или yield from для возврата значений из сопрограммы. Пример функции сопрограммы:

Пример функции сопрограммы
Пример функции сопрограммы

Пример использования await и yield from

Когда вы используете yield from внутри сопрограммы, вы передаете управление делегируемой сопрограмме и ждете ее завершения. Вы также можете передавать данные и исключения внутрь делегируемой сопрограммы через yield from. Пример кода:

Пример использования await и yield from
Пример использования await и yield from

Отличия между await и yield from

  • Разница между await и yield from в том, что await - это современный способ ожидания сопрограммы в asyncio, а yield from - это старый способ ожидания сопрограммы в asyncio.
  • Основное отличие между ними в том, что await может использоваться только внутри native coroutine (созданной с помощью async def), а yield from может использоваться в любой функции-генераторе (созданной с помощью def).
  • await поддерживает только объекты, которые реализуют протокол awaitable (native coroutines, coroutine objects, futures и tasks), а yield from поддерживает любые объекты, которые реализуют протокол iterable (generators, coroutines, iterators и collections).
  • await также позволяет использовать async for и async with для работы с асинхронными контекстами и итераторами.

В общем случае лучше использовать await, так как он более читаемый и совместимый с новыми возможностями асинхронного программирования. yield from можно использовать для работы со старыми библиотеками или кодом, который еще не перешел на async/await.