Назад к вопросам
Middle
69
questionbank
Что такое ключевое слово yield и как оно используется в Python?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Ключевое слово yield используется в Python для создания генераторов.
Генератор — это функция, которая возвращает итератор. Вместо того чтобы возвращать все значения сразу (как обычная функция), генератор "отдает" значения по одному с помощью yield, сохраняя при этом свое внутреннее состояние между вызовами.
Основные преимущества использования генераторов с yield:
- Экономия памяти: Генераторы не хранят всю последовательность в памяти, а вычисляют элементы "на лету". Это особенно полезно при работе с большими объемами данных.
- Ленивые вычисления: Значения генерируются только тогда, когда они действительно нужны (при итерировании).
- Простота кода: Часто код генератора более читабелен и компактен по сравнению с явным определением класса-итератора.
Как это работает:
- Когда функция с
yieldвызывается, она не выполняется сразу, а возвращает объект-генератор. - При первом вызове
next()для генератора (например, в циклеfor), код функции выполняется до первого оператораyield. Значение справа отyieldвозвращается. Состояние функции (локальные переменные и где остановилось выполнение) сохраняется. - При последующих вызовах
next(), выполнение возобновляется ровно с того места, где остановилось после предыдущегоyield. - Так продолжается до тех пор, пока функция не завершится обычным образом или не встретит оператор
returnбез значения (или пустойreturn). В этом случае возбуждается исключениеStopIteration, сигнализируя об окончании последовательности.
Пример:
// Простой генератор, который генерирует числа до n
def count_up_to(n):
i = 0
while i < n:
yield i // Отдаем текущее значение
i += 1
Использование генератора:
// Создаем объект-генератор
counter = count_up_to(5)
// Итерируемся по генератору
print(next(counter)) // Вывод: 0
print(next(counter)) // Вывод: 1
// Использование в цикле for
for num in count_up_to(3):
print(num)
// Вывод:
// 0
// 1
// 2
yield также может использоваться для получения значений извне генератора с помощью метода send(), позволяя создавать сопрограммы, но это более продвинутый сценарий использования.