Итераторы

TODO Это копия прошлого года; возможно, её нужно редактировать

Итераторы вокруг нас

Вычислимые последовательности, например, range().

Протокол итерируемой последовательности:

Собственно итераторы:

Как сделать итератор:

  1. iter(итерируемый_объект): У объекта есть метод .__iter__()

  2. или iter(индексируемый_объект): У объекта есть метод .__getitem__(int) (индексация пойдёт с нуля)

    • Вместо StopIteration используется IndexError

  3. или iter(функция, стоп-значение) — возвращает результат функции, пока он не равен стоп-значению

       1 >>> import random
       2 >>> d = iter(lambda: random.randrange(10), 7)
       3 >>> list(d)
       4 [3, 1, 9, 6, 4, 5, 3, 9, 9, 2, 4, 2, 0, 0, 0, 3, 4, 1]
       5 
    

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

Генераторы

Как задать самому?

Генератор-функция

ИРЛ: итераторы — это вычислимые последовательности, в т. ч. бесконечные

Параметрические генераторы

В генератор можно затолкать значение на каждом обороте (оно прочтётся yield-ом).

   1 >>> def stopicot(base):
   2   2     what = yield base
   3   3     while what:
   4   4         what += yield base + what
   5 >>> sto = stopicot(100500)
   6 >>> next(sto) # или, что то же самое, sto.send(None)
   7 100500
   8 >>> sto.send(1)
   9 100501
  10 >>> sto.send(1)
  11 100502
  12 >>> sto.send(-1)
  13 100501
  14 >>> sto.send(-1)
  15 Traceback (most recent call last):
  16   File "<stdin>", line 1, in <module>
  17 StopIteration

Зачем это может быть нужно?

Itertools (сколько успеем)

Обработка вычислимых последовательностей и функциональное программирование

Обзор itertools:

Частичное вычисление (в т. ч. бесконечных последовательностей)

Д/З

  1. Прочитать

LecturesCMC/PythonIntro2026/07_Iterators (последним исправлял пользователь StephenMalchevskii 2026-10-31 23:48:23)