Параметрически генераторы и списки
Выражение-генератор — выражение в круглых скобках, которое создает на каждой итерации новый элемент по правилам.
Вместо имени – выражение-генератор.
Выражение-генератор помогает нам в случае, если мы не хотим испортить пространство имен непонятными именами.
После for можно поставить фильтр
i % 3 != 1
if – это цикл конструктора, а не условное выражение. Можно написать так…
Здесь наблюдаем операцию декартового произведения. Но можно использовать конструкцию проще.
Еще более сложная вещь – это параметр генератора. Когда пишем генератор-функцию , yield четко определено.
Перепишем это в таком виде.
Теперь будем передавать значения.
Второе значение передать можем, а первое нет.
Это похоже на каноническую схему цикла. (Подсказка для ДЗ)
Списки
Немного магии…
Это две одинаковые операции.
Создадим класс. В нем будет метод getitem.
Если написать c[100500]
Вылез сам объект "c" и 100500. Если написать так, то это будет вызов того же getitem, только передается slice object. Он просто содержит 3 числа.
Посмотрим на dir(s)
Если напишем
s = slice(2,4,100 500)
то 100 500 – это шаг. Списки в Python3 модифицируемые. Они же и являются массивами. В них содержится все, что угодно.
Список можно сгенерировать циклическим конструктором.
Превратим range(20,50,3) в список.
Можно вставлять экземпляр в последовательность. Посмотрим, как работают методы insert и del.
Метод index.
Стоит заметить, что это две эквивалентные записи поиска элемента последовательности.
l.index(41) 41 in l
Напомним, что список – это массив, так как операции линейные. Но есть 2 случая операции вставки и удаления, имеющих константную сложность. Это вставка и удаление в конец списка.
Модели append и pop напоминают стек.
Модуль collections
collections.deque - создаёт очередь из итерируемого объекта с максимальной длиной maxlen. Очереди очень похожи на списки, за исключением того, что добавлять и удалять элементы можно либо справа, либо слева.
Вернемся к свойствам.
Можем взять секцию…
Когда последовательность с шагом, то количество элементов нужно соблюдать. Иначе будет ошибка.
Напоминание: список – это модифицируемый объект. Когда мы что-то меняем (даже кардинально), то его идентификатор не меняется.
Метод copy возвращает точную копию объекта, но это 2 разных объекта.