Вопрос проверяет понимание различий между генераторами и корутинами в Python, что важно для асинхронного программирования.
Генераторы и корутины в Python имеют общее происхождение, но служат разным целям. Генератор — это функция, которая использует yield для возврата последовательности значений по одному, сохраняя своё состояние между вызовами. Корутина — это более общая концепция: она может не только возвращать значения, но и принимать их через yield (или await), а также приостанавливать выполнение для ожидания других задач.
Генераторы создаются с помощью yield и используются для ленивых вычислений. Например, чтение большого файла построчно:
def read_lines(filename):
with open(filename) as f:
for line in f:
yield line.strip()
for line in read_lines('data.txt'):
print(line)Здесь генератор возвращает строки по одной, не загружая весь файл в память.
Корутины в Python 3.5+ определяются через async def и используют await для ожидания других корутин. Они могут как отправлять данные, так и получать их. Пример простой корутины:
async def greet():
name = await get_name()
print(f'Hello, {name}!')
async def get_name():
return 'Alice'Корутины работают в цикле событий (event loop) и позволяют выполнять конкурентные операции без блокировки потока.
yield для возврата значений; корутины используют await для ожидания.Вывод: используйте генераторы для обработки потоков данных, а корутины — для асинхронных операций, таких как сетевые запросы или работа с файлами.