yield

1. Что такое 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

Характеристика

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?