Комментарии (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
Итераторы и генераторы — ключевые концепции для работы с большими объемами данных в тестировании.