НОЧУ ДПО "Национальный открытый университет "ИНТУИТ"
Опубликован: 24.01.2021 | Доступ: свободный | Студентов: 2489 / 106 | Длительность: 03:57:00
Лекция 29:

Итераторы

< Лекция 1 || Лекция 29: 1234

Смотреть на youtube

Проект для лекции Lecture10.rar.

Мы рассмотрели базисные элементы, составляющие основу программирования на языке Python. Мы понимаем как устроены типы данных языка, какие типы данных являются встроенными. Знаем синтаксис и семантику операторов языка, позволяющих написать программный код. Умеем, надеюсь, программировать в процедурах и функциях. Умеем использовать при построении программного проекта различные стили программирования, включая модульное и объектно-ориентированное программирование в классах и объектах. Понимаем, что при построении программного проекта необходимо обеспечить его корректность и устойчивость. Так что освоение курса "Основы программирования на языке Python" почти завершено.

Понимание основ требует рассмотрения деталей таких полезных и часто используемых инструментов, встроенных в язык, как итераторы, генераторы и декораторы.

Прежде чем попытаться понять, что такое итератор, давайте начнем с более простого понятия - итерация. В переводе с английского итерация - это повторение. Для программиста итерация связана с циклом. Каждый оператор цикла имеет заголовок и тело. Однократное выполнение тела цикла называется итерацией, а процесс выполнения цикла - итерированием. Как правило, в языках программирования встречается три типа цикла:

  • Классический цикл for, когда число итераций указано в заголовке и задан целочисленный параметр цикла (индекс), получающий на каждой итерации новое значение. Вот пример типичного заголовка цикла for в языках С++, C# - for(int I = 0; I < N; I++). У такого цикла N итераций и параметр I пробегает все значения от 0 до N - 1.
  • Цикл While - создается тогда, когда число итераций не известно в начальной точке запуска цикла и не может быть задано в заголовке. Конечно, когда программист пишет цикл While, он предполагает (уверен), что цикл обязательно завершит свою работу.
  • Цикл for each - цикл, обрабатывающий некоторую конечную структуру данных (контейнер данных). Число итераций определяется размером контейнера. На каждой итерации обрабатывается очередной элемент данных контейнера. Понятно, что данные контейнера должны быть перечислимы, то есть на данных задан некий порядок, известен начальный элемент и определена функция next (следующий), которая при первом обращении выдает первый по порядку элемент, а затем при каждом обращении выдает следующий элемент в заданном порядке. Предусмотрен также способ уведомления об исчерпании элементов контейнера. Структура данных, обладающая такими свойствами, называется итерируемой структурой данных.

Понятие итерированной структуры данных можно обобщить на понятие итерируемого объекта произвольного класса. Так появляется понятие итератора. В Википедии дается следующее определение итератора:

Итератор (от англ. iterator ? перечислитель) - интерфейс, предоставляющий доступ к элементам коллекции (массива или контейнера) и навигацию по ним.

Не самое лучшее определение. Во-первых, в переводе итератор - это повторитель, (перечислитель в английском - это enumerator). Во-вторых, назвать итератор интерфейсом мало что проясняет, поскольку понятие интерфейс в данном контексте не определено. Итератор - это механизм, предоставляющий доступ к элементам коллекции. В разных языках этот механизм может быть различным и зависеть от типа коллекции. В языке Python итератор - это объект класса, обладающего соответствующим интерфейсом. В этой лекции мы подробно поговорим о том, каким именно интерфейсом должен обладать итерируемый класс, у которого существует объект итератор.

В языке Python есть два вида циклов - while и for - in. Цикл while соответствует общепринятому циклу этого вида. Цикл for - in является обобщенным вариантом цикла for - each и позволяет работать с любыми итерируемыми объектами, которые в Python используются гораздо чаще чем в других языках программирования.

Все структуры данных, наследуемые от последовательности, следовательно, перечислимые, имеющие доступ к элементам по индексу, являются итерируемыми по определению. Напомню, что к таким структурам относятся строки, списки, кортежи. Но ни файлы, ни множества, ни словари к таким структурам не относятся. Тем не менее, все перечисленные структуры являются итерируемыми структурами данных, обладают соответствующим интерфейсом, обладают итераторами и могут быть обработаны циклом for - in. Метод iter, примененный к этим объектам, позволяет явно получить объект итератор, для которого доступны методы соответствующего интерфейса. Цикл for - in неявно создает итератор соответствующей структуры в процессе своей работы.

Приведу пример итерирования всех перечисленных структур данных:

#тесты с итерируемыми объектами, итераторами
L = ['L1', 'L2', 'L3']
T = ('T1', 'T2', 'T3')
D = {'k1' : 'd1', 'k2' : 'd2', 'k3' : 'd3'}
S = {'set1', 'set2', 'set3'}
Str = 'abcde'

def test1():
    for item in L:
        print(item, end = ', ')
    print()
    for item in T:
        print(item, end = ', ')
    print()
    for item in D:
        print(item, ': ', D[item], end = ', ')
    print() 
    for item in S:
        print(item, end = ', ')
    print()
    for item in Str:
        print(item, end = ', ')
    print()

    F = open("Recs.txt")
    for item in F:
        print(item, end = '')
    print()
    F.close()
    #Доступ по индексу
    print(L[1]); print(T[1]); print(Str[1]);
    #print(S[1]); print(D[1])
    #Получение итератора встроенных структур
    iter1 = iter(L); iter2 = iter(T); iter3 = iter(D);
    iter4 = iter(S); iter5 = iter(Str); 
    F = open("Recs.txt")
    iter6 = iter(F)
    F.close()
    print(iter1); print(iter2); print(iter3)
    print(iter4); print(iter5); print(iter6)

Приведу результаты работы этого теста:


Как видите, цикл for item in X обрабатывает любую из рассмотренных структур данных. Для словарей итерирование идет по ключам словаря, для текстовых файлов итерирование выполняется по записям файла, выполняя по сути метод чтения записей readline.

Прежде чем дать определение итератора в языке Python , рассмотрим ряд функций, создающих итераторы и, следовательно, позволяющих обрабатывать данные в цикле for.

< Лекция 1 || Лекция 29: 1234
Алексей Авилов
Алексей Авилов

Неужели не нашлось русских специалистов, чтобы записать курс по пайтону ? Да, можно включить переводчик и слушать с переводом, но это что? Это кто-то считает хорошим и понятным курсом для начинающих? 

Елена Лаптева
Елена Лаптева

Думаю. что не смогу его закончить. Хотелось предупредить других - не тратьте зря время, ищите другой курс.