Ответ
Основное синтаксическое различие заключается в ключевых словах, используемых для их определения и управления.
-
Генераторы (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
- Определяются с помощью стандартной функции
-
Корутины (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
для ожидания результата другой асинхронной операции.