Что такое кортежи в Python?

Кортежи (tuples) - это упорядоченные неизменяемые коллекции объектов произвольных типов. Кортежи похожи на списки, но с ключевым отличием - их нельзя изменить после создания.

Ключевые характеристики кортежей

Создание кортежей

Кортежи можно создавать несколькими способами:

Создание кортежей
# Пустой кортеж
пустой_кортеж = ()
print(пустой_кортеж)  # Вывод: ()

# Кортеж с элементами
координаты = (10, 20)
print(координаты)  # Вывод: (10, 20)

# Кортеж с разными типами данных
информация = ("Иван", 25, True, 3.14)
print(информация)  # Вывод: ('Иван', 25, True, 3.14)

# Кортеж без скобок (не рекомендуется для читаемости)
кортеж_без_скобок = 1, 2, 3
print(кортеж_без_скобок)  # Вывод: (1, 2, 3)

# Кортеж с одним элементом (обратите внимание на запятую)
один_элемент = (42,)
print(один_элемент)  # Вывод: (42,)

# Создание кортежа из списка
список = [1, 2, 3, 4]
кортеж_из_списка = tuple(список)
print(кортеж_из_списка)  # Вывод: (1, 2, 3, 4)

Доступ к элементам кортежа

Элементы кортежа доступны по индексу, как и в списках:

Доступ к элементам
# Кортеж с данными
студент = ("Анна", 20, "Информатика", 4.5)

# Доступ к элементам по индексу
print(f"Имя: {студент[0]}")           # Вывод: Имя: Анна
print(f"Возраст: {студент[1]}")       # Вывод: Возраст: 20
print(f"Специальность: {студент[2]}")  # Вывод: Специальность: Информатика
print(f"Средний балл: {студент[3]}")   # Вывод: Средний балл: 4.5

# Отрицательная индексация
print(f"Последний элемент: {студент[-1]}")  # Вывод: Последний элемент: 4.5

# Срезы кортежа
print(f"Имя и возраст: {студент[0:2]}")  # Вывод: Имя и возраст: ('Анна', 20)

Особенности неизменяемости кортежей

Кортежи неизменяемы, что означает невозможность изменения их содержимого после создания:

Попытка изменения кортежа
# Кортеж
координаты = (10, 20)

# Попытка изменить элемент (вызовет ошибку)
# координаты[0] = 15  # TypeError: 'tuple' object does not support item assignment

# Но можно создать новый кортеж
новые_координаты = (15, координаты[1])
print(новые_координаты)  # Вывод: (15, 20)

# Или преобразовать в список, изменить и обратно в кортеж
список_координат = list(координаты)
список_координат[0] = 15
новые_координаты = tuple(список_координат)
print(новые_координаты)  # Вывод: (15, 20)

Методы кортежей

Из-за неизменяемости кортежи имеют меньше методов, чем списки:

Методы кортежей
# Кортеж с повторяющимися элементами
числа = (1, 2, 3, 2, 4, 2, 5)

# count() - подсчет вхождений элемента
print(f"Количество двоек: {числа.count(2)}")  # Вывод: Количество двоек: 3

# index() - поиск индекса первого вхождения элемента
print(f"Индекс первой двойки: {числа.index(2)}")  # Вывод: Индекс первой двойки: 1

# Попытка найти индекс несуществующего элемента (вызовет ошибку)
# print(числа.index(10))  # ValueError: tuple.index(x): x not in tuple

Функции для работы с кортежами

С кортежами работают те же функции, что и со списками:

Встроенные функции
# Кортеж чисел
числа = (3, 1, 4, 1, 5, 9, 2, 6)

# len() - длина кортежа
print(f"Длина кортежа: {len(числа)}")  # Вывод: Длина кортежа: 8

# max() и min() - максимальный и минимальный элементы
print(f"Максимальный элемент: {max(числа)}")  # Вывод: Максимальный элемент: 9
print(f"Минимальный элемент: {min(числа)}")  # Вывод: Минимальный элемент: 1

# sum() - сумма элементов (только для чисел)
print(f"Сумма элементов: {sum(числа)}")  # Вывод: Сумма элементов: 31

