yield
1. Что такое yield
yieldyield— это ключевое слово, которое превращает функцию в генератор.В отличие от
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?