February 1, 2020

Реализуем Stack

Давайте сегодня разберемся, как можно строить итерируемые объекты. Задевали раньше тему Stack и очереди, попробуем сами сделать Stack. Будем использовать в качестве структуры данных обычный list, то есть список.

Поехали:

Теперь проверим наш stack:

Если вчитаться в комментарии, то станет понятно, что в итоге у нас произошло. А произошло то, что мы создали некий список из 3 чисел, вызвали pop, который вернулнам 3 и стер его из списка. Затем мы проверили, какое число у нас последнее с помощью peek, оказалось 2 - все верно. Дальше проверили, сколько в листе осталось объектов - тоже 2. Добавили в конец списка 4,5,6 и прошлись циклом по stack, который вывел нам все объекты начиная с конца. И именно с конца stack выводит объекты.

Вот простой пример, как можно реализовывать свои классы, по инстанциям которых внешнйи код может может идти в цикле. Для этого нужно реализовать два метода - __iter__ & __next__. Из __iter__ возвращаем self и в нем устанавливаем, как правило счетчик в нужную нам позицию, в нашем случае мы указываем на последний элемент. А в __next__ уже декрементеруем или инкрементируем счетчик, как нам надо, вбрасываем исключение, которое обрабатывается особым образом - оно просто останавливает итерацию, оно не убивает программу. А дальше один ща одним возвращаем элементы подправляя индекс как надо.