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

แชร์
ฝัง
  • เผยแพร่เมื่อ 29 ก.ย. 2024
  • В питоне большое количество самых разных и непохожих друг на друга объектов позволяют в цикле перебирать свои элементы. Возможно вы встречали термины iterator, iterable и iterator protocol. Что это и как устроено? Давайте разбираться!
    Я в Telegram - t.me/tricky_py...
    Канал создан при поддержке сообщества Moscow Python.
    Наш TH-cam-канал - / @moscowdjangoru
    Курсы Learn Python - learn.python.ru/

ความคิดเห็น • 18

  • @Игорь-ч6ф3и
    @Игорь-ч6ф3и 3 ปีที่แล้ว +7

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

  • @markgold1600
    @markgold1600 3 ปีที่แล้ว +7

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

    • @Хитрыйпитон
      @Хитрыйпитон  3 ปีที่แล้ว +1

      Да, конечно - я вероятно оговорился

  • @БекзодОлимов-я4ц
    @БекзодОлимов-я4ц 3 ปีที่แล้ว +2

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

    • @PythonDevelopment
      @PythonDevelopment 2 ปีที่แล้ว

      Смотри, есть список [1,2,3] применим к нему функцию iter(lst) теперь это List_iterator. Теперь нам доступна функция next()

  • @knst4444
    @knst4444 3 ปีที่แล้ว +3

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

    • @Хитрыйпитон
      @Хитрыйпитон  3 ปีที่แล้ว +3

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

  • @antonnekrasov4639
    @antonnekrasov4639 3 ปีที่แล้ว +2

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

    • @Хитрыйпитон
      @Хитрыйпитон  3 ปีที่แล้ว

      Можно сделать что-то вроде sum(1 for item in my_iterator) - но в случае бесконечного генератора это подвесит программу

    • @Игорь-ч6ф3и
      @Игорь-ч6ф3и 3 ปีที่แล้ว +1

      @@Хитрыйпитон А в случае небесконечного - уничтожит его :)

  • @antonnekrasov4639
    @antonnekrasov4639 3 ปีที่แล้ว +3

    Планируется про декораторы видео? 👍🏻

  • @nordmilk
    @nordmilk ปีที่แล้ว

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

  • @денисосокин-г2о
    @денисосокин-г2о ปีที่แล้ว

    нифига не понятно

  • @kohakovich
    @kohakovich ปีที่แล้ว

    Классное видео! очень понятное

  • @DmitrijLytkin
    @DmitrijLytkin 3 ปีที่แล้ว +1

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

  • @romanp1521
    @romanp1521 2 ปีที่แล้ว

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

  • @MariaShakuro
    @MariaShakuro 2 ปีที่แล้ว

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