Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Python: async def, generator, coroutine, asyncio, yield

В чем разница между async def и генераторами?

Вопрос проверяет понимание различий между асинхронными функциями (async def) и генераторами в Python, что важно для выбора правильного инструмента для работы с последовательностями данных или конкурентными операциями.

Короткий ответ

async def определяет асинхронную функцию (корутину), которая может приостанавливать выполнение для ожидания других операций (например, ввода-вывода) без блокировки потока, используя ключевое слово await. Генератор — это функция с yield, которая возвращает итератор для ленивого генерирования последовательности значений, приостанавливаясь на каждом yield. Ключевое отличие: async def предназначен для асинхронного программирования с событийным циклом, а генераторы — для создания итераторов. В Python 3.5+ можно использовать async def с yield для создания асинхронных генераторов, объединяя оба подхода.

Длинный ответ

В Python async def и генераторы служат разным целям, хотя оба используют механизм приостановки выполнения. async def создаёт асинхронную функцию, называемую корутиной, которая работает в рамках асинхронного программирования с событийным циклом (например, с библиотекой asyncio). Она позволяет выполнять неблокирующие операции, такие как сетевые запросы или чтение файлов, используя ключевое слово await. Генератор же — это обычная функция, содержащая ключевое слово yield, которая возвращает итератор для последовательной генерации значений по требованию, что полезно для обработки больших данных или бесконечных последовательностей.

Основные различия

  • Цель: async def для асинхронности и конкурентности; генераторы для ленивых вычислений и итераций.
  • Ключевые слова: async def использует await для приостановки; генераторы используют yield.
  • Возвращаемое значение: async def возвращает корутину (объект типа coroutine), которую нужно запускать в событийном цикле; генератор возвращает объект-генератор (тип generator), который является итератором.
  • Использование: Асинхронные функции применяются в веб-серверах, клиентах API и других I/O-bound задачах; генераторы — в циклах для обработки потоков данных.

Примеры кода

Пример генератора для последовательности чисел:

def count_up_to(n):
    i = 1
    while i <= n:
        yield i  # Приостанавливается и возвращает значение
        i += 1

# Использование
for num in count_up_to(5):
    print(num)  # Вывод: 1, 2, 3, 4, 5

Пример асинхронной функции для задержки:

import asyncio

async def fetch_data():
    print('Начало загрузки')
    await asyncio.sleep(2)  # Неблокирующая задержка
    print('Данные загружены')
    return 'результат'

# Запуск в событийном цикле
async def main():
    result = await fetch_data()
    print(result)

asyncio.run(main())

Начиная с Python 3.5, можно создавать асинхронные генераторы, используя async def с yield, что позволяет лениво генерировать значения в асинхронном контексте.

Вывод: Используйте async def для асинхронных операций, где требуется эффективно ждать I/O, а генераторы — для создания итераторов по последовательностям данных. В современных асинхронных приложениях часто комбинируют оба подхода через асинхронные генераторы.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#async def

#generator

#coroutine

#asyncio

#yield

Подпишись на Python Developer в телеграм