Итераторы: понятие, цикл for, next() и iter()
Что такое итераторы? 🎯
Итератор — это объект, который позволяет последовательно получать элементы из коллекции (например, списка, строки или словаря). Он запоминает своё состояние между вызовами, поэтому каждый раз возвращает следующий элемент.
Почему это важно? Потому что итераторы — фундамент работы цикла for и многих других мощных инструментов Python!
Простой пример: как работает итератор
numbers = [10, 20, 30]
iterator = iter(numbers) # Создаём итератор из списка
print(next(iterator)) # 10
print(next(iterator)) # 20
print(next(iterator)) # 30
print(next(iterator)) # 🚨 Ошибка StopIteration (элементы закончились)
🔹 iter() — превращает коллекцию в итератор.
🔹 next() — получает следующий элемент.
Цикл for под капотом 🛠️
Цикл for в Python — это просто синтаксический сахар для работы с итераторами!
Как for работает на самом деле?
Вот что делает Python, когда вы пишете:
for number in [10, 20, 30]:
print(number)
Под капотом происходит это:
iterator = iter([10, 20, 30]) # Создаём итератор
while True:
try:
number = next(iterator) # Берём следующий элемент
print(number)
except StopIteration: # Если элементы закончились
break
💡 Вывод: for автоматически вызывает iter() и next(), а также обрабатывает StopIteration.
Создаём свой итератор 🏗️
Любой объект может стать итератором, если у него есть методы __iter__() и __next__().
Пример: итератор, который считает до N
class CountToN:
def __init__(self, n):
self.current = 1
self.n = n
def __iter__(self):
return self # Возвращаем сам объект как итератор
def __next__(self):
if self.current > self.n:
raise StopIteration # Останавливаем итерацию
result = self.current
self.current += 1
return result
# Используем
counter = CountToN(3)
for num in counter:
print(num) # 1, 2, 3
🔹 __iter__() — возвращает сам итератор.
🔹 __next__() — возвращает следующий элемент или вызывает StopIteration.
Практика: разбираем реальный кейс 🔥
Задача: чтение большого файла по частям
Если файл весит 100 ГБ, загружать его в память целиком нельзя. Решение: итератор, который читает файл построчно!
class FileReader:
def __init__(self, filename):
self.file = open(filename, 'r')
def __iter__(self):
return self
def __next__(self):
line = self.file.readline()
if not line:
self.file.close()
raise StopIteration
return line.strip()
# Используем
reader = FileReader("huge_file.txt")
for line in reader:
print(line) # Читаем файл построчно без перегрузки памяти
💡 Суперполезно: так работают генераторы (yield), но о них — в следующем уроке!
Итоги 🎓
✅ Итератор — объект, который возвращает элементы по одному.
✅ iter() создаёт итератор, next() получает следующий элемент.
✅ Цикл for — это просто удобная обёртка над iter() и next().
✅ Свой итератор можно создать через __iter__() и __next__().
🚀 Где применять? При работе с большими данными, файлами, базами данных или при создании своих коллекций!
Хотите глубже? Рекомендую разбор итераторов от Данилы Бежина.