Итераторы

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

Вычислимые последовательности, например, 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. Прочитать
  2. EJudge: CommFunction 'Коммутативная функция'

    Написать функцию checkcomm(fun, *args), которой передаётся не менее одного параметра. Параметр fun — это некоторая n-местная функция, где n — это длина args. checkcomm() должна возвращать True, если функция fun() на заданных параметрах коммутативна, то есть в каком бы порядке они ей не передавались, результат одинаков, и False в противном случае. Гарантируется, что во всех случаях функция вычислима, а возвращаемые ею значения — сравнимы на "==".

    Input:

       1 print(checkcomm(max, 1, 9, 2, 7, 3, 6))
    
    Output:

    True
  3. EJudge: SeqJoin 'Слияние'

    Написать генератор-функцию joinseq(seq0, seq1, …), принимающую на вход произвольное количество (возможно, бесконечных) последовательностей. Порождаемый ею генератор должен всякий раз возвращать наименьший из начальных элементов этих последовательностей. Если таких несколько, используется самый первый. Если последовательность закончилась, она больше не учитывается. Итератор завершается, когда все последовательности иссякли.

    • Условие: использовать обработку исключений в этой задаче нельзя.

    Input:

       1 print("".join(joinseq("abs", "qr", "azt")))
    
    Output:

    aabqrszt
  4. EJudge: NonPrime 'непростые числа'

    Написать генетатор-функцию nonprime(n=0), которая будет выдавать последовательность непростых чисел (единица и составные числа), превосходящих целое положительное n (по умолчанию — 0).

    Input:

       1 print(*dict(zip(nonprime(16), range(20))))
    
    Output:

    18 20 21 22 24 25 26 27 28 30 32 33 34 35 36 38 39 40 42 44
  5. {1} TODO обязательная задача для магистров

LecturesCMC/PythonIntro2026/07_Iterators (последним исправлял пользователь FrBrGeorge 2026-11-02 14:56:12)