Привет. В этом видео мы с вами поговорим про итераторы. На самом деле, с итераторами вы уже работали раньше, когда, например, использовали функцию range и цикл for. Цикл for позволяет вам бежать по какому-то итератору и, например, выводить все числа, как в случае с функцией range. Также простейшим итератором является строка или коллекция. Итератор — это какой-то объект, по которому вы можете бежать, то есть итерироваться. Можно создать свой простейший итератор при помощи встроенной функции iter и, например, передать ей список. Внутри протокол итерации работает очень просто. У нас каждый раз, когда мы хотим получить следующий элемент, вызывается функция next, и она возвращает следующий элемент. В данном случае это 1, 2 и 3. Когда у нас элементы исчерпаны, то есть итератор закончился, у нас выбрасывается исключение StopIteration, которое говорит о том, что, например, нужно выйти из цикла for. В Python'е вы, конечно, можете реализовать свой собственный итератор, написав класс с соответствующими магическими методами. Эти магические методы — это методы _iter_ и _next_. Метод _iter_ должен возвращать итератор в себя, а метод _next_ определяет то, какие элементы возвращаются из итератора при, собственно, итерации. Давайте напишем свой класс SquareIterator, который будет каким-то аналогом функции range, только будет возвращать квадраты чисел. То есть SquareIterator принимает границы, внутри которых мы будем итерироваться, и возвращает квадраты чисел внутри этих лимитов. В функции _init_ мы сохраняем наши пределы, и в функции _next_ мы будем и в функции говорить о том, что происходит при вызове следующего элемента Если у нас элементы исчерпаны, то есть у нас current превысил end, мы выбрасываем исключение StopIteration, которое говорит протоколу итерации о том, что итерация должна закончиться. Ну а в любом другом случае мы просто возводим число в квадрат и инкрементируем счётчик. Таким образом мы можем использовать наш класс для того, чтобы итерироваться по нему и использовать знакомый вам цикл for и выводить числа, например, квадраты от 1 до 4, не включая 4. Python позволяет вам создавать собственные итераторы, и иногда это бывает полезно, когда вам нужно поддержать протокол итерации в каком-то своём классе. Что интересно, можно также определить свой собственный итератор, не определяя _iter_ и _next_. Это можно сделать, написав у класса метод _getitem_, который определяет работу класса при обращении к его объектам с помощью квадратных скобочек, то есть как к контейнеру. Мы можем создать свой собственный контейнер IndexIterable, который определит _getitem_, и вы уже в этом случае можете по нему итерироваться. Это делается довольно редко. Чаще всего для того чтобы определить свой итератор, используются именно методы _iter_ и _next_. На этом всё. Увидимся в следующем видео.