Кортежи в Python
В этой статье мы познакомимся с кортежами (tuple) — упорядоченными и неизменяемыми коллекциями данных в Python.
Кортежи могут показаться очень похожими на списки, но между ними есть важные различия, которые влияют на то, когда и как их следует использовать.
Что такое кортеж?
Кортеж в Python — это упорядоченная, неизменяемая коллекция элементов, которые могут быть разных типов. Проще говоря, это как список, но который нельзя изменить после создания.
Основные свойства кортежей:
- Упорядоченность: элементы хранятся в определенном порядке
- Неизменяемость: после создания нельзя добавить, удалить или изменить элементы
- Индексируемость: к элементам можно обращаться по индексам
- Допускают дубликаты: могут содержать повторяющиеся значения
- Могут содержать разные типы данных: целые числа, строки, списки и т.д.
Создание кортежей
Существует несколько способов создания кортежей в Python:
1. С помощью круглых скобок ()
# Пустой кортеж >>> empty_tuple = () # Кортеж с одним элементом (обязательно с запятой!) >>> single_item = (42,) >>> type(single_item)
<class 'tuple'># Без запятой будет просто число: (42) == 42 >>> single_item_num = (42) >>> type(single_item_num)<class 'int'># Кортеж чисел >>> numbers = (1, 2, 3, 4, 5) # Кортеж строк >>> fruits = ("apple", "banana", "cherry") # Кортеж с разными типами данных >>> mixed = (1, "hello", True, 3.14) # Вложенные кортежи >>> nested = ((1, 2), ("a", "b"), (True, False))
2. Без скобок (разделение запятыми)
Python позволяет создавать кортежи даже без скобок, просто перечисляя элементы через запятую:
# Создание кортежа без скобок >>> coordinates = 10.5, 20.7, 30.9 >>> type(coordinates)
<class 'tuple'># Распаковка кортежа >>> x, y, z = coordinates >>> print(x, y, z)10.5 20.7 30.9
3. С помощью конструктора tuple()
# Создание пустого кортежа >>> 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)
Доступ к элементам кортежа
Доступ к элементам кортежа осуществляется так же, как и в списках — через индексы и срезы:
Индексация
>>> fruits = ("apple", "banana", "cherry", "date", "elderberry") # Получение элементов по индексу >>> first_fruit = fruits[0] >>> print(first_fruit)
apple# Отрицательные индексы для доступа с конца кортежа >>> last_fruit = fruits[-1] >>> print(last_fruit)elderberry
Срезы (slices)
>>> fruits = ("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')
Методы кортежей
Поскольку кортежи неизменяемые, у них только два метода:
>>> fruits = ("apple", "banana", "cherry", "banana", "date") # Подсчет количества вхождений элемента >>> banana_count = fruits.count("banana") >>> print(banana_count)
2# Поиск индекса первого вхождения элемента >>> banana_index = fruits.index("banana") >>> print(banana_index)1
Операции с кортежами
# Узнать длину >>> fruits = ("apple", "banana", "cherry") >>> print(len(fruits))
3# Проверить наличие элемента >>> print("apple" in fruits)True>>> print("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
Неизменяемость кортежей
Важно понимать, что неизменяемость кортежей означает, что после создания кортежа вы не можете:
- Изменить существующие элементы
- Добавить новые элементы
- Удалить элементы
# Создаем кортеж >>> 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)
Важное замечание о вложенных изменяемых объектах
# Кортеж, содержащий список >>> 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. Возврат нескольких значений из функций
>>> def 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. Фиксированные данные
# Дни недели - идеальный пример неизменяемой последовательности >>> 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
3. Структуры данных с кортежами
# Список студентов: (имя, возраст, средний балл) >>> students = [ ... ("Anna", 20, 4.8), ... ("Ivan", 19, 4.5), ... ("Maria", 21, 4.9), ... ("Peter", 20, 4.3) ... ] # Найти студента с максимальным средним баллом # используя простой цикл >>> max_gpa = 0 >>> best_student = None >>> for student in students: ... if student[2] > max_gpa: ... max_gpa = student[2] ... best_student = student >>> print(f"Best student: {best_student[0]} with GPA {best_student[2]}")
Best student: Maria with GPA 4.9
Сравнение списков и кортежей
Распространенные ошибки при работе с кортежами
-
Забытая запятая в кортеже с одним элементом
# Неправильно (это не кортеж, а просто число в скобках) >>> not_a_tuple = (42) >>> print(type(not_a_tuple))
<class 'int'># Правильно >>> single_item_tuple = (42,) >>> print(type(single_item_tuple))<class 'tuple'> -
Попытка изменить кортеж
>>> coordinates = (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 -
Путаница при распаковке
# Неправильно: количество переменных не соответствует количеству элементов >>> point = (1, 2, 3) >>> try: ... x, y = point # Ошибка, нужно 3 переменные ... except ValueError as e: ... print(f"Error: {e}")
Error: too many values to unpack (expected 2)# Правильно >>> x, y, z = point >>> print(x, y, z)1 2 3
Проверка понимания
Какое из следующих утверждений о кортежах в Python верно?