Кортежи в Python: создание, доступ и продвинутые операции
Кортежи в Python
Изучите возможности кортежей в Python — неизменяемых последовательностей, обеспечивающих скорость, безопасность и универсальность для гетерогенных данных. Руководство охватывает всё: от базового синтаксиса до продвинутых операций, чтобы вы понимали, когда выбирать кортежи вместо списков.
Видео: Списки и кортежи в Python
Кортеж ведёт себя как список, но является неизменяемым после создания. В отличие от списков, вы не можете изменить его элементы, что делает кортежи идеальными для фиксированных наборов данных.
Создание кортежа
Кортежи определяются размещением значений, разделённых запятыми, внутри круглых скобок (). Скобки необязательны, но улучшают читаемость.
Кортежи могут содержать любое количество элементов и смешивать типы данных — целые, float, строки, списки, другие кортежи и т.д.
# Разные типы кортежей
# Пустой кортеж
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))
Кортежи можно создавать без скобок — технику называют упаковкой кортежа (tuple packing).
my_tuple = 3, 4.6, "dog"
print(my_tuple)
# Распаковка кортежа
a, b, c = my_tuple
print(a)
print(b)
print(c)
Вывод
(3, 4.6, 'dog') 3 4.6 dog
Если кортеж содержит один элемент, нужна завершающая запятая, чтобы отличить его от обычного значения.
my_tuple = ("hello")
print(type(my_tuple)) # <class 'str'>
# Кортеж из одного элемента
my_tuple = ("hello",)
print(type(my_tuple)) # <class 'tuple'>
# Скобки необязательны
my_tuple = "hello",
print(type(my_tuple)) # <class 'tuple'>
Вывод
<class 'str'> <class 'tuple'> <class 'tuple'>
Доступ к элементам кортежа
Кортежи поддерживают несколько способов доступа:
1. Индексация
Используйте оператор [] с нулевой базой. Выход за границы вызывает IndexError; нецелочисленный индекс — TypeError.
# Пример индексации
my_tuple = ('p','e','r','m','i','t')
print(my_tuple[0]) # 'p'
print(my_tuple[5]) # 't'
# Вложенная индексация
n_tuple = ("mouse", [8, 4, 6], (1, 2, 3))
print(n_tuple[0][3]) # 's'
print(n_tuple[1][1]) # 4
Вывод
p t s 4
2. Отрицательная индексация
Отрицательные индексы отсчитываются от конца: -1 — последний элемент.
# Отрицательная индексация
my_tuple = ('p', 'e', 'r', 'm', 'i', 't')
print(my_tuple[-1]) # 't'
print(my_tuple[-6]) # 'p'
Вывод
t p
3. Срезы
Используйте синтаксис start:stop для извлечения подкортежей.
# Пример срезов
my_tuple = ('p','r','o','g','r','a','m','i','z')
print(my_tuple[1:4]) # ('r', 'o', 'g')
print(my_tuple[:-7]) # ('p', 'r')
print(my_tuple[7:]) # ('i', 'z')
print(my_tuple[:]) # полный кортеж
Вывод
('r', 'o', 'g')
('p', 'r')
('i', 'z')
('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')

Изменение кортежа
Кортежи неизменяемы. Прямое присваивание элементу вызывает TypeError:
# Попытка изменения
my_tuple = (4, 2, 3, [6, 5])
# my_tuple[1] = 9 # TypeError
Однако, если элемент сам изменяем (например, список), его внутреннее состояние можно менять:
my_tuple[3][0] = 9
print(my_tuple) # (4, 2, 3, [9, 5])
Кортеж можно переназначить целиком на новое значение:
my_tuple = ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
print(my_tuple)
Операторы + (конкатенация) и * (повторение) возвращают новый кортеж.
print((1, 2, 3) + (4, 5, 6)) # (1, 2, 3, 4, 5, 6)
print(("Repeat",) * 3) # ('Repeat', 'Repeat', 'Repeat')
Вывод
(1, 2, 3, 4, 5, 6)
('Repeat', 'Repeat', 'Repeat')
Удаление кортежа
Отдельные элементы удалить нельзя. Весь кортеж можно удалить с del:
my_tuple = ('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')
# del my_tuple[3] # TypeError
del my_tuple
# print(my_tuple) # NameError
Вывод
Traceback (most recent call last): File "<string>", line 12, in <module> NameError: name 'my_tuple' is not defined
Методы кортежей
У кортежей только два встроенных метода: count() и index().
my_tuple = ('a', 'p', 'p', 'l', 'e')
print(my_tuple.count('p')) # 2
print(my_tuple.index('l')) # 3
Вывод
2 3
Дополнительные операции с кортежами
1. Проверка принадлежности
Проверьте наличие с ключевым словом in.
my_tuple = ('a', 'p', 'p', 'l', 'e')
print('a' in my_tuple)
print('b' in my_tuple)
print('g' not in my_tuple)
Вывод
True False True
2. Итерация
Перебор кортежа с for:
for name in ('John', 'Kate'):
print("Hello", name)
Вывод
Hello John Hello Kate
3. Преимущества над списками
- Идеальны для гетерогенных данных; списки обычно однородны.
- Неизменяемость даёт преимущество в производительности при итерации.
- Кортежи, содержащие только неизменяемые элементы, могут быть ключами словаря.
- Защита от записи гарантирует, что данные не изменятся случайно.
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Оператор pass в Python: практическое руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Словари в Python: создание, манипуляции и продвинутые техники
- Итераторы в Python: как они работают и как создать свои
- Замыкания в Python: как вложенные функции захватывают переменные
- Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
- Обзор Python: высокоуровневый, читаемый, интерактивный и объектно-ориентированный язык
- Числа в Python: Неизменяемые числовые типы данных