Кортежи в Python: пошаговое руководство с примерами

Работая с коллекциями данных, мы иногда сталкиваемся с ситуациями, когда хочется обеспечить невозможность изменения последовательности объектов после их создания.

Например, при чтении данных из базы данных в Python мы можем представить каждую запись таблицы как упорядоченную и неизменяемую последовательность объектов, поскольку нам не требуется в дальнейшем ее менять. Python имеет встроенный тип данных для хранения последовательностей в неизменном виде. Этот тип называется кортеж.

После прочтения данной статьи вы будете знать:

  • как работают кортежи в Python;
  • разница между кортежами и списками в Python;
  • основы применения кортежей;

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

Итак, давайте погрузимся в нашу тему!

Что такое кортежи в Python?

Кортеж представляет собой последовательность любых объектов, разделенных запятыми и jh rolex day date m118348 0042 rolex calibre 2836 2813 mens 12mm заключенных в круглые скобки. Кортеж — это неизменяемый объект, то есть его нельзя изменить, и мы используем его для представления фиксированных коллекций элементов.

Давайте взглянем на некоторые примеры кортежей в Python:

  • () — пустой кортеж;
  • (1.0, 9.9, 10) — кортеж, содержащий три числовых объекта;
  • ('Casey', 'Darin', 'Bella', 'Mehdi') — кортеж, содержащий четыре строковых объекта;
  • ('10', 101, True) — кортеж, содержащий строку, целое число и логический объект;

Кроме того, другие объекты, такие как списки и те же кортежи, могут также входить в кортеж, например:

a_tuple = (0, [1, 2, 3], (4, 5, 6), 7.0)

print(a_tuple)
print(type(a_tuple))

# Результат:
# (0, [1, 2, 3], (4, 5, 6), 7.0)
# <class 'tuple'>

Приведенный выше код создает кортеж, содержащий целое число, список, кортеж и число с плавающей запятой. Последующий код выводит на экран весь этот кортеж и его тип данных.

Однако ('A') не является кортежем. Давайте посмотрим на его тип данных:

print(type(('A')))

# Результат:
# <class 'str'>

Как же тогда нам создать кортеж с одним элементом? Ответ лежит на поверхности. Нам нужно добавить дополнительную запятую непосредственно перед закрывающей скобкой, например: ('A',).

Запятая в конце как раз означает, что в круглых скобках содержится кортеж с одним значением.

Использование индексов и срезов в кортежах

Как упоминалось ранее, поскольку кортеж представляет собой последовательность объектов, мы можем получить доступ к этим объектам посредством индексации. Как и в случае со строками, индекс первого элемента равен 0, второго элемента — 1 и так далее. Давайте попробуем проиндексировать кортеж:

print('The first element:', a_tuple[0])
print('The last element:', a_tuple[-1])
print('The data type of the second element:', type(a_tuple[1]))

# Результат:
# The first element: 0
# The last element: 7.0
# The data type of the second element: <class 'list'>

В приведенном выше коде первая и вторая инструкции возвращают значения первого и последнего элементов кортежа. А последняя – тип данных второго элемента кортежа, который является объектом типа список.

Кроме того, следующий фрагмент кода показывает, как получить второй элемент внутреннего кортежа (третий элемент основного, внешнего кортежа) по индексу 2.

print(a_tuple[2][1])

# Результат:
# 5

Это означает, что мы можем получить доступ к элементу, хранящемуся во внутреннем кортеже (кортеже, хранящемуся внутри другого кортежа), выполнив ряд операций индексирования.

Получить срез кортежа также просто, как произвести подобную операцию со строкой или со списком. Чтобы получить диапазон элементов в кортеже, мы можем указать диапазон индексов для извлечения из исходного кортежа, выбрав, где начинать (включая начальный элемент) и заканчивать (исключая последний элемент) требуемый диапазон.

Давайте рассмотрим несколько примеров:

num_tuple = 2, 4, 5, 7, 8, 10
print(num_tuple[:3])
print(num_tuple[4:])
print(num_tuple[-3:])
print(num_tuple[2:5])

# Результат:
# (2, 4, 5)
# (8, 10)
# (7, 8, 10)
# (5, 7, 8)

Первая строка кода объявляет кортеж целочисленных значений. Это еще один способ объявить кортеж, представив последовательность объектов, разделенных запятыми, не заключая их в круглые скобки. Хотя это и выглядит несколько необычно. Последующие инструкции выводят разные фрагменты кортежа, как это и видно из результатов.

Аналогично строкам, чтобы объединить два или более кортежей, мы можем использовать знак +. Например, следующий код объединяет два кортежа:

tuple_1 = (1, 2)
tuple_2 = (3, 4)
print(tuple_1 + tuple_2)

# Результат:
# (1, 2, 3, 4)

Более того, умножение кортежа на целое число n дает кортеж, содержащий исходный кортеж, повторяющийся n раз. Давай попробуем:

my_tuple = (1, 7, 9, 8)
print(my_tuple * 2)

# Результат:
# (1, 7, 9, 8, 1, 7, 9, 8)

Применение функции zip() к кортежам

Функция zip() может принимать несколько последовательностей, а возвращает один итерируемый объект, в котором элементы последовательностей сопоставлены друг с другом. Чтобы это лучше понять, давайте рассмотрим следующий пример.

Предположим, что у нас есть три разных кортежа, содержащие личные данные четырех клиентов. Мы хотим создать один кортеж, содержащий соответствующие данные для каждого клиента, включая их имя, фамилию и возраст, в виде отдельных кортежей:

first_names = ('Simon', 'Sarah', 'Mehdi', 'Fatime')
last_names = ('Sinek', 'Smith', 'Lotfinejad', 'Lopes')
ages = (49, 55, 39, 33)
zipped = zip(first_names, last_names,ages)
print(zipped)

# Результат:
# (<zip object at 0x7eff60160540>

В приведенном выше код объявлены кортежи first_name, last_name и ages. Функция zip() принимает три кортежа и возвращает объект типа zip, который является итератором. Чтобы использовать объект итератора, нам нужно преобразовать его либо в список, либо в кортеж, например:

customers = tuple(zipped)
print(customers)

# Результат:
# (('Simon', 'Sinek', 49), ('Sarah', 'Smith', 55), ('Mehdi', 'Lotfinejad', 39), ('Fatime', 'Lopes', 33))

Кортеж customers состоит из четырех кортежей, каждый из которых содержит данные конкретного клиента.

Распаковка кортежей

Распаковка кортежа позволяет нам извлечь элементы кортежа и присвоить их определенным переменным. Давай попробуем:

first_name, last_name, age = customers[2]
print(first_name, last_name, ',', age, 'years old')

# Результат:
# Mehdi Lotfinejad , 39 years old

Приведенный выше код извлекает элементы внутреннего кортежа, хранящегося под индексом 2 кортежа customers, и присваивает их переменным first_name, last_name и age.

Разница между кортежами и списками в Python

Помимо интуитивной разницы между кортежами и списками, как упоминалось ранее, кортежи неизменяемы. Это означает, что, в отличие от списков, кортежи не могут быть изменены. Также некоторые технические моменты делают кортежи более предпочтительными для определенных задач. И, напротив, у списков тоже есть свои преимущества.

Первое отличие, которое делает списки более предпочтительными итерируемыми объектами, чем кортежи, заключается в том, что объект типа список предоставляет больше встроенных методов. Но дополнительная функциональность имеет свою цену. Давайте сначала посмотрим на размер занимаемой памяти каждого объекта в приведенном ниже коде, а затем обсудим, почему кортежи являются лучшим выбором в некоторых ситуациях.

import sys

a_list = ['abc', 'xyz', 123, 231, 13.31, 0.1312]
a_tuple = ('abc', 'xyz', 123, 231, 13.31, 0.1312)
print('The list size:', sys.getsizeof(a_list), 'bytes')
print('The tuple size:', sys.getsizeof(a_tuple), 'bytes')

# Результат:
# The list size: 104 Bytes
# The tuple size: 88 Bytes

Мы видим, что объект списка занимает больше памяти, чем объект кортежа. Значение занимаемого объема памяти становится более очевидным, когда мы работаем с большими данными, а это означает, что неизменность обеспечивает значительную оптимизацию при работе с большим объемом данных. Помимо того, что они занимают меньше памяти, обработка объектов типа кортеж происходит намного быстрее, чем списков, особенно при работе с миллионами и миллионами объектов-последовательностей.

Использование кортежей в Python

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

Замена элементов кортежа

Мы можем использовать кортежи для замены значений, связанных с переменными, только если сами переменные являются элементами кортежа. Давайте попробуем:

x = 19
y = 91
print('Before swapping:')
print(f'x = {x}, y = {y}')
(x, y) = (y, x)
print('After swapping:')
print(f'x = {x}, y = {y}')

# Результат:
# Before swapping:
# x = 19, y = 91
# After swapping:
# x = 91, y = 19

Значение y присваивается переменной x, а значение x одновременно присваивается переменной y. Это наиболее питонический способ замены значений.

Возврат более чем одного значения из функции

Функции могут возвращать только одно значение. Однако мы можем использовать кортеж и поместить в него столько значений, сколько нам нужно, а затем вернуть объект кортежа в качестве возвращаемого значения функции. Давайте посмотрим, как мы можем использовать кортеж для возврата нескольких значений из функции в следующем коде:

def sum_and_avg(x, y, z):
    s = x + y + z
    a = s / 3
    return(s, a)

(S, A) = sum_and_avg(3, 8, 5)
print('Sum =', S)
print('Avg =', A)

# Результат:
# Sum = 16
# Avg = 5.333333333333333

Функция sum_and_avg() вычисляет сумму и среднее значение трех числовых значений. Функция возвращает s и a, два значения, которые она вычисляет внутри себя. Но по сути функция возвращает только одно значение, которое представляет собой объект типа кортеж, содержащий несколько значений. Мы также использовали метод распаковки кортежа, чтобы извлечь значения из возвращенного объекта кортежа, а затем вывести их на экран.

Заключение

В этой статье было рассмотрено, как создавать объекты типа кортеж, а также многие другие аспекты работы с кортежами в Python. Такие как индексация, нарезка, архивирование, распаковка и т. д. Мы также обсудили разницу между кортежами и списками. Правильное использование кортежей Python определенно сделает наш код более эффективным и надежным.

Перевод статьи Python Tuples: A Step-by-Step Tutorial (with 14 Code Examples).

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll to Top