TGViewer
Python Backend | YeaHub Python Backend | YeaHub @yeahub_python_backend · 1.76K subscribers
Post #580 598
Когда действительно нужны итераторы в python

И первое с чего нужно начать — итераторы нужны не ради экономия памяти, а они нужны ради контроля над чтением данных

Самый простой пример:
class DataStream:
def __init__(self, source):
self.source = source
self.pos = 0

def __iter__(self):
return self

def __next__(self):
if self.pos >= len(self.source):
raise StopIteration
value = self.source[self.pos]
self.pos += 1
return value


Такой объект читает данные по одному элементу и запоминает позицию

Т.е. состояние хранится внутри и повторно пройтись по данным нельзя

stream = DataStream([1, 2, 3])

list(stream) # [1, 2, 3]
list(stream) # []


По сути если объект можно читать сколько угодно раз — это скорее коллекция
А если можно прочитать только один раз — это поток


Итератор — это одноразовый поток

В целом можно сделать и через генератор:
def stream(data):
for x in data:
yield x


Но так стоит делать в следующих ситуациях:
- нет необходимости возвращаться назад
- нет внешних эффектов
- не нужно управление процессом чтения

Но как только появится задача вроде "продолжить с места последнего падения" или "повторить последний шаг" — с генератором может быть больше проблем, чем пользы

Как можно сохранить позицию, например:
class CheckpointStream(DataStream):
def checkpoint(self):
return self.pos

def restore(self, pos):
self.pos = pos

stream = CheckpointStream([100, 200, 300])

print(next(stream)) # 100
saved = stream.checkpoint()

print(next(stream)) # 200
stream.restore(saved)

print(next(stream)) # снова 200


Так работают пакетные обработки, конвейеры данных и повторные запуски после ошибок


А асинхронный вариант может выглядеть так:
class AsyncStream:
def __aiter__(self):
return self

async def __anext__(self):
...

# Дальше обычный цикл:
async for item in stream:
...



Если подытожить:
Генератор — удобный синтаксис
Итератор — инструмент управления

Если контроль над данными и позициями не нужен — не усложняйте код, можете просто использовать генератор


⭐️ Пост Guru Python:
Сергей Филичкин
  • ❤ 2
  • 🔥 1
More from @yeahub_python_backend
  1. Oct 8, 2026#Собес #sql #order 🤔 Какой порядок выполнения SQL-запроса? 💬 Кратко: SQL выполняется не…
  2. Oct 7, 2026#Собес #memory 🤔 Middle+ Python Backend-разработчик в DELOTECH Техническое собеседование.…
  3. Oct 5, 2026#Собес #inheritance #composition #mixin 🤔 Какие есть способы переиспользования методов од…
  4. Oct 2, 2026#repository #собес 📚 Interactive Coding Challenges от Donne Martin Более 120 интерактивны…
  5. Oct 1, 2026#Собес #fork #git #repository 🤔 Что такое fork? 💬 Кратко: Fork — это копия чужого репози…
  6. Sep 30, 2026#Собес #python #versions #compatibility 🤔 Middle Python Backend разработчик в компанию Ba…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →