Кортежи
Создание кортежей
empty = () # инициализация кортежа
single = (42,) # инициализация кортежа
nums = (1, 2, 3) # инициализация кортежа
without_parens = 1, 2, 3
# Из списка
tuple([1, 2, 3]) # (1, 2, 3)
Особенности кортежей
# Неизменяемость
t = (1, 2, 3) # инициализация кортежа
# t[0] = 0 # TypeError!
# Но если внутри изменяемый объект — его можно изменить
t = (1, [2, 3]) # инициализация кортежа
t[1].append(4) # (1, [2, 3, 4]) — работает!
# Индексы и срезы — как у списков
t[0], t[-1], t[1:3]
# Методы
t.count(2) # подсчёт количества
t.index(3)
Распаковка кортежей
# Базовая распаковка
point = (10, 20) # инициализация кортежа
x, y = point # x=10, y=20
# Замена значений
a, b = b, a # swap!
# Звёздочка — остаток
first, *rest = (1, 2, 3, 4) # first=1, rest=[2,3,4]
first, *mid, last = (1,2,3,4) # first=1, mid=[2,3], last=4
# Возврат нескольких значений из функции
def min_max(lst):
return min(lst), max(lst) # возврат значения
low, high = min_max([3, 1, 4, 1, 5])
Именованные кортежи (namedtuple)
from collections import namedtuple # импорт специализированных коллекций
Point = namedtuple('Point', ['x', 'y']) # именованный кортеж
p = Point(10, 20) # присваивание
p.x # 10 (по имени)
p[0] # 10 (по индексу)
x, y = p
# С полями по умолчанию
Person = namedtuple('Person', ['name', 'age', 'city']) # именованный кортеж
p = Person('Анна', 30, 'Москва') # присваивание
# _asdict — в словарь
p._asdict() # {'name': 'Анна', 'age': 30, 'city': 'Москва'}
# _replace — новый экземпляр с изменением
p2 = p._replace(age=31) # присваивание
Когда использовать кортежи
- Неизменяемые данные — безопасность от случайных изменений
- Ключи словаря (списки нельзя)
- Группировка связанных значений
- Более эффективны по памяти, чем списки