Вопрос проверяет понимание различий между асинхронными функциями (async def) и генераторами в Python, что важно для выбора правильного инструмента для работы с последовательностями данных или конкурентными операциями.
В Python async def и генераторы служат разным целям, хотя оба используют механизм приостановки выполнения. async def создаёт асинхронную функцию, называемую корутиной, которая работает в рамках асинхронного программирования с событийным циклом (например, с библиотекой asyncio). Она позволяет выполнять неблокирующие операции, такие как сетевые запросы или чтение файлов, используя ключевое слово await. Генератор же — это обычная функция, содержащая ключевое слово yield, которая возвращает итератор для последовательной генерации значений по требованию, что полезно для обработки больших данных или бесконечных последовательностей.
async def для асинхронности и конкурентности; генераторы для ленивых вычислений и итераций.async def использует await для приостановки; генераторы используют yield.async def возвращает корутину (объект типа coroutine), которую нужно запускать в событийном цикле; генератор возвращает объект-генератор (тип generator), который является итератором.Пример генератора для последовательности чисел:
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, а генераторы — для создания итераторов по последовательностям данных. В современных асинхронных приложениях часто комбинируют оба подхода через асинхронные генераторы.