Кортеж в Python похож на список. Разница между ними заключается в том, что мы не можем изменить элементы кортежа после присваивания им значений, тогда как элементы списка мы можем изменить.
Создание кортежа в Python
Кортеж создается путем помещения всех элементов в круглые скобки ()
, разделенные запятыми. Круглые скобки необязательны, однако их использование является хорошей практикой. Кортеж может содержать любое количество элементов, и они могут быть разных типов (int, float, list, string и т.д.). Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Различные типы кортежей # Пустой кортеж my_tuple = () print(my_tuple) # Кортеж, содержащий целые числа my_tuple = (1, 2, 3) print(my_tuple) # Кортеж со смешанными типами данных my_tuple = (1, "Hello", 3.4) print(my_tuple) # Вложенный кортеж my_tuple = ("mouse", [8, 4, 6], (1, 2, 3)) print(my_tuple) |
Результат:
()
(1, 2, 3)
(1, 'Hello', 3.4)
('mouse', [8, 4, 6], (1, 2, 3))
Также мы можем создавать кортежи без использования круглых скобок:
1 2 |
my_tuple = 1, 2, 3 my_tuple = 1, "Hello", 3.4 |
Создание кортежа с одним элементом
В Python при создании кортежа с одним элементом нужно указывать запятую в конце, чтобы указать, что это именно кортеж (а не строка):
1 2 |
var1 = ("Hello") # это строка var2 = ("Hello",) # а это кортеж |
Мы можем использовать функцию type(), чтобы узнать, к какому классу принадлежит переменная или значение:
1 2 3 4 5 6 7 8 9 10 |
var1 = ("hello") print(type(var1)) # Создание кортежа, содержащего один элемент var2 = ("hello",) print(type(var2)) # Круглые скобки необязательны var3 = "hello", print(type(var3)) |
Результат:
<class 'str'>
<class 'tuple'>
<class 'tuple'>
Здесь:
("hello")
— это строка, поэтому функция type() возвращает <class 'str'>
;
("hello",)
и "hello",
— оба кортежа, поэтому функция type() возвращает <class 'tuple'>
.
Доступ к элементам кортежа в Python
Подобно списку, каждый элемент кортежа представлен индексными номерами (0, 1, …), где индекс первого элемента 0. Номер индекса используется для доступа к элементам кортежа. Например:
1. Индексация
Мы можем использовать оператор индекса []
для доступа к элементу в кортеже, у которого индекс начинается с 0.
Таким образом, кортеж, состоящий из 6 элементов, будет иметь индексы от 0 до 5. Попытка получить доступ к индексу за пределами диапазона индексов кортежа (например, к индексам 6 или 7) вызовет ошибку IndexError
.
Индекс должен быть целым числом, поэтому мы не можем использовать тип float или другие типы. Это приведет к ошибке TypeError
.
Аналогично, доступ к вложенным кортежам осуществляется с использованием вложенной индексации, как показано в следующем примере:
1 2 3 4 5 |
# Доступ к элементам кортежа с использованием индексации letters = ("p", "r", "o", "g", "r", "a", "m", "i", "z") print(letters[0]) # выведет "p" print(letters[5]) # выведет "a" |
Здесь:
letters[0]
— обращается к первому элементу;
letters[5]
— обращается к шестому элементу.
2. Отрицательная индексация
Python позволяет и отрицательную индексацию для своих последовательностей. Индекс -1 относится к последнему элементу, индекс -2 относится к предпоследнему элементу и так далее. Например:
1 2 3 4 5 |
# Доступ к элементам кортежа с использованием отрицательной индексации letters = ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z') print(letters[-1]) # выведет 'z' print(letters[-3]) # выведет 'm' |
Здесь:
letters[-1]
— обращается к последнему элементу;
letters[-3]
— обращается к третьему с конца элементу.
3. Срез
Мы можем получить доступ к диапазону элементов в кортеже, используя оператор среза :
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Доступ к элементам кортежа с помощью среза my_tuple = ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z') # Выводим "срезанные" элементы со 2 по 4 индекс print(my_tuple[2:4]) # Выводим элементы до 2-го индекса - отрицательная индексация print(my_tuple[:-7]) # Выводим элементы с 7-го индекса до последнего print(my_tuple[7:]) # Выводим все элементы кортежа print(my_tuple[:]) |
Результат:
('o', 'g')
('p', 'r')
('i', 'z')
('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
Примечание: При выполнении среза в кортежах, первый индекс является включающим, а конечный — исключающим.
Методы для работы с кортежами в Python
В Python методы, которые добавляют или удаляют элементы, не работают с кортежами. Работают только следующие два метода:
1 2 3 4 |
my_tuple = ('a', 'p', 'p', 'l', 'e',) print(my_tuple.count('p')) # выведет 2 print(my_tuple.index('l')) # выведет 3 |
Здесь:
my_tuple.count('p')
— подсчитывает общее количество 'p'
в кортеже my_tuple;
my_tuple.index('l')
— возвращает индекс первого вхождения 'l'
в кортеже my_tuple.
Итерация кортежа в Python
Мы можем использовать цикл for для перебора элементов кортежа. Например:
1 2 3 4 5 |
languages = ('Python', 'Swift', 'C++') # Перебираем и выводим элементы кортежа for language in languages: print(language) |
Результат:
Проверка, существует ли элемент в кортеже
Ключевое слово in
используется для проверки того, существует ли элемент в кортеже или нет. Например:
1 2 3 4 |
languages = ('Python', 'Swift', 'C++') print('C' in languages) # выведет False print('Python' in languages) # выведет True |
Здесь:
'C'
— отсутствует в кортеже languages, поэтому результатом является False
.
'Python'
— присутствует в кортеже languages, поэтому результатом является True
.
Преимущества использования кортежа перед списком в Python
Поскольку кортежи очень похожи на списки, они оба используются в схожих ситуациях. Однако существуют определенные преимущества применения кортежа по сравнению со списком.
Обычно кортежи используются для элементов разных типов данных, а списки — для элементов похожих типов данных.
Поскольку кортежи неизменяемы, итерация по кортежу выполняется быстрее, чем по списку. Таким образом, происходит небольшое повышение производительности.
Кортежи, содержащие неизменяемые элементы, могут использоваться в качестве ключа для словаря. Со списками это невозможно.
Если у вас есть данные, которые не изменяются, реализация их в виде кортежа гарантирует, что они останутся неизменными.