Справочник Python

Полное руководство по языку на русском

Кортежи

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

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)  # присваивание

Когда использовать кортежи

  • Неизменяемые данные — безопасность от случайных изменений
  • Ключи словаря (списки нельзя)
  • Группировка связанных значений
  • Более эффективны по памяти, чем списки