Кортежи в Python
Когда у данных фиксированная форма (координаты, RGB-цвет, возвращаемое значение функции из нескольких частей), это случай для кортежа, а не списка. Кортеж (tuple) — это упорядоченная неизменяемая коллекция: после создания добавить, удалить или изменить элемент в нём нельзя.
Что такое кортеж?
Кортеж в Python — это упорядоченная, неизменяемая коллекция элементов, которые могут быть разных типов. Проще говоря, это как список, но который нельзя изменить после создания.
Основные свойства кортежей:
- Упорядоченность: элементы хранятся в определенном порядке
- Неизменяемость: после создания нельзя добавить, удалить или изменить элементы
- Индексируемость: к элементам можно обращаться по индексам
- Допускают дубликаты: могут содержать повторяющиеся значения
- Могут содержать разные типы данных: целые числа, строки, списки и т.д.
Создание кортежей
Существует несколько способов создания кортежей в Python:
С помощью круглых скобок ()
Python 3.13# Пустой кортеж empty_tuple = () # Кортеж с одним элементом (обязательно с запятой!) single_item = (42,) print(type(single_item))<class 'tuple'># Без запятой будет просто число: (42) == 42 single_item_num = (42) print(type(single_item_num))<class 'int'># Кортеж чисел numbers = (1, 2, 3, 4, 5) # Кортеж с разными типами данных mixed = (1, "hello", True, 3.14) # Вложенные кортежи nested = ((1, 2), ("a", "b"), (True, False))
Без скобок (разделение запятыми)
Python позволяет создавать кортежи даже без скобок, просто перечисляя элементы через запятую:
Python 3.13# Создание кортежа без скобок coordinates = 10.5, 20.7, 30.9 print(type(coordinates))<class 'tuple'>
С помощью конструктора tuple()
Python 3.13# Создание пустого кортежа empty_tuple = tuple() # Преобразование списка в кортеж list_to_tuple = tuple([1, 2, 3]) print(list_to_tuple)(1, 2, 3)# Преобразование строки в кортеж (каждый символ становится элементом) string_to_tuple = tuple("Python") print(string_to_tuple)('P', 'y', 't', 'h', 'o', 'n')# Преобразование множества в кортеж set_to_tuple = tuple({1, 2, 3}) print(set_to_tuple)(1, 2, 3)
Доступ к элементам кортежа
Доступ к элементам кортежа осуществляется так же, как и в списках — через индексы и срезы:
Индексация
Python 3.13fruits = ("apple", "banana", "cherry", "date", "elderberry") # Получение элементов по индексу first_fruit = fruits[0] print(first_fruit)apple# Отрицательные индексы для доступа с конца кортежа last_fruit = fruits[-1] print(last_fruit)elderberry
Срезы (slices)
Python 3.13fruits = ("apple", "banana", "cherry", "date", "elderberry") # Первые три элемента first_three = fruits[:3] print(first_three)('apple', 'banana', 'cherry')# От второго до четвертого middle = fruits[1:4] print(middle)('banana', 'cherry', 'date')# Разворот кортежа reversed_tuple = fruits[::-1] print(reversed_tuple)('elderberry', 'date', 'cherry', 'banana', 'apple')
Методы кортежей
Поскольку кортежи неизменяемые, у них только два метода:
Python 3.13fruits = ("apple", "banana", "cherry", "banana", "date") # Подсчет количества вхождений элемента banana_count = fruits.count("banana") print(banana_count)2# Поиск индекса первого вхождения элемента banana_index = fruits.index("banana") print(banana_index)1
Операции с кортежами
Python 3.13# Узнать длину fruits = ("apple", "banana", "cherry") print(len(fruits))3# Проверить наличие элемента print("apple" in fruits)Trueprint("mango" in fruits)False# Конкатенация (объединение) кортежей more_fruits = ("pear", "orange") all_fruits = fruits + more_fruits print(all_fruits)('apple', 'banana', 'cherry', 'pear', 'orange')# Повторение repeated = fruits * 2 print(repeated)('apple', 'banana', 'cherry', 'apple', 'banana', 'cherry')# Распаковка a, b, c = fruits print(a, b, c)apple banana cherry
Сравнение кортежей
Кортежи сравниваются поэлементно, слева направо, до первого отличия:
Python 3.13print((1, 2) < (1, 3))Trueprint((2, 0) < (1, 9))False
В первом случае первые элементы равны (1 == 1), Python переходит ко вторым: 2 < 3, значит весь кортеж меньше. Во втором сразу 2 > 1, дальше можно не смотреть.
Это позволяет одной командой отсортировать список кортежей по нескольким полям сразу:
Python 3.13people = [("Bob", 30), ("Anna", 25), ("Anna", 30)] print(sorted(people))[('Anna', 25), ('Anna', 30), ('Bob', 30)]
Сортировка идёт сначала по первому элементу (имени), а при равенстве — по второму (возрасту).
Неизменяемость кортежей
Важно понимать, что неизменяемость кортежей означает, что после создания кортежа вы не можете:
- Изменить существующие элементы
- Добавить новые элементы
- Удалить элементы
Python 3.13# Создаем кортеж coordinates = (10.5, 20.7, 30.9) # Эти операции вызовут ошибку TypeError: # coordinates[0] = 15.0 # Нельзя изменить элемент # coordinates.append(40.2) # Нет метода append # coordinates.remove(20.7) # Нет метода remove # del coordinates[1] # Нельзя удалить элемент # Но можно создать новый кортеж на основе существующего new_coordinates = (15.0,) + coordinates[1:] print(new_coordinates)(15.0, 20.7, 30.9)
Важное замечание о вложенных изменяемых объектах
Python 3.13# Кортеж, содержащий список tuple_with_list = (1, 2, [3, 4]) # Это работает, потому что мы изменяем список внутри кортежа tuple_with_list[2][0] = 30 print(tuple_with_list)(1, 2, [30, 4])# Но это вызовет ошибку - нельзя изменить сам кортеж # tuple_with_list[2] = [5, 6] # TypeError
Практические примеры использования кортежей
1. Возврат нескольких значений из функций
Python 3.13def get_user_info(): name = "Anna" age = 30 is_admin = True return name, age, is_admin # Распаковка результата user_name, user_age, user_is_admin = get_user_info() print(f"Name: {user_name}, Age: {user_age}, Admin: {user_is_admin}")Name: Anna, Age: 30, Admin: True
2. Фиксированные данные
Python 3.13# Дни недели - идеальный пример неизменяемой последовательности DAYS_OF_WEEK = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") # Использование today_index = 4 # Friday print(f"Today is {DAYS_OF_WEEK[today_index]}")Today is Friday
Сравнение списков и кортежей
Технически кортежи и списки часто пересекаются по возможностям, но в Python-коде у них разные роли:
- Кортеж это «запись»: позиции имеют конкретный смысл. (name, age, email) это не «список из трёх произвольных вещей», а структура, в которой первая позиция всегда имя, вторая всегда возраст, третья всегда email.
- Список это однородная коллекция: все элементы примерно одного «типа задачи», их количество может расти и сокращаться по ходу программы.
Эта разница важнее технических деталей: даже когда оба варианта работают, выбор влияет на читаемость и намерение кода.
Распространенные ошибки при работе с кортежами
-
Забытая запятая в кортеже с одним элементом
Python 3.13# Неправильно (это не кортеж, а просто число в скобках) not_a_tuple = (42) print(type(not_a_tuple))<class 'int'>
# Правильно single_item_tuple = (42,) print(type(single_item_tuple))<class 'tuple'>
-
Попытка изменить кортеж
Python 3.13coordinates = (10.5, 20.7, 30.9) # Это вызовет ошибку try: coordinates[0] = 15.0 except TypeError as e: print(f"Error: {e}")Error: 'tuple' object does not support item assignment
Проверка понимания
Какое из следующих утверждений о кортежах в Python верно?
В следующем уроке посмотрим множества (set) — коллекции, в которых каждый элемент уникален.