# sorted() - возвращает отсортированный список (не кортеж!)
отсортированный = sorted(числа)
print(f"Отсортированный список: {отсортированный}")  # Вывод: [1, 1, 2, 3, 4, 5, 6, 9]
print(f"Исходный кортеж: {числа}")  # Вывод: (3, 1, 4, 1, 5, 9, 2, 6)

Распаковка кортежей

Распаковка кортежей позволяет присваивать элементы кортежа отдельным переменным:

Распаковка кортежей
# Простая распаковка
координаты = (10, 20)
x, y = координаты
print(f"x = {x}, y = {y}")  # Вывод: x = 10, y = 20

# Распаковка кортежа с разным количеством элементов
информация = ("Иван", 25, "Москва")
имя, возраст, город = информация
print(f"{имя}, {возраст} лет, {город}")  # Вывод: Иван, 25 лет, Москва

# Распаковка с использованием * (звездочка)
числа = (1, 2, 3, 4, 5)
первое, *остальные, последнее = числа
print(f"Первое: {первое}")      # Вывод: Первое: 1
print(f"Остальные: {остальные}")  # Вывод: Остальные: [2, 3, 4]
print(f"Последнее: {последнее}")  # Вывод: Последнее: 5

# Использование распаковки в циклах
пары = [("a", 1), ("b", 2), ("c", 3)]
for буква, число in пары:
    print(f"{буква}: {число}")
# Вывод:
# a: 1
# b: 2
# c: 3

Преимущества использования кортежей

Кортежи имеют несколько важных преимуществ:

Примеры использования кортежей
# 1. Координаты точек
точки = [(0, 0), (1, 1), (2, 4), (3, 9)]
for x, y in точки:
    print(f"Точка ({x}, {y})")

# 2. Возврат нескольких значений из функции
def деление_с_остатком(делимое, делитель):
    частное = делимое // делитель
    остаток = делимое % делитель
    return частное, остаток  # Возвращается кортеж

частное, остаток = деление_с_остатком(17, 5)
print(f"17 // 5 = {частное}, 17 % 5 = {остаток}")
# Вывод: 17 // 5 = 3, 17 % 5 = 2

# 3. Ключи в словарях (кортежи могут быть ключами, списки - нет)
расстояния = {
    ("Москва", "Санкт-Петербург"): 650,
    ("Москва", "Казань"): 820,
    ("Санкт-Петербург", "Казань"): 1470
}
print(f"Расстояние Москва-Казань: {расстояния[('Москва', 'Казань')]} км")
# Вывод: Расстояние Москва-Казань: 820 км

Практические задания

Задания
  1. Создайте кортеж с названиями месяцев года. Выведите названия летних месяцев.
  2. Напишите функцию, которая принимает кортеж чисел и возвращает кортеж с квадратами этих чисел.
  3. Создайте список кортежей, где каждый кортеж содержит имя студента и его оценку. Отсортируйте список по оценкам.
  4. Реализуйте функцию для обмена значениями двух переменных с использованием кортежей.
Решения:

Задание 1:

# Кортеж с месяцами
месяцы = ("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
          "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")

# Летние месяцы (июнь, июль, август)
летние_месяцы = месяцы[5:8]
print(f"Летние месяцы: {летние_месяцы}")

Задание 2:

def квадраты_кортежа(числа):
    return tuple(число ** 2 for число in числа)

# Тестирование
входной_кортеж = (1, 2, 3, 4, 5)
результат = квадраты_кортежа(входной_кортеж)
print(f"Вход: {входной_кортеж}")
print(f"Квадраты: {результат}")

Задание 3:

# Список кортежей
студенты = [
    ("Анна", 4.5),
    ("Борис", 3.8),
    ("Виктория", 4.9),
    ("Дмитрий", 4.2)
]

# Сортировка по оценкам (второй элемент кортежа)
отсортированные = sorted(студенты, key=lambda студент: студент[1], reverse=True)
print("Студенты по убыванию оценок:")
for имя, оценка in отсортированные:
    print(f"{имя}: {оценка}")

Задание 4:

def обмен_значений(a, b):
    return b, a  # Возвращаем кортеж

# Тестирование
x, y = 10, 20
print(f"До обмена: x = {x}, y = {y}")

# Обмен значениями
x, y = обмен_значений(x, y)
print(f"После обмена: x = {x}, y = {y}")

# Или просто:
# x, y = y, x
Предыдущий урок Следующий урок