Кортежи и операции с ними

На этом занятии мы познакомимся с еще одной коллекцией данных в Python – кортежами. В отличие от списков

Кортеж – это упорядоченная неизменяемая коллекция произвольных данных.

Для задания кортежа достаточно перечислить значения через запятую:

a = 1,2

или же, это эквивалентно такой записи:

a=(1,2,3)

Чтобы присвоить только одно значение кортежу, используется такой синтаксис:

b = 1,     или    b = (1,)

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

Если записать переменные через запятую, то им можно присвоить значения из кортежа:

x,y = (1,2)

Но вот так:

x,y = (1,2,3)

уже возникнет ошибка, т.к. число значений в кортеже меньше числа переменных.

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

len(a)

Далее, доступ к элементам кортежа осуществляется также как и к элементам списков:

- по индексу:

a[0]
a[2]
a[-1]

- через срезы:

a[1:2]
a[0:-1]
a[:3]
a[1:]
a[:]

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

b = a[:]

не создает копию кортежа – это будут ссылки на один и тот же кортеж:

print(id(a), id(b))

увидим одно и то же значение id.

Если кортежи так похожи на списки, то в чем их преимущество перед ними? Другими словами: в каких случаях следует использовать кортеж вместо списка? Во-первых, кортеж – это неизменяемый тип, то есть, мы в отличие от списков, не можем выполнять такие операции:

a[1] = 100

это приведет к ошибке. Значит, кортеж можно использовать, когда необходимо «запретить» программисту менять значения элементов списка. Во-вторых, кортежи можно использовать в качестве ключей у словарей, например, так:

d = {}
d[a] = "кортеж"

В-третьих, кортеж занимает меньше памяти, чем такой же список, например:

lst=[1,2,3]
t = (1,2,3)
print(lst.__sizeof__())
print(t.__sizeof__())

Как видите, размер кортежа меньше, чем списка. Здесь использован метод __sizeof__, который возвращает размер данных в байтах.

И, наконец, в-четвертых, операции с кортежами выполняются быстрее, чем со списками, например, перебор элементов или доступ к отдельному элементу.

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

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

a = ()
b = tuple()
print(type(a), type(b))

Спрашивается: зачем создавать пустой кортеж, если он относится к неизменяемым типам. В действительности, мы лишь не можем менять уже существующие элементы в кортеже, но можем добавлять новые, используя оператор +:

a = ()
a = a +  (1,)

или для добавления в начало кортежа:

a = (2,3) + a

Также можно добавить вложенный кортеж:

a += (("a", "hello"),)

или делать дубли в кортеже:

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[1]

то сам по себе список – это изменяемый тип, следовательно, его значение даже в кортеже мы можем спокойно менять:

a[1].append("5")

То есть, неизменяемость кортежа относится к его структуре элементов и переменным

которые ссылаются на конкретные объекты. Но, если объекты могут изменяться, то это никто не запрещает делать.

Так как сам кортеж – неизменяемый объект, то удалить отдельные его элементы невозможно:

del a[1]

но можно удалить его целиком:

del a

после этого кортеж a перестанет существовать.

Методы кортежа

У кортежа имеется два таких метода:

a = ("abc", 2, [1,2], True, 2, 5)
a.count("abc")
a.count(2)

который возвращает число найденных элементов с указанным значением. Если элемент не найден:

a.count("a")

то возвращается число 0.

Следующий метод:

a.index(2)

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

a.index(2,3)

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

a.index(2, 3, 5)

определяет индекс, до которого идет поиск (не включая его). Если же записать вот так:

a.index(2, 3, 4)

то возникнет ошибка, т.к. в поиск будет включен только 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

Видео по теме