Прочитав это сообщение в блоге, вы узнаете:
- Что такое тип данных кортежа в Python
- Как инициализировать кортежи
- Как перебирать кортежи
- Общие операции последовательности над кортежами
- Что такое распаковка кортежей
- В чем разница между кортежами и списками
Вступление
Кортежи - это неизменяемые последовательности, обычно используемые для хранения коллекций разнородных данных (например, двухкортежных кортежей, созданных встроенной функцией
enumerate()
).
Последовательности - очень распространенный тип итерации. Некоторыми примерами встроенных типов последовательности являются списки, строки и кортежи. Они поддерживают эффективный доступ к элементам с использованием целочисленных индексов и определяют метод, который возвращает длину последовательности.
Объекты , значение которых может изменяться, считаются изменяемыми. Объекты, значение которых остается неизменным после их создания, называются неизменяемыми strong. >.
Если вам нужна дополнительная информация о последовательностях и неизменяемых объектах в Python, вы можете проверить мои предыдущие сообщения в блоге:
- Основы Python: итерация, итераторы, итераторы и циклы
- Основы 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 на случай, если вы захотите связаться со мной. Я буду счастлив быть на связи с вами.
Заключительные слова
Спасибо за то, что прочитали. Надеюсь, статья вам понравилась. Если вам это нравится, пожалуйста, удерживайте кнопку хлопка и поделитесь ею с друзьями. Буду рад услышать ваш отзыв. Если у вас есть вопросы, не стесняйтесь их задавать. 😉
Ресурсы
- Https://www.datacamp.com/community/tutorials/python-tuples-tutorial
- Https://www.tutorialspoint.com/python/python_tuples.htm
- Https://stackoverflow.com/questions/1708510/python-list-vs-tuple-when-to-use-each
- Https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences
- Https://docs.python.org/3/library/stdtypes.html#tuples
- Https://docs.python.org/3.7/library/stdtypes.html#common-sequence-operations