Как устроены итераторы в Python?
ฝัง
- เผยแพร่เมื่อ 29 ก.ย. 2024
- В питоне большое количество самых разных и непохожих друг на друга объектов позволяют в цикле перебирать свои элементы. Возможно вы встречали термины iterator, iterable и iterator protocol. Что это и как устроено? Давайте разбираться!
Я в Telegram - t.me/tricky_py...
Канал создан при поддержке сообщества Moscow Python.
Наш TH-cam-канал - / @moscowdjangoru
Курсы Learn Python - learn.python.ru/
Насколько я понял, паттерн проектирования Итератор пришёл из суровых мест типа языка С, где из коробки нет простых способов итерирования по коллекциям. А итерирование по массиву с указанием его индекса весьма муторная вещь. Поэтому и был придумал итератор, обёртка, позволяющая пробежаться по некоторой коллекции определённым образом. Стоит обратить внимание, что итератор просто обеспечивает доступ к содержимому коллекции и не более того. И по нему в принципе можно ходить множество раз, хотя это зависит от реализации. В питоне же итераторы очень тесно сплетены с генераторами. А генераторы это про ленивые вычисления и одноразовые сущности. И между ними постоянно возникает путаница.
Спасибо, большое!
Только фраза "Dunder метод" берёт своё название не от "Dunder UNDERscore", а от "Double UNDERscore".
Да, конечно - я вероятно оговорился
я понял, зачем нужен __next__, но не понял, зачем нужен __iter__. Цикл for нужен для того, чтобы перебрать значения объекта, и метод __next__ отлично с этим справляется, а зачем нужен итератор? зачем __iter__ возвращает итератор?
Смотри, есть список [1,2,3] применим к нему функцию iter(lst) теперь это List_iterator. Теперь нам доступна функция next()
Привет, спасибо за видео. Ещё было бы круто увидеть упрощенный пример использования итераторов из кода какого-нибудь приложения, например.
Привет, будет еще несколько видео про генераторы/итераторы и в том числе пример использования
Спасибо за видео!
Бывает такое, что в некотором итераторе нет метода len. Есть ли хитрый метод проверить длину итератора?
Можно сделать что-то вроде sum(1 for item in my_iterator) - но в случае бесконечного генератора это подвесит программу
@@Хитрыйпитон А в случае небесконечного - уничтожит его :)
Планируется про декораторы видео? 👍🏻
Да, есть в планах
раскажите пожалуйста как устроен sort (key=) . Он в начале создеёт новый список?
нифига не понятно
Классное видео! очень понятное
Интересно, просто и понятно. Спасибо!
а чем self перед прохождением через _iter_ отличается от self который возвращает _iter_? (кроме того что он теперь называется итератор)
Получается что iter показывает для next что это обьект можно перебирать (Эй, этот обьект я вернул, с ним можно работать) ставя на нем значек итерабельный обьект?
Если больше нигде не используется результаты функции iter кроме функции next, то почему бы не сделать эту проверку в функции next. Зачем такая сложность в питоне?
Спасибо за самый толковый мануал по итераторам-генераторам!