Тема: Типы данных • Урок 5 из 7
Кортежи (tuples) — это упорядоченные, неизменяемые коллекции объектов. Они похожи на списки, но, в отличие от них, кортежи нельзя изменять после создания.
Кортежи в Python создаются с помощью круглых скобок () или функции tuple():
# Пустой кортеж
empty_tuple = ()
empty_tuple2 = tuple()
# Кортеж с элементами
numbers = (1, 2, 3, 4, 5)
# Кортеж с элементами разных типов
mixed = (1, "Hello", 3.14, True)
# Кортеж с одним элементом (обратите внимание на запятую)
single_item = (42,) # Без запятой это будет просто число в скобках
# Вложенные кортежи
nested = (1, 2, (3, 4), 5)
# Создание кортежа из другой последовательности
tuple_from_list = tuple([1, 2, 3])
chars = tuple("Python") # ('P', 'y', 't', 'h', 'o', 'n')Как и списки, кортежи поддерживают индексацию и срезы:
# Создаем кортеж
numbers = (1, 2, 3)
print(numbers)
# Длина кортежа
print(f"Длина кортежа: {len(numbers)}")
# Доступ по индексу
print(f"Первый элемент: {numbers[0]}")
print(f"Последний элемент: {numbers[-1]}")
# Распаковка кортежа
person = ("Иван", 30)
name, age = person
print(f"Имя: {name}, Возраст: {age}")
# Объединение кортежей
person = ("Иван", 30)
location = ("Москва",)
person_info = person + location
print(f"Имя: {person_info[0]}, Возраст: {person_info[1]}, Город: {person_info[2]}")Как и списки, кортежи поддерживают срезы:
numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# Синтаксис среза: tuple[start:end:step]
print(numbers[2:5]) # (2, 3, 4)
print(numbers[:5]) # (0, 1, 2, 3, 4)
print(numbers[5:]) # (5, 6, 7, 8, 9)
print(numbers[::2]) # (0, 2, 4, 6, 8)
print(numbers[::-1]) # (9, 8, 7, 6, 5, 4, 3, 2, 1, 0)Главное отличие кортежей от списков — их неизменяемость. После создания кортежа вы не можете изменить, добавить или удалить его элементы:
numbers = (1, 2, 3)
# Следующие операции вызовут ошибку:
# numbers[0] = 10 # TypeError: 'tuple' object does not support item assignment
# numbers.append(4) # AttributeError: 'tuple' object has no attribute 'append'
# numbers.remove(2) # AttributeError: 'tuple' object has no attribute 'remove'
# Но можно создать новый кортеж на основе существующего:
numbers = (1, 2, 3)
numbers = numbers + (4, 5) # Создает новый кортеж (1, 2, 3, 4, 5)Из-за своей неизменяемости кортежи имеют только два метода:
numbers = (1, 2, 3, 2, 4, 2)
# count() - возвращает количество вхождений элемента
count = numbers.count(2) # 3
# index() - возвращает индекс первого вхождения элемента
index = numbers.index(3) # 2Распаковка — это удобный способ присвоить значения из кортежа нескольким переменным одновременно:
# Простая распаковка
point = (10, 20)
x, y = point
print(x) # 10
print(y) # 20
# Распаковка с использованием *
numbers = (1, 2, 3, 4, 5)
first, *middle, last = numbers
print(first) # 1
print(middle) # [2, 3, 4]
print(last) # 5Хотя кортежи менее гибкие, чем списки, они имеют несколько преимуществ:
Кортежи часто используются для возвращения нескольких значений из функции:
def get_user_info():
name = "Иван"
age = 30
city = "Москва"
return name, age, city # Неявно возвращает кортеж
# Получение и распаковка результата
user_info = get_user_info()
print(user_info) # ('Иван', 30, 'Москва')
name, age, city = get_user_info()
print(f"Имя: {name}, Возраст: {age}, Город: {city}")Модуль collections предоставляет класс namedtuple, который позволяет создавать кортежи с именованными полями:
from collections import namedtuple
# Определение именованного кортежа
Person = namedtuple('Person', ['name', 'age', 'city'])
# Создание экземпляра
person = Person(name='Иван', age=30, city='Москва')
# Доступ к полям по имени
print(person.name) # 'Иван'
print(person.age) # 30
print(person.city) # 'Москва'
# Доступ по индексу (как обычный кортеж)
print(person[0]) # 'Иван'
# Распаковка
name, age, city = person