На этом шаге мы определимся с дальнейшим изложением.
Синтаксис Python отличается своей красотой и ясностью от других языков программирования. Например, давайте возьмем скромный цикл for ... in. Красота Python говорит сама за себя - вы можете прочитать приведенный ниже питоновский цикл, как если бы это было английское предложение:
numbers = [1, 2, 3] for n in numbers: print(n)
Но как элегантные циклические конструкции Python работают за кадром? Каким образом этот цикл достает отдельные элементы из объекта, итерации по которому он выполняет? И как можно поддерживать одинаковый стиль программирования в собственных объектах Python?
Ответы на эти вопросы можно найти в протоколе итератора Python: объекты, которые поддерживают дандер-методы __iter__ и __next__, автоматически работают с циклами for ... in.
Однако вникнем во все шаг за шагом. Точно так же, как и декораторы, итераторы и связанные с ними методы на первый взгляд могут показаться довольно загадочными и сложными. Поэтому мы будем входить в курс дела постепенно.
Начиная с этого шага вы увидите, как написать несколько классов Python, которые поддерживают протокол итератора. Они послужат в качестве "немагических" примеров и тестовых реализаций, на основе которых можно укрепить и углубить свое понимание.
Прежде всего мы сосредоточимся на ключевых механизмах итераторов в Python 3 и опустим любые ненужные сложности, чтобы вы четко увидели поведение итераторов на фундаментальном уровне.
Мы свяжем все примеры с вопросом о цикле for ... in, с которого мы начали это изложение. И в его конце мы пробежимся по некоторым различиям, существующим между Python 2 и Python 3 относительно итераторов.
Готовы? Тогда, поехали!
На следующем шаге мы рассмотрим бесконечное повторение.