2.8. Кортежі

Кортеж — це незмінна, впорядкована послідовність значень. Після створення елементи всередині не можна додавати, видаляти чи змінювати.

2.8.1. Створення кортежів

Для створення кортежу використовуйте дужки (або просто коми):

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. Особливість одноелементного кортежу

Дужки навколо значення — це просто дужки; саме кома робить кортеж. Одноелементний кортеж потребує замикаючої коми:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. Довжина, індексування та зрізи

Те саме, що й для списків і рядків — len(), індексування, зрізи, in і + / * — все працює однаково:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. Незмінність

Кортежі не мають append, pop, sort чи будь-яких інших методів, що змінюють об’єкт на місці. Присвоєння за індексом викидає TypeError:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

Щоб «змінити» кортеж, створіть новий із зміненими значеннями.

2.8.4. Розпаковування

Головна перевага кортежу — розпаковування: присвоєння кожного елемента окремій змінній в одному виразі.

A three-element tuple (1, 2, 3) unpacking into three named variables x, y, z.

Розпаковування прив’язує кожен елемент кортежу до окремої змінної в одному присвоєнні.

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

Права частина може бути будь-яким ітерованим об’єктом — список, рядок, значення, повернуте функцією:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

Зірочка на початку * збирає «решту» розпаковування в список:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. Кілька значень, що повертаються

Функція може повернути кортеж для передачі кількох значень одразу; тоді виклик розпаковує їх під час отримання:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

Дужки навколо return є необов’язковими — голе return a, b також є кортежем.

2.8.6. Кортеж vs список

Практичний посібник для вибору між ними:

  • Кортеж для даних фіксованої форми, часто різнорідних: точки (x, y), кольори (r, g, b), кілька значень, що повертаються, аргументи функцій, запаковані для подальшого використання.

  • Список для даних змінної довжини, часто однорідних: список вимірювань, черга елементів для обробки, все те, до чого ви очікуєте додавати елементи.

Кортежі також є хешованими (за умови, що кожен елемент всередині є хешованим), тому їх можна використовувати як ключі в dict.