- Что такое кортежи
- Как изменить кортеж
- Как работать с кортежами
- Кортежи и множественное присваивание
- Кортежи как аргументы функций
До этого момента мы встречались со строками, числами, булевыми значениями. Все это — простые типы данных, то есть они не включают в себя данные других типов.
Но часто в программировании приходится работать с несколькими типами данных одновременно. Именно поэтому во многих языках программирования есть составные типы — они могут включать в себя данные других типов.
Составные типы позволяют описывать сущности произвольной сложности, поэтому приносят много пользы. В этом уроке мы познакомимся с кортежем — одним из составных типов данных в Python.
Что такое кортежи
Кортеж (tuple) — это несколько значений, записанных через запятую. Вот несколько примеров:
rgb_colour = (255, 127, 64)
name_and_age = ("Bob", 42)
three_booleans = (True, False, True)
two_pairs_of_numbers = ((1, 2), (3, 4))
При этом кортеж может состоять всего из одного элемента:
number = (42,) # Ставим запятую, чтобы указать на кортеж
Обратите внимание на запятую — ее нужно ставить даже после единственного элемента кортежа.
А теперь посмотрим на пример без запятой. В этом случае Python подумает, что мы хотим вычислить значение арифметического выражения со скобками:
not_a_tuple = (42) # Запятой нет, поэтому Python не считает это кортежем
print(not_a_tuple) # 42
Такая запись кортежа тоже допускается, скобки указывать не обязательно:
also_tuple = 1, 2
print(also_tuple) # (1, 2)
Как изменить кортеж
Одна из особенностей кортежей в том, что это неизменяемый тип данных — то есть изменить кортеж после создания уже нельзя. Чтобы добавить новое значение, нужно создать новый кортеж.
При попытке изменить кортеж мы получим такую ошибку:
name_and_age = ("Bob", 42)
name_and_age[0] = "Alice"
# Traceback (most recent call last)
# TypeError: 'tuple' object does not support item assignment
name_and_age # ('Bob', 42)
Как работать с кортежами
Кортежи полезны, когда нужно вернуть сразу несколько значений. Возьмем для примера функцию, которая возвращает два значения одновременно: результат деления нацело и остаток от деления.
В коде это выглядит так:
def div_mod(a : int, b: int) -> tuple:
quotient = a // b
modulo = a % b
return (quotient, modulo)
print(div_mod(13, 4)) # (3, 1)
Как извлекать значения из кортежа
Выше мы научились создавать кортежи, а теперь попробуем извлекать значения из них. Для этого достаточно обратиться к элементу кортежа по индексу:
name_and_age = ("Bob", 42)
name_and_age[0] # 'Bob'
name_and_age[1] # 42
Также у кортежа есть длина, которую можно получить с помощью функции len()
:
number = (42,) # (42,)
len(number) # 1
pair = (1, 2) # (1, 2)
len(pair) # 2
Как разделить значения из кортежа
Часто кортежи содержат значения разных типов. Сложно запомнить, каким индексом обозначается каждое значение.
Чтобы упростить работу, можно разобрать кортеж:
name_and_age = ("Bob", 42)
(name, age) = name_and_age
name # 'Bob'
age # 42
Также этот процесс может называться деструктуризацией или распаковкой.
Таким же способом можно получать и сразу разбирать значения, которые возвращает функция:
(quotient, modulo) = div_mod(13, 4)
Соответственно, кортеж из одного элемента разбирается так:
(a,) = (42,)
a # 42
Если после имени переменной не поставить запятую, то синтаксической ошибки не будет, но в переменную a
кортеж запишется целиком — ничего не распакуется. Это логическая ошибка — мы получим не тот результат, который ожидали.
Кортежи и множественное присваивание
Кортежи легко собирать и разбирать, поэтому в Python удобно делать множественное присваивание. Смотрите:
(a, b, c) = (1, 2, 3)
a # 1
b # 2
c # 3
Используя множественное присваивание, можно обменять значения между двумя переменными. Так это выглядит:
a = 100
b = "foo"
(a, b) = (b, a)
a # 'foo'
b # 100
Кортежи как аргументы функций
Также кортежи можно передавать в качестве аргументов в функцию и разбирать уже внутри нее:
def print_person_info(person: tuple) -> None:
name, age = person # разбираем переданный кортеж
print(f"{name} is {age} years old")
person_tuple = ("John", 30)
print_person_info(person_tuple) # => John is 30 years old