Чем синтаксически отличаются генераторы от корутин в Python

Ответ

Основное синтаксическое различие заключается в ключевых словах, используемых для их определения и управления.

  1. Генераторы (Generators):

    • Определяются с помощью стандартной функции def.
    • Используют ключевое слово yield для приостановки выполнения и возврата значения. При следующем вызове выполнение возобновляется с места остановки.
    • Цель: Создание итераторов для ленивого вычисления последовательностей.
    def number_generator(n):
        """Генератор, который выдает числа от 0 до n-1."""
        for i in range(n):
            yield i
    
    # Использование
    for num in number_generator(3):
        print(num)  # Выведет 0, 1, 2
  2. Корутины (Coroutines):

    • Определяются с помощью async def.
    • Используют ключевое слово await для приостановки своего выполнения и передачи управления другой корутине (или Future/Task).
    • Цель: Реализация кооперативной многозадачности для асинхронных операций (например, I/O).
    import asyncio
    
    async def fetch_data(url):
        """Корутина, имитирующая асинхронный сетевой запрос."""
        print(f"Начинаю загрузку с {url}...")
        await asyncio.sleep(1) # Приостановка для имитации I/O
        print(f"Загрузка с {url} завершена.")
        return {"data": "some data"}
    
    # Использование
    async def main():
        await fetch_data("https://example.com")
    
    asyncio.run(main())

Кратко: генераторы используют yield для производства данных, а корутины — await для ожидания результата другой асинхронной операции.