← Назад к вопросам

Что такое итератор в Python?

2.3 Middle🔥 101 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Итераторы в Python

Определение

Итератор — это объект, который позволяет проходить по последовательности элементов по одному. Он имеет два метода: iter() (возвращает сам итератор) и next() (возвращает следующий элемент).

Как работают итераторы

Когда вы пишете цикл for, Python автоматически создает итератор:

list_items = [1, 2, 3]
for item in list_items:
    print(item)

# Эквивалентно:
iterator = iter(list_items)
while True:
    try:
        item = next(iterator)
        print(item)
    except StopIteration:
        break

Создание собственного итератора

class CountUp:
    def __init__(self, max):
        self.max = max
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current < self.max:
            self.current += 1
            return self.current
        else:
            raise StopIteration

for num in CountUp(3):
    print(num)  # 1, 2, 3

Генераторы (Generators)

Генератор — это упрощенный способ создания итератора с помощью функции и ключевого слова yield:

def count_up(max):
    current = 0
    while current < max:
        current += 1
        yield current

for num in count_up(3):
    print(num)  # 1, 2, 3

Использование в тестировании

import pytest

def test_data_generator():
    def generate_test_data():
        for i in range(10):
            yield {"id": i, "name": f"User{i}"}
    
    data = list(generate_test_data())
    assert len(data) == 10
    assert data[0]["id"] == 0

@pytest.fixture
def test_users():
    def _generate():
        for i in range(5):
            yield {"id": i, "email": f"user{i}@test.com"}
    return _generate()

Встроенные функции для итераторов

data = [1, 2, 3, 4, 5]

# map() — применяет функцию к каждому элементу
squared = map(lambda x: x**2, data)
list(squared)  # [1, 4, 9, 16, 25]

# filter() — фильтрует элементы
even = filter(lambda x: x % 2 == 0, data)
list(even)  # [2, 4]

# zip() — объединяет итерируемые объекты
names = ["John", "Jane"]
ages = [30, 25]
for name, age in zip(names, ages):
    print(f"{name}: {age}")

Преимущества итераторов

  • Экономия памяти — обрабатывают элементы по одному
  • Ленивое вычисление — данные генерируются при необходимости
  • Упрощение кода — для работы с большими наборами данных

Примеры в реальном тестировании

def test_large_dataset():
    def read_csv_lines():
        with open('data.csv') as f:
            for line in f:
                yield line.strip().split(',')
    
    for row in read_csv_lines():
        assert len(row) >= 3  # Проверяем структуру

def parametrized_test():
    @pytest.mark.parametrize("input,expected", [
        (x, x**2) for x in range(100)  # Генерируем данные
    ])
    def test_power(input, expected):
        assert input ** 2 == expected

Итераторы и генераторы — ключевые концепции для работы с большими объемами данных в тестировании.

Что такое итератор в Python? | PrepBro