yield
1. Что такое yield
yield
yield
— это ключевое слово, которое превращает функцию в генератор.В отличие от
return
, которое завершает функцию и возвращает значение,yield
возвращает значение и "замораживает" состояние функции, чтобы при следующем вызове продолжить с того же места.
2. Пример использования
def my_generator(n):
for i in range(n):
yield i # возвращает i и сохраняет текущее состояние
gen = my_generator(3)
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 2
# print(next(gen)) # StopIteration
Каждый вызов
next(gen)
возобновляет функцию после последнегоyield
.После завершения всех
yield
генератор выдаёт StopIteration.
3. Генераторное выражение
Более компактная форма генератора, похожа на list comprehension, но с
()
:
gen_exp = (x**2 for x in range(5))
print(list(gen_exp)) # [0, 1, 4, 9, 16]
4. Отличие yield
от return
yield
от return
Характеристика
return
yield
Возвращаемое значение
Один раз
Можно несколько раз
Завершение функции
Да
Нет, сохраняется состояние
Тип функции
Обычная функция
Генератор
5. Применение в автотестах
Генерация тестовых данных "на лету":
def generate_users(n):
for i in range(n):
yield {"username": f"user{i}", "password": "123"}
Обработка больших файлов или логов, чтобы не загружать весь файл в память:
def read_file(file_path):
with open(file_path) as f:
for line in f:
yield line.strip()
Использование с pytest:
import pytest
@pytest.mark.parametrize("user", generate_users(3))
def test_login(user):
assert login(user["username"], user["password"]) == True
💡 Вывод:
yield
= возвращает значение без завершения функции и создаёт генератор.Идеально подходит для ленивой генерации данных, больших последовательностей и оптимизации памяти.
Last updated
Was this helpful?