Как устроены итераторы в Python?

preview_player
Показать описание
В питоне большое количество самых разных и непохожих друг на друга объектов позволяют в цикле перебирать свои элементы. Возможно вы встречали термины iterator, iterable и iterator protocol. Что это и как устроено? Давайте разбираться!

Канал создан при поддержке сообщества Moscow Python.
Рекомендации по теме
Комментарии
Автор

Насколько я понял, паттерн проектирования Итератор пришёл из суровых мест типа языка С, где из коробки нет простых способов итерирования по коллекциям. А итерирование по массиву с указанием его индекса весьма муторная вещь. Поэтому и был придумал итератор, обёртка, позволяющая пробежаться по некоторой коллекции определённым образом. Стоит обратить внимание, что итератор просто обеспечивает доступ к содержимому коллекции и не более того. И по нему в принципе можно ходить множество раз, хотя это зависит от реализации. В питоне же итераторы очень тесно сплетены с генераторами. А генераторы это про ленивые вычисления и одноразовые сущности. И между ними постоянно возникает путаница.

dynjcdd
Автор

Спасибо, большое!

Только фраза "Dunder метод" берёт своё название не от "Dunder UNDERscore", а от "Double UNDERscore".

markgold
Автор

Привет, спасибо за видео. Ещё было бы круто увидеть упрощенный пример использования итераторов из кода какого-нибудь приложения, например.

knst
Автор

Интересно, просто и понятно. Спасибо!

DmitrijLytkin
Автор

раскажите пожалуйста как устроен sort (key=) . Он в начале создеёт новый список?

nordmilk
Автор

Спасибо за видео!
Бывает такое, что в некотором итераторе нет метода len. Есть ли хитрый метод проверить длину итератора?

antonnekrasov
Автор

Спасибо за самый толковый мануал по итераторам-генераторам!

MariaShakuro
Автор

я понял, зачем нужен __next__, но не понял, зачем нужен __iter__. Цикл for нужен для того, чтобы перебрать значения объекта, и метод __next__ отлично с этим справляется, а зачем нужен итератор? зачем __iter__ возвращает итератор?

lquoepq
Автор

а чем self перед прохождением через _iter_ отличается от self который возвращает _iter_? (кроме того что он теперь называется итератор)
Получается что iter показывает для next что это обьект можно перебирать (Эй, этот обьект я вернул, с ним можно работать) ставя на нем значек итерабельный обьект?
Если больше нигде не используется результаты функции iter кроме функции next, то почему бы не сделать эту проверку в функции next. Зачем такая сложность в питоне?

romanp