Кортеж: неизменяемый список
Кортеж (tuple) — ещё один тип последовательностей в Python. Кортеж очень похож на список, но, в отличие от списка, кортеж — это неизменяемая последовательность.
При литеральном объявлении кортежа его элементы записываются в круглых скобках.
Скопировать кодPYTHONtpl = (1, 3, 2)
# Попытка изменить значение элемента с индексом 0 в кортеже
tpl[0] = 500
# Интерпретатор завершит выполнение программы с ошибкой:
# измениять элементы объекта типа tuple нельзя
...
tpl[0] = 500
TypeError: 'tuple' object does not support item assignment
Создание кортежей
Как и списки, кортежи можно создать несколькими способами: литерально или через функцию
tuple()
.Применим кортеж на практике.
Датчики
фитнес-трекера передают в программный модуль пакеты, содержащие два
значения: время запроса и количество шагов, пройденных пользователем к
этому времени.
Чтобы данные были неизменны в ходе выполнения программы — их лучше передавать в кортеже:
Скопировать кодPYTHONpackage = ('2:00:01', 15000)
print(package)
# Вывод в терминал: ('2:00:01', 15000)
print(type(package))
# Вывод в терминал: <class 'tuple'>
В кортежи и в списки можно преобразовать толькоитерируемые
объекты.
Скопировать кодPYTHON# Функция tuple() преобразует строку с текстом о достижении в кортеж
achievement = 'Отлично!'
tpl_achiv = tuple(achievement)
print(tpl_achiv)
#Вывод в терминал: ('О', 'т', 'л', 'и', 'ч', 'н', 'о', '!')
# Если передать в функцию неитерируемый объект (например, число),
# Python сообщит, что не может выполнить такое преобразование.
steps = 15000
tpl_steps = tuple(15000)
#Вывод в терминал: TypeError: 'int' object is not iterable
Преимущества кортежей
- Неизменяемость. Это основное отличие кортежей от списков; именно из этого свойства следуют другие преимущества.
- Меньший объём в памяти: при прочих равных кортежи занимают меньший объём в памяти, чем списки.
- Скорость: кортежи хешируются и хранятся в памяти иначе, чем списки, поэтому создание и повторное использование кортежей выполняется почти в три раза быстрее, чем при работе со списками.
- Безопасность: кортеж защищён от изменений. Это даёт преимущество в тех случаях, когда исходная коллекция элементов не должна измениться в ходе выполнения программы.
- Использование в других структурах данных: кортежи можно применять в структурах данных, от которых Python требует неизменяемых значений, например кортеж можно использовать в качестве ключа словаря.
Встроенные функции
Упаковка
Упаковкой называют специальный синтаксис для объявления кортежа.
Скопировать кодPYTHON# Литеральное объявление кортежа
package_1 = ('2:00:01', 15000)
# Значения, перечисленные через запятую и присвоеные одной переменной,
# будут упакованы в кортеж
package_2 = '2:00:01', 15000
print(package_1)
# Вывод в терминал: ('2:00:01', 15000)
print(type(package_1))
# Вывод в терминал: <class 'tuple'>
print(package_2)
# Вывод в терминал: ('2:00:01', 15000)
print(type(package_2))
# Вывод в терминал: <class 'tuple'>
Оба
выражения дадут одинаковый результат: значением переменной будет
кортеж. Второй способ — это и есть упаковка значений в кортеж.
Лайфхак: в кортеж можно упаковать и один элемент. Выражение
tpl = 15000
объявит переменную типа int
, а чтобы создать кортеж с этим значением — после значения нужно поставить запятую:Скопировать кодPYTHONtpl_steps = 15000,
steps = 15000
print(type(tpl_steps))
# Вывод в терминал: <class 'tuple'>
print(type(steps))
# Вывод в терминал: <class 'int'>
Что напечатает программа
Ошибки не будет. Программа напечатает кортеж из элементов строки ('2', ':', '0', '0', ':', '0', '1')
Строка
'2:00:01'
— это последовательность, переданная аргументом в функцию tuple()
. Функция вернёт кортеж, элементами которого будут символы переданной строки.Верно! Строка
'2:00:01'
— это последовательность, переданная аргументом в функцию tuple()
. Функция вернёт кортеж, элементами которого будут символы переданной строки.Распаковка кортежей
Если
есть упаковка — логично предположить, что есть и распаковка, как и у
списков. Смысл этой операции — присвоить значения элементов кортежа
переменным: работать с именованными переменными гораздо удобнее, чем
получать значение по индексу из последовательности.
Скопировать кодPYTHONpackage = ('2:00:01', 15000)
time, steps = package
print(steps)
# Вывод в терминал: 15000
print(time)
# Вывод в терминал: '2:00:01'
Обращение к элементу кортежа
Получить
значение элемента кортежа можно так же, как в других
последовательностях — по индексу. Индексация, как всегда, начинается с
нуля.
Сортировка
Для сортировки кортежей есть функция
sorted()
. Разница между функцией
sorted()
и методом списка sort()
состоит в том, чтоlist.sort
изменяет исходный список и возвращаетNone
;sorted()
принимает любую последовательность и возвращает новый объект — отсортированный список, состоящий из элементов исходной последовательности. Ведь сортировка — это изменение последовательности элементов, а изменять исходный кортеж нельзя.
Скопировать кодPYTHONnot_srtd_tpl = (5**5, 5**2, 5**1, 5**4, 5**0, 5**3)
print(not_srtd_tpl)
# Вывод в терминал: (3125, 25, 5, 625, 1, 125)
srtd_tpl = sorted(not_srtd_tpl)
print(srtd_tpl)
# Вывод в терминал: [1, 5, 25, 125, 625, 3125]
# Отсортировали, но вместо кортежа получили список.
# Исходный кортеж остался неизменённым.
Функция
sorted()
возвращает список, хотя в неё передавался кортеж.Отредактируйте код, чтобы результатом выполнения был новый отсортированный кортеж.
КодPYTHON
5
1
not_srtd_tpl = (5**5, 5**2, 5**1, 5**4, 5**0, 5**3)
2
3
# Измените это выражение, чтобы результатом был кортеж
4
srtd_tpl = tuple(sorted(not_srtd_tpl))
5
print(srtd_tpl)
Удаление
Главное
отличие кортежей — неизменяемость: в кортеже нельзя изменять, добавлять
или удалять элементы. Но можно удалить весь кортеж — для этого есть
оператор
del()
.Скопировать кодPYTHONweek = (
'Понедельник', 'Втроник', 'Среда',
'Четверг', 'Пятница', 'Суббота', 'Воскресенье'
)
del week
print(week)
Traceback (most recent call last):
File "D:/Dev/course/examples/main.py", line 5, in <module>
print(week)
NameError: name 'week' is not defined
Из кортежа и списка создайте список кортежей.
Программа получает
- кортеж
days
с перечнем дней недели, - список
steps
, в котором перечислено количество шагов, пройденных пользователем в соответствующий день; например,steps[0]
— это количество шагов за понедельник.
Программа
должна вернуть список кортежей, каждый из которых содержит два
элемента: название дня недели и количество шагов за этот день.
КодPYTHON
9
1
days = ('пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс')
2
steps = [1500, 3445, 13222, 10000, 12555, 1300, 6000]
3
4
result = []
5
for i in range(len(days)):
6
tuple = days[i], steps[i]
7
result.append(tuple)
8
9
print(result)