pyth_04_list_ops
Заметка 4. Методы списка
курса Математический практикум по Питону.
Шокуров Антон В.
shokurov.anton.v@yandex.ru
http://машинноезрение.рф
Версия 0.22

Аннотация

Показано как добавлять/удалять элементы из списка, рассмотрены арифметические операции над списком, и упорядочивание/сортировка. Вводятся генераторы, range, фильтры и итераторы (iter, next). Объяснено что такое адрес объекта (id) и в чем разница между равенством и идентичностью объектов (is). Показано как копировать списки.

Ключевые слова: append, pop, extend, insert, del, id, copy, deepcopy, reverse и sort.

Это предварительная версия! Любые замечания приветствуются.

Список -- основной объект питона!

Список не только хранить данные, но и подддерживает добавление новых элементов (в его конец), а также извлечение и удаление подсписков. по мимо этого упорядочивать элементы.

Редактирование списка

Добавление и извлечение элементов

Список на то и списк, что к нему можно добавить элемент (в его конец).

Взять элемент с конца списка. Полезно при однократной обработки элементов (обработал и забыл).

После взятия элемента список уменьшился.

Цикл обхода

Можно написать цикл обхода по всем элементам. Элементы обходятся в обратном порядке.

После такого цикла, т.е. после извлечения всех элементов он очевидно будет пустым.

Восстановим его.

Расширение списка

К списку был добавлен элемент [5,3].

Вставить элементы

Вставляет элемент на заданное место и сдвигает другие (далее следующие) дальше. Фактически раздвигает элементы и освобождает себе место. Потом его занимает.

Вставить

пример

Упр. Есть упорядоченный список, например = [1,3,5,7,9,11] Нужно запросить у пользователя число и вставить его в нужное место данного списка., т.е. фактически сначала найти место/индекс, фактически реализовать вручную метод insert

Удаление элементов

Элемент должен быть в списке.

Чистка

Можно все радикально очистить.

Упр. В чем разница между присвоением пустого списка с методом clear? Возможно лучше сначала весь ноутбук прочесть.

Действия над объектом-список

Арифметические операции над списком

Списки нужны для хранения данных. Если мы захотим все числа умножить на два, то возможно мы бы написали:

И увидели бы результат, который скоре всего не соответсвует нашим ожиданиям. Дело в том, что список является объектом сам по себе. Поэтому он имеет свои смысловые нагрузки на операции. Например, + объединяет списки (конкатенация), точнее она ставит один список (второй) в конец другому (первому).

По факту произошло дублирование списка.

Но сам список остался неизменным.

Конкатенация, один список добавили в конец к другому.

Операция выполнена, но не сохранена.

Операции умножение соответствует многократной конкатенации (т.е. повтору) самого себя:

Упр. Как циклически сдвинуть элементы списка? Последнее подразумевает, что все элементы сдвинутся на один вперед, а первый попадет в конец.

Бывает важным скопировать объект. Рассмотрим на примере списка какие с этим связаны нюансы.

Реорганизация

Упорядочивание

Возьмем, например, список имен.

Раз есть операция сравнения на строками, то объекты списка можно упорядочить (отсортировать).

Отсортировать объекты без определенной над объектами операции сравнения нельзя.

Простая копия списка делается с помощью метода copy.

Упорядочиваем (сортируем) сам список.

Список e остался неизменным.

Порядок

Можно и так, но будет создан новый список.

Списки q и e имеют одинаковые значения

Но это разные объекты. Для такой проверки есть специальный оператор питона.

Первоначальный же список остался вообще без изменений.

Статистика

Подсчет

Метод count возвращает количество раз объект встречается.

Копирование списка

Ссылка на объект

На примере списка покажем, что в питоне в переменных хранятся не сами значения, а ссылки на объекты. Соответственно при копировании копируются именно ссылки на один и тот же объект, а не сам объект.

Изменение значение элемента списка

Опустошение списка

Список d остался неизменным.

Попробуем теперь иначе.

Оба стали пустыми.

Исправление проблемы

В питоне на самом деле в переменных хранятся не значения, а ссылки на объекты. Поэтому при копировании переменной копируется ссылка. Для правильного копирования необходимо сам объект скопировать.

Адрес объекта

Про оператор id

Вернемся к нашим спискам

Double trick

Упр. Объясни почему у списка q изменение произошло в двух местах.

Вложенное копирование

Но, не все так просто

Упр. Почему copy не спасает?

А равны ли?

Знак == позволяет проверить равенство объектов по сути, т.е. по смысловому значению. А не исходя из внутреннего представления объекта.

Равенство, в частности, списков проверяется по содержимому.

Даже если числа имеют разный тип. Всегда можно тип привести.

Если объекты разные по сути, то и такой ответ.

В строковых выражениях тоже будет работать.

Для проверки ссылаются ли переменные на один объект используется оператор is.

Оператор is очень важен для Питона!

Строчки

что же там со строчками...

При разных строчках будут различаться.

Касательно равенства

В питоне, в согласии с традиционными языками программирования, строки константны, но хранятся они в разных местах.

У чисел тоже есть id. т.е. можно считать что они тоже где-то хранятся. Но в фиксированном месте.

Идентификаторы совпадают из разных ячеек.

Фактически у каждого числа свой идентификатор. Может там что и закодировано.

Утрируя, в этом смысле отдельные цифры являются константными объектами.

По аналогии с разными строчками идентификаторы совпадают.

Если скопировать в отдельные переменные, то не будут.

Упр. Почему у предыдущих один и тот же id?

Сравнение нужно делать аккуратно.

Сравним id списока со строкой и самой строки.

Генераторы

Встроенные

Интервал индексов

От 0 до некого числа не включительно.

Можно либо сразу по нему выполнить проход циклом:

либо явно так:

А можно превратить в список:

Можно указать и начальное значение.

В расширенном варианте указывается от, до и шаг.

В качестве аргументов использует только целые числа

Потребление памяти

При создании списка потребуется память для хранения всех этих сгенерированных значений.

В объеме:

Удалим такую переменную.

Итого, смысл генераторов в том, что их элементы обрабатываются по очереди, но не через явный список. Но конечно есть исключения.

Из генератора

Если у нас уже есть генератор, то мы можем построить наш на его основе.

Чтобы увидеть значения превратим с список.

Можно сразу

Так можно получить равномерно расположенные точки на интервале от -1 до 1.

А так интервал [50 51]

В range нельзя использовать дробные числа. Можно как раз создать собственный генератор, который их и сделает.

Упр. Как получить список равномерно заполняющих точек n на привольном интервал (a,b).

Выполнить операции по раздельному.

Можно и в одну строку. Но все равно будет потребляться такой же объем памяти.

Без преобразования в список промежуточных этапов будет так

Необходимый объем памяти не зависит от размера данных.

Так вывести не получится:

А так можно

Циклом вывести можно так:

Фильтр

Сформировать список четных чисел:

Поиск корня

Найдем корень методом линейного перебора с неким шагом.

Есть встроенная функция sum, которая считает сумму элементов массива.

Со строчками не работает

Интератор

Генераторы и списки можно обходить посредством готовой конструкции цикл, но вообще говоря можно и вручную. Механизм обхода следующий.

Обход генератора

Обход списка