Кортежи (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:
# Кортеж с месяцами
месяцы = ("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")
# Летние месяцы (июнь, июль, август)
летние_месяцы = месяцы[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