На этом занятии
мы познакомимся с еще одной коллекцией данных в Python – кортежами. В
отличие от списков
Кортеж – это
упорядоченная неизменяемая коллекция произвольных данных.
Для задания
кортежа достаточно перечислить значения через запятую:
или же, это
эквивалентно такой записи:
Чтобы присвоить
только одно значение кортежу, используется такой синтаксис:
b = 1, или b = (1,)
то есть,
последняя запятая указывает, что 1 следует воспринимать как первый элемент
кортежа. Если записать просто 1, то оно будет восприниматься как обычное число.
Если записать
переменные через запятую, то им можно присвоить значения из кортежа:
Но вот так:
уже возникнет
ошибка, т.к. число значений в кортеже меньше числа переменных.
Для определения
длины кортежа (числа его элементов), используется уже знакомая вам функция
Далее, доступ к
элементам кортежа осуществляется также как и к элементам списков:
- по индексу:
- через срезы:
a[1:2]
a[0:-1]
a[:3]
a[1:]
a[:]
О срезах мы
подробно говорили, когда рассматривали списки, поэтому не вижу смысла
дублировать здесь эту информацию. Обратите лишь внимание на то, что вот такая
операция
не создает копию кортежа – это будут ссылки на один и тот же кортеж:
увидим одно и то
же значение id.
Если кортежи так
похожи на списки, то в чем их преимущество перед ними? Другими словами: в каких
случаях следует использовать кортеж вместо списка? Во-первых, кортеж – это
неизменяемый тип, то есть, мы в отличие от списков, не можем выполнять такие
операции:
это приведет к
ошибке. Значит, кортеж можно использовать, когда необходимо «запретить»
программисту менять значения элементов списка. Во-вторых, кортежи можно
использовать в качестве ключей у словарей, например, так:
В-третьих,
кортеж занимает меньше памяти, чем такой же список, например:
lst=[1,2,3]
t = (1,2,3)
print(lst.__sizeof__())
print(t.__sizeof__())
Как видите,
размер кортежа меньше, чем списка. Здесь использован метод __sizeof__, который
возвращает размер данных в байтах.
И, наконец,
в-четвертых, операции с кортежами выполняются быстрее, чем со списками,
например, перебор элементов или доступ к отдельному элементу.
Отсюда
получается такой один общий, глобальный вывод: если мы работаем с неизменяемым
упорядоченным списком, то предпочтительнее использовать кортеж.
Чтобы создать
пустой кортеж можно использовать такие конструкции:
a = ()
b = tuple()
print(type(a), type(b))
Спрашивается:
зачем создавать пустой кортеж, если он относится к неизменяемым типам. В
действительности, мы лишь не можем менять уже существующие элементы в кортеже,
но можем добавлять новые, используя оператор +:
или для
добавления в начало кортежа:
Также можно
добавить вложенный кортеж:
или делать дубли
в кортеже:
b = (0,)*10
b = ("hello", "world")*5
Все эти операции
вполне допустимы.
Далее, функция tuple позволяет
создавать кортежи на основе любых упорядоченных списков:
a = tuple([1,2,3])
a = tuple("Привет мир")
И обратно, из
кортежа можно сформировать список:
t = (1,2,3)
lst = list(t)
Также кортежи
могут хранить самые разные данные:
a = (True, [1,2,3], "hello", 5, {"house": "дом"})
Причем,
смотрите, если обратиться, например, к списку:
то сам по себе
список – это изменяемый тип, следовательно, его значение даже в кортеже мы
можем спокойно менять:
То есть,
неизменяемость кортежа относится к его структуре элементов и переменным
которые ссылаются
на конкретные объекты. Но, если объекты могут изменяться, то это никто не
запрещает делать.
Так как сам
кортеж – неизменяемый объект, то удалить отдельные его элементы невозможно:
но можно удалить
его целиком:
после этого
кортеж a перестанет
существовать.
Методы кортежа
У кортежа
имеется два таких метода:
a = ("abc", 2, [1,2], True, 2, 5)
a.count("abc")
a.count(2)
который
возвращает число найденных элементов с указанным значением. Если элемент не
найден:
то возвращается
число 0.
Следующий метод:
возвращает
индекс первого найденного элемента с указанным значением. Второй необязательный
параметр
позволяет
задавать индекс начала поиска элемента. В данном случае поиск будет начинаться
с третьего индекса. А последний третий аргумент:
определяет
индекс, до которого идет поиск (не включая его). Если же записать вот так:
то возникнет
ошибка, т.к. в поиск будет включен только 3-й индекс и там нет значения 2.
Задания для самопроверки
1. Дан кортеж:
p =
("+792345678", "+792345478", "+792355678",
"+592345678", "+392345678", "+7923456558")
Нужно вывести
все номера, начинающиеся с «+7».
2. Имеется набор
оценок в виде строки:
"Оценки: 5,
4, 3, 4, 2, 4, 5, 4"
Необходимо
создать кортеж, в котором находились бы только оценки в виде целых чисел:
(5, 4, 3, 4, 2,
4, 5, 4)
3. Вывести
значения кортежа:
((1,2,3),(3,4,5),(6,7,8))
в виде таблицы:
1 – 2 – 3
4 – 5 – 6
7 – 8 – 9