Зарегистрируйтесь, чтобы продолжить обучение

Кортежи Основы Python

До этого момента мы встречались со строками, числами, булевыми значениями. Все это — простые типы данных, то есть они не включают в себя данные других типов.

Но часто в программировании приходится работать с несколькими типами данных одновременно. Именно поэтому во многих языках программирования есть составные типы — они могут включать в себя данные других типов.

Составные типы позволяют описывать сущности произвольной сложности, поэтому приносят много пользы. В этом уроке мы познакомимся с кортежем — одним из составных типов данных в 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

Дополнительные материалы

  1. Документация Python - кортежи

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff