Прочитав это сообщение в блоге, вы узнаете:

  • Что такое тип данных кортежа в Python
  • Как инициализировать кортежи
  • Как перебирать кортежи
  • Общие операции последовательности над кортежами
  • Что такое распаковка кортежей
  • В чем разница между кортежами и списками

Вступление

Кортежи - это неизменяемые последовательности, обычно используемые для хранения коллекций разнородных данных (например, двухкортежных кортежей, созданных встроенной функцией enumerate()).

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

Объекты , значение которых может изменяться, считаются изменяемыми. Объекты, значение которых остается неизменным после их создания, называются неизменяемыми .

Если вам нужна дополнительная информация о последовательностях и неизменяемых объектах в Python, вы можете проверить мои предыдущие сообщения в блоге:

Кортежи похожи на списки. Они могут содержать несколько значений. Основное различие между списками и кортежами заключается в том, что кортежи неизменны, а списки - изменяемы.

Инициализация кортежей

В Python мы можем инициализировать кортеж несколькими способами

  • Использование пары круглых скобок для обозначения пустого кортежа: ()
  • Использование завершающей запятой для кортежа с одним значением: a, или (a,)
  • Разделение элементов запятыми: a, b, c или (a, b, c)
  • Использование встроенной функции tuple (): tuple() или tuple(iterable)

Круглые скобки необязательны, за исключением случая пустого кортежа или когда они необходимы во избежание синтаксической двусмысленности. Например, f(a, b) - это вызов функции с двумя аргументами, а f((a, b)) - это вызов функции с одним аргументом, переданным как кортеж из двух элементов.

Инициализация пустых кортежей

Выход:

<class 'tuple'>
<class 'tuple'>

()
()

Инициализация кортежей с одним значением

Выход:

<class 'tuple'>
<class 'tuple'>

('Python',)
('Data Science',)

Инициализация кортежей с несколькими значениями

Выход:

<class 'tuple'>
<class 'tuple'>

(1, 2, 3)
(1, 2, 3)

Инициализация кортежей из Iterables

Выход:

<class 'tuple'>
('Python', 'Maths', 'Machine Learning')

Итерировать по кортежам

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

Выход:

Pineapple
orange
banana
apple

Перечислить

Встроенная функция enumerate(iterable, start=0) в Python возвращает итератор. Когда мы перебираем этот итератор, он возвращает кортеж, содержащий счетчик (начинается с 0) и значения, полученные в результате итерации по iterable.

Выход:

0 Pineapple
1 orange
2 banana
3 apple

0 pandas
1 scikit-learn
2 seaborn

Общие последовательные операции

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

В этой таблице перечислены операции последовательности, отсортированные по возрастанию приоритета. В таблице s и t представляют собой последовательности одного типа, n, i, j и _18 _ - целые числа, а x - произвольный объект, отвечающий любым ограничениям типа и значения, налагаемым s.

Операции in и not in имеют тот же приоритет, что и операции сравнения. Операции + (конкатенация) и * (повторение) имеют тот же приоритет, что и соответствующие числовые операции.

Давайте посмотрим, как мы можем выполнять эти операции с кортежами.

в, а не в

Выход:

True
False

False
True

Конкатенация

Выход:

('Python', 'Web Development', 'Machine Learning', 'Communication', 'Courtesy', 'Flexibility', 'Integrity')

Умножение

Выход:

(['Communication', 'Courtesy'], ['Communication', 'Courtesy'], ['Communication', 'Courtesy'])

Это эквивалентно трехкратному добавлению soft_skills к самому себе. Однако будьте осторожны! элементы в soft_skills не копируются, на них ссылаются несколько раз. Посмотрим, что произойдет, если мы добавим значение к первому списку кортежа.

Выход:

(['Communication', 'Courtesy'], ['Communication', 'Courtesy'], ['Communication', 'Courtesy'])

(['Communication', 'Courtesy', 'Responsibility'], ['Communication', 'Courtesy', 'Responsibility'], ['Communication', 'Courtesy', 'Responsibility'])

Новая добавленная стоимость добавляется к трем спискам, потому что они ссылаются на один и тот же объект.

Индексирование

Выход:

Communication
Responsibility

Да, в Python мы можем использовать отрицательные индексы (мы можем получить последний элемент, используя -1 в качестве индекса). Когда мы используем отрицательный индекс, эта формула применяется для вычисления фактического индекса: len(sequence) + index.

В нашем случае длина равна 5, поэтому мы получаем элемент с индексом 5 — 1 = 4, и это элемент «Ответственность».

Нарезка

Мы можем использовать нарезку для выбора диапазона элементов в объекте последовательности. Синтаксис: sliceable[start_index:end_index:step].

  • start_index - это начальный индекс среза, элемент с этим индексом будет включен в результат, значение по умолчанию - 0.
  • end_index - это конечный индекс среза, элемент с этим индексом не будет включен в результат. Значение по умолчанию - len(sequence).
  • step - это величина, на которую увеличивается индекс,
    значение по умолчанию - 1. Если мы установим для шага отрицательное значение, мы переместимся назад.

Выход:

('Courtesy', 'Flexibility', 'Integrity')
('Communication', 'Courtesy', 'Flexibility', 'Integrity')
('Communication', 'Courtesy', 'Flexibility', 'Integrity', 'Responsibility')
('Communication', 'Flexibility', 'Responsibility')
('Responsibility', 'Integrity', 'Flexibility', 'Courtesy', 'Communication')

min, max и len

Мы можем использовать встроенные функции min(), max() и len(), чтобы получить максимальное значение, минимальные значения и длину последовательности.

Выход:

5
Communication
Responsibility

11
7
90

Индекс и подсчет

У нас есть методы index и count для кортежей. Мы можем использовать первый для определения индекса заданного значения, а второй - для определения того, сколько раз у нас есть это значение в нашем кортеже.

Выход:

1
--------------------------------------------------------------------
ValueError                         Traceback (most recent call last)
<ipython-input-21-f2447af847ce> in <module>()
      3 
      4 numbers = (10, 22, 53, 53, 8, 9, 11, 45, 90, 7, 26)
----> 5 print(numbers.index(100))

ValueError: tuple.index(x): x not in tuple

Мы видим, что если мы передадим значение, которого нет в нашем кортеже, мы получим ValueError.

Выход:

1
2

0

Если мы передадим значение, которого нет в нашем кортеже, метод count вернет 0. На этот раз ошибки нет.

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

Мы также можем «распаковать» значения из кортежа в переменные. Кроме того, более общий подход называется распаковкой последовательности, поэтому он будет работать для любой последовательности. Мы уже видели это на примере встроенной функции enumerate.

Выход:

10
20
30

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

Выход:

--------------------------------------------------------------------
ValueError                         Traceback (most recent call last)
<ipython-input-45-282b018b9602> in <module>()
----> 1 a, b = (10, 20, 30)

ValueError: too many values to unpack (expected 2)

Выход:

--------------------------------------------------------------------
ValueError                         Traceback (most recent call last)
<ipython-input-43-c91a3d9d3fc4> in <module>()
----> 1 a, b,c,d = (10, 20, 30)

ValueError: not enough values to unpack (expected 4, got 3)

Кортежи против списков

Как мы уже говорили ранее, основное различие между списками и кортежами состоит в том, что кортежи неизменны, а списки - изменяемы.

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

В отличие от списков, кортежи не имеют таких методов, как append(), insert(), remove(), pop() и extend() из-за их неизменяемой природы.

Выход:

['Flexibility', 'Courtesy', 'Flexibility', 'Integrity', 'Responsibility']
--------------------------------------------------------------------
TypeError                         Traceback (most recent call last)
<ipython-input-47-5d2973b1f2b4> in <module>()
      4 
      5 tuple_skills = ("Communication", "Courtesy", "Flexibility", "Integrity", "Responsibility")
----> 6 tuple_skills[0] = "Flexibility"

TypeError: 'tuple' object does not support item assignment

Дополнительные примечания из Документов

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

Источник: https://docs.python.org/3.7/tutorial/datastructures.html#tuples-and-sequences

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

  • Кортежи быстрее, чем списки. Если вам нужен постоянный набор значений, и все, что вам нужно делать с ним, - это перебирать его, используйте кортеж вместо списка.

Выход:

0.034131127635760095
0.11737610517116082

Библиотека timeit позволяет нам измерять прошедшее время в секундах. Мы ясно видим, что инициализация кортежей происходит быстрее, чем инициализация списка.

  • Кортежи, содержащие только неизменяемые значения, могут использоваться в качестве ключей для словаря, а списки - нет.

Выход:

Introducton
--------------------------------------------------------------------
TypeError                          Traceback (most recent call last)
<ipython-input-5-c18ababebf4d> in <module>()
      2 print(book[(1, 10)])
      3 
----> 4 book = {[1, 10]: "Introducton", [11, 15]: "Notation and Definitions", [16, 30]: "Fundamental Algorithms"}

TypeError: unhashable type: 'list'
  • Если наши кортежи содержат только неизменяемые объекты, мы можем использовать их , чтобы гарантировать, что наши данные не будут изменены.

Резюме

  • Кортежи - это неизменяемые последовательности, обычно используемые для хранения коллекций разнородных данных (например, двухкортежных кортежей, созданных встроенным enumerate()).
  • Основное различие между списками и кортежами заключается в том, что кортежи неизменны, а списки - изменяемы.
  • Мы можем инициализировать кортеж, используя пару круглых скобок () и значений внутри, разделенных запятыми.
  • Мы можем инициализировать кортеж, используя встроенную функцию tuple (iterable).
  • Мы можем перебирать кортежи, используя простой цикл for.
  • Мы можем выполнять обычные операции с последовательностью над кортежами, такие как индексирование, нарезка, конкатенация, умножение, получение min, max и т. д.
  • Мы можем распаковать значения из кортежа
  • Используйте кортеж вместо списка, когда вам нужен постоянный набор значений, и все, что вам нужно с ним делать, это перебирать его.

Новостная рассылка

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

LinkedIn

Вот мой профиль в LinkedIn на случай, если вы захотите связаться со мной. Я буду счастлив быть на связи с вами.

Заключительные слова

Спасибо за то, что прочитали. Надеюсь, статья вам понравилась. Если вам это нравится, пожалуйста, удерживайте кнопку хлопка и поделитесь ею с друзьями. Буду рад услышать ваш отзыв. Если у вас есть вопросы, не стесняйтесь их задавать. 😉

Ресурсы