Математический практикум по Питону.
Вводится базовый объект Питона (Python) список (list). Показано как его создавать, проверять принадлежность элемента, обращаться к одельным элементам (сложные индексы), и искать индекс элементов.
Ключевые слова: list, in, len, type и index.
Это предварительная версия! Любые замечания приветствуются.
Вычисления над отдельными числами это хорошо, но нам понадобиться список, например, чисел. Списки нужны хотябы для того, чтобы хранить наши данные (котировки акций, список товаров и тому подобное). Список позволяет хранить несколько значений, в общем случае, разных типов как если бы они были разными перемеными. Главное, что список подддерживает добавление новых элементов (в его конец), а также извлечение и удаление подсписков.
[4, 8, 15, 16, 23, 42] # Создаем список из 4 элементов.
# В момент создания список можно проинициализровать выражениями.
[ 2 + 5, 7 - 9] # Инициализировать, т.е. задать.
# Через явное преобразование. По аналогии с int, float, ...
list([11, 55, 10 - 13, -7, 8]) # list это объект.
Чтобы были понятны принципы работы с ним, нужно его все-ткаи присвоить переменной.
# Присвоили переменной l список чисел.
l = [4, 8., 15, 16, 23, 42] # Внимание на второе число!
# Выведем его тип.
type( l ) # Видно, что он отличается от ранее используемых числовых типов.
l # Выведем элементы списка.
# Оператор len позволяет узнать длину списка, т.е. количество элементов в нем.
len( l ) # Ранее встречался с str, строчкой.
Очевидно, важно иметь возможность проверки принадлежности элемента списку. Делается это так.
4 in l # Проверяем 4 принадлежит списку l.
type( 4 in l ) # Возращается нам знакомый тип bool.
# Выполняются нужные преобразования типа.
4.0 in l, 8 in l, 8.0 in l # Речь о том, что в списк 8., т.е. float.
# А здесь 8, т.е. тип int.
9 in l # Как легко видеть 9 не принадлежит списку.
9 not in l # Можно проверить и отрицание.
not 9 in l # Можно и так. Но правильнее not in.
not 4 in l # для полноты картины.
К списку можно относится как проиндексированныйм (пронумерованным) переменным.
l # Напомним содержимое списка.
# Число в квадратных скобках указывает на индекс в списке.
l[3] # Внимание, элементы списка нумеруются с 0.
# Индекс должен соответствовать существующему элементу списка.
l[7] = 2 # Иначе будет ошибка. В списке нет такого индекса.
Раз нумерация индекса начинается с нуля, а количество элементов 6, то последний валидный индекс равен 5.
l[6] # Это граничный элемент.
l[5] # Этот индекс уже валидный.
Тип элементов списка
type( l[3] ) # Но, тип самого элемента списка ествественно свой, числовой.
# Можно присловить другое значение элементу списка.
l[2] = 1 # Отсылка к прониндексированым переменным.
l # Выводим значение переменной l, т.е. списк чисел
# Тип у разных элементов списка может быть разным.
type( l[1] ), l[1] # float
type( l[3] ), l[3] # int
# Можно указывать диапазон индексов: от и до.
l[3:5] # Причем, "до" невключительно, т.е. в данном случае индексы: 3 и 4.
# При задании интервала индесов диапазон может выходить за пределы списка.
l[3:100] # В таком случае диапазон будет укорочен.
# Ошибкой это считаться не будет.
l[2:] # Если после двоеточия числа нет, то значит нужно идти до конца списка.
# Если числа нет до двоеточия,
l[:4] # то значит новый список начинется с начала данного.
# Явный вид указания последнего индекса,
l[2:len(l)] # который невключительный.
# Если чуть меньше,
l[2:len(l) - 1] # то не все элементы (промущен последний).
# Если начало начинается после конца,
l[5:1] # то конечно получим "пустое множество", т.е. список.
# Даже если границы совпадают,
l[4:4] # всеравно пусто.
# Итого, если не указывать явно одну из границ диапазона индексов, то индексы беруться по масимому.
l[:5], l[3:] # в даном случае, соответственно, с начала и до конца.
Шаг индекса
# В расширенном варианте можно указать шаг увеличения индекса.
l[1:100:2] # Шаг указывается после второго двоеточия.
# В данном случае он равен 2, т.е. каждый второй.
# Ествественно в расширенном варинте тоже можно опускать числа.
l[1::2] # Смысл будет прежним.
# По умолчанию шаг равен 1,
l[3::1] # но можно явно это указать.
l[3::]
Упр. Как из списка извлечть два подсписка элементы которых поочередно содержать элементы из первоначального списка?
Отрицательные параметры индекса
Казалось бы что будет если взять отрицательный индекс? Мы же выйдем за границу...
# Отмечу, что элементы списка можно нумировать и с конца.
l[-1] # Для этого используются отрицательные индексы.
# -1 соответствует первому элементу с конца, т.е. последнему.
l[-2] # Предпоследний элемент или иначе второй элемент с конца.
# Но всетаки всему есть предел...
l[-7] # и отрицательным индексам тоже.
# Такие элементы также можно использовать при задании диапазона индексов.
l[:-2] # В данном случае, извлекутся все элементу кроме двух посдних.
Отрицательный шаг
# Шаг тоже может быть отрицательный.
l[::-1] # В даном случае получится список в обратном порядке.
# Аналог начало идет после конца.
l[-1:2] # Поэтому пустой список.
# Но можно же шаг взять отрицательным.
l[-1:2:-1] # Тогда список будет обойден в обратную сторону: -1(5), -2(4), -3(3), -4 (2). В скобках реальный индекс.
l[-1:-4:-1] # Но так будет понятнее.
l[-2:3:-1] # Очередной пример для закрепления материала.
Упр. Как переставить в обратном порядке элементы списка с четным индексом?
Присвоение сразу нескольким элементам списка
l[1:3] # Смотрим какие значения были до.
# Присвоить можно и диапазону значений сразу:
l[1:3] = 23, 7 # Список чисел должен соответствовать количеству (слева).
l
l[2:4] = [4, -7] # А можно и так.
l
# В заключении обсуждения списков отмечу, что их элементы не обязаны иметь один и тот же тип
ll = [2, "строка текста", 6]
ll
# Элемент с индексом 0 и 2 содержит
ll[0], ll[2]
type(ll[0]), type(ll[2]) # В тоже время.
ll[1], type( ll[1] ) # А элемент с индексом 1 являтся строчкой.
Последнее показывает, что списки могут соедржать совершенно разнородные объекты. В этом смысле они полноценные.
# Поэтому, естественно, что списки могут содержать списки.
a = [ 2, 3, [4, 5], 8] # Список из трех элементов.
a
# Нулевой, первый и третьий содержат числа:
a[0], a[1], a[3]
# А вот второй элемент сам является списком:
a[2], type(a[2])
a[2][1] # Обращаемся ко второму элементу вложенного списка.
a[2][0] = -5 # Можно и что-то присвоить.
a
[4, 5] in a # Можно конечно проверить принадлежность списку более сложных объектов.
a[2]
Рекурсия из списков
ll=[1,2,3] # Создаем список.
ll
ll[1] = ll # Присваиваем его второму элементу.
# С интересом выводим.
ll # Ну хорошо, что система не повисла.
ll[1] = "kkk" # От таких фокусов подальше присваиваем строчку.
ll
l # Напомним элементы списока.
l.index(23) # Ищет индекс первого вхождения числа 23.
l[1] # Проверим.
l.index(23, 2) # Ищет первое вхождение числа 23 начиная со второго индекса.
l[4] # Еще раз проверим.
l.index(23, 2, 4) # Ищет первое вхождение начиная со второго индекса по пятый невключительно. Ошибка!