Мы изучили списки и строки. Списки – изменяемые коллекции, строки – неизменяемые последовательности Unicode символов. В Python имеются и неизменяемые последовательности, содержащие, в отличие от строк, абсолютно произвольные данные. Такие коллекции называются кортежами (tuple
, читается "тюпл").
Рассмотрим следующий программный код:
my_list = [1, 2, 3, 4, 5]
Мы объявили список чисел и присвоили его переменной my_list
. Содержимое списка можно изменять.
Следующий программный код:
my_list = [1, 2, 3, 4, 5]
my_list[0] = 9
my_list[4] = 7
print(my_list)
выведет:
[9, 2, 3, 4, 7]
Заменив квадратные скобки при объявлении списка на круглые, мы объявляем кортеж:
my_tuple = (1, 2, 3, 4, 5)
Кортежи по своей природе (задумке) – неизменяемые аналоги списков. Поэтому программный код:
my_tuple = (1, 2, 3, 4, 5)
my_tuple[0] = 9
my_tuple[4] = 7
print(my_tuple)
приводит к ошибке
TypeError: 'tuple' object does not support item assignment
Кортеж (tuple
) – ещё один вид коллекций в Python. Они похожи на списки, но являются неизменяемыми.
В литеральной форме кортеж записывается в виде последовательности элементов в круглых скобках, а список – в квадратных.
empty_tuple = () # пустой кортеж
point = (1.5, 6.0) # кортеж из двух чисел
names = ('Timur', 'Ruslan', 'Roman') # кортеж из трех строк
info = ('Timur', 'Guev', 28, 170, 60, False) # кортеж из 6 элементов разных типов
nested_tuple = (('one', 'two'), ['three', 'four']) # кортеж из кортежа и списка
empty_tuple
хранится пустой кортеж;point
хранится кортеж, состоящий из двух вещественных чисел (такой кортеж удобно использовать для представления точки на координатной плоскости);names
хранится кортеж, содержащий три строковых значения;info
содержится кортеж, содержащий 66 элементов разного типа (строки, числа, булевы переменные);nested_tuple
содержится кортеж, содержащий другой кортеж и список.Кортежи могут хранить и содержать в себе объекты любых типов (даже составных) и поддерживают неограниченное количество уровней вложенности.
Для создания кортежа с единственным элементом после значения элемента ставят замыкающую запятую:
my_tuple = (1,)
print(type(my_tuple)) # <class 'tuple'>
Если запятую пропустить, то кортеж создан не будет. Например, приведенный ниже код просто присваивает переменной my_tuple
целочисленное значение 1
:
my_tuple = (1)
print(type(my_tuple)) # <class 'int'>
Списки могут делать то же, что кортежи, и даже больше. Но неизменяемость кортежей обеспечивает им особые свойства:
В Python существуют операции, требующие применения кортежа. По мере освоения языка Python вы будете чаще сталкиваться с кортежами.
Примечание 1. Мы уже сталкивались с кортежами, когда изучали функции, возвращающие несколько значений. Такие функции возвращают именно кортежи.
Рассмотрим функцию get_powers()
, которая принимает в качестве аргумента число и возвращает его 22, 33 и 44 степень.
def get_powers(num):
return num**2, num**3, num**4
Результатом выполнения следующего кода:
result = get_powers(5)
print(type(result))
print(result)
будет:
<class 'tuple'>
(25, 125, 625)
Примечание 2. Списки предназначены для объединения неопределенного количества однородных сущностей. Кортежи, как правило, объединяют под одним именем несколько разнородных объектов, имеющих различный смысл.
Например, список удобен для хранения нескольких городов:
cities = ['Perth', 'San Francisco', 'Lisbon', 'Sochi']
А кортеж удобен для хранения данных о людях:
person = ('Vasya', 27, 'Auckland')
Примечание 3. Тот факт, что кортеж является неизменяемым вовсе не означает, что мы не можем поменять содержимое списка в кортеже.
Приведенный ниже код:
my_tuple = (1, 'python', [1, 2, 3])
print(my_tuple)
my_tuple[2][0] = 100
my_tuple[2].append(17)
print(my_tuple)
выводит:
(1, 'python', [1, 2, 3])
(1, 'python', [100, 2, 3, 17])
При этом важно понимать: меняется список, а не кортеж. Списки являются ссылочными типами данных, поэтому в кортеже хранится ссылка на список, которая не меняется при изменении самого списка.