# yield

### **1. Что такое `yield`**

* `yield` — это ключевое слово, которое **превращает функцию в генератор**.
* В отличие от `return`, которое **завершает функцию и возвращает значение**, `yield` **возвращает значение и "замораживает" состояние функции**, чтобы при следующем вызове продолжить с того же места.

***

### **2. Пример использования**

```python
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, но с `()`:

```python
gen_exp = (x**2 for x in range(5))
print(list(gen_exp))  # [0, 1, 4, 9, 16]
```

***

### **4. Отличие `yield` от `return`**

| Характеристика        | `return`        | `yield`                    |
| --------------------- | --------------- | -------------------------- |
| Возвращаемое значение | Один раз        | Можно несколько раз        |
| Завершение функции    | Да              | Нет, сохраняется состояние |
| Тип функции           | Обычная функция | Генератор                  |

***

### **5. Применение в автотестах**

* **Генерация тестовых данных "на лету"**:

```python
def generate_users(n):
    for i in range(n):
        yield {"username": f"user{i}", "password": "123"}
```

* **Обработка больших файлов или логов**, чтобы не загружать весь файл в память:

```python
def read_file(file_path):
    with open(file_path) as f:
        for line in f:
            yield line.strip()
```

* **Использование с pytest**:

```python
import pytest

@pytest.mark.parametrize("user", generate_users(3))
def test_login(user):
    assert login(user["username"], user["password"]) == True
```

***

💡 **Вывод:**

* `yield` = возвращает значение **без завершения функции** и создаёт **генератор**.
* Идеально подходит для **ленивой генерации данных, больших последовательностей и оптимизации памяти**.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/yield.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
