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

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

Некоторыми примерами использования кортежей могут быть определение координат (x, y), совместное использование записей о сотрудниках, сохранение информации о книге в приложении библиотеки и т. Д.

Определение кортежа

Есть два способа определить кортеж. Давайте посмотрим на них по одному.

''' you can use commas to define tuple '''
>>> tuple1 = 1,2,3,4
>>> tuple1
(1, 2, 3, 4)

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

''' Second method is to use parenthesis '''
>>> tuple2 = (5,6,7,8)
>>> tuple2
(5, 6, 7, 8)

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

Теперь, как насчет определения кортежа с 0 или 1 объектом в нем. В этих случаях,

'''While defining singleton tuple, comma is required '''
>>> singleton = (1,)
>>> type(singleton)
<class 'tuple'>
>>> singleton = 1,
>>> type(singleton)
<class 'tuple'>
''' there is only one way to define an empty tuple '''
>>> empty_tuple = ()
>>> type(empty_tuple)
<class 'tuple'>

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



Подобно спискам, кортежи также предоставляют произвольный доступ, но не присваивания. Вы не можете изменить кортеж из-за его неизменяемости. Вы всегда можете взять кортеж и создать новый кортеж с его содержимым. Давайте посмотрим на это в действии.

''' Random access '''
>>> employee = ("Venkatesh", "Achintalwar", "Tech Lead", "New Delhi")
>>> print("First name of employee is "+ employee[0])
First name of employee is Venkatesh
>>> print("Employee address is "+ employee[3])
Employee address is New Delhi

''' trying to modify name (assignment) '''
>>> employee[0] = "Venky"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

''' create a new tuple using previous one '''

>>> updated_employee = ("Venky",) + employee[1:] #slicing
>>> updated_employee
('Venky', 'Achintalwar', 'Tech Lead', 'New Delhi')

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

››› dir (tuple1)

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__get'new' __gt__ ',' __hash__ ',' __init__ ',' __iter__ ',' __le__ ',' __len__ ',' __lt__ ',' __mul__ ',' __ne__ ',' __new__ ',' __reduce__ ',' __reduce_ex__ ',' __reduce_ex__ ',' __reduce_ex__ ' , '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

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



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

Рекомендации по использованию кортежей.

Использование кортежей при извлечении данных из таблиц.

Когда вы запрашиваете таблицу в MySQL, она возвращает запись, которая снова является кортежем. Иногда мы сохраняем поля в списке для будущего использования, где вы часто обращаетесь к этим значениям, а затем вместо того, чтобы поддерживать этот набор результатов в списке, сохраните его в кортеже. Это также экономит много места в случае больших данных.

''' check out the object size, when same data stored in different way '''
>>> employee = ("Venkatesh", "Achintalwar", "Tech Lead", "New Delhi")
>>> employee.__sizeof__()
56
>>> employee = ["Venkatesh", "Achintalwar", "Tech Lead", "New Delhi"]
>>> employee.__sizeof__()
72
>>>
'''Access time'''
Venkateshs-Air-436e:~ venkateshachintalwar$ python -m timeit "tuplex = (1,2,3,(4,5),('travel','blog') )" "i = tuplex[3]"
10000000 loops, best of 3: 0.0984 usec per loop
Venkateshs-Air-436e:~ venkateshachintalwar$ python -m timeit "listx= [1,2,3,(4,5),('travel','blog') ]" "i = listx[3]"
10000000 loops, best of 3: 0.162 usec per loop

Использование хэшируемого свойства кортежей

Чтобы узнать, что такое хеширование, нам сначала нужно понять, что такое хеширование?

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

Подробнее:



Итак, объект, который поддерживает функцию __hash __ (), является хешируемым. Хеширование ускоряет прохождение последовательности. Короче говоря, это экономит время при последовательном поиске каких-либо конкретных данных или индекса объекта. Вы можете не понять этого без примера, поэтому давайте рассмотрим пример.

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

Посмотрите разницу во времени при поиске индекса конкретного объекта в случае списка и кортежа

Venkateshs-Air-436e:~ venkateshachintalwar$ python -m timeit "tuplex = tuple('paramount')" "i = tuplex.index('t')"
1000000 loops, best of 3: 0.819 usec per loop
Venkateshs-Air-436e:~ venkateshachintalwar$ python -m timeit "listx = list('paramount')" "i = listx.index('t')"
1000000 loops, best of 3: 0.903 usec per loop
Venkateshs-Air-436e:~ venkateshachintalwar$

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

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

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

>>> employee = ("Venkatesh", "Achintalwar", "Tech Lead", "New Delhi")
>>> firstname, lastname, designation, city = employee
>>> print(firstname +" " +lastname + " is a " +designation + " and lives in "+ city + "." )
Venkatesh Achintalwar is a Tech Lead and lives in New Delhi.
'''This way you can assign values of a resultset to the variables in one line.'''

Распространенные ошибки при использовании кортежей

Очевидно, первым будет:

Преобразование набора результатов MySQL в список.

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

Использование изменяемых объектов в кортеже.

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

>>> mutable_tuple = (1,2,3,[4,5],{'travel':'blog'} )
>>> mutable_tuple[3][1]=9
>>> mutable_tuple
(1, 2, 3, [4, 9], {'travel': 'blog'})
>>> mutable_tuple[4]['travel']='expense'
>>> mutable_tuple
(1, 2, 3, [4, 9], {'travel': 'expense'})

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

'''Mutable tuple'''
Venkateshs-Air-436e:~ venkateshachintalwar$ python -m timeit "mutable_tuple = (1,2,3,[4,5],{'travel':'blog'} )" "i = mutable_tuple.index(3)"
1000000 loops, best of 3: 0.48 usec per loop
'''Loss of hashing'''
>>> mutable_tuple = (1,2,3,[4,5],{'travel':'blog'} )
>>> mutable_tuple.__hash__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
'''Immutable tuple'''
Venkateshs-Air-436e:~ venkateshachintalwar$ python -m timeit "mutable_tuple = (1,2,3,(4,5),('travel','blog') )" "i = mutable_tuple.index(3)"
1000000 loops, best of 3: 0.302 usec per loop
>>> mutable_tuple = (1,2,3,(4,5),('travel','blog') )
>>> mutable_tuple.__hash__()
-515400538763907773
Venkateshs-Air-436e:~ venkateshachintalwar$

Когда кортежи теряют неизменяемость, это почти дает производительность списка.

''' Same data in list '''
Venkateshs-Air-436e:~ venkateshachintalwar$ python -m timeit "mutable_tuple = [1,2,3,(4,5),('travel','blog') ]" "i = mutable_tuple.index(3)"
1000000 loops, best of 3: 0.409 usec per loop

Так что помните об этих моментах при работе с кортежами. На данный момент хватит о кортежах. В случае, если вы сочтете какое-либо объяснение сомнительным, вы всегда можете обратиться ко мне за объяснением. Продолжайте читать, пока…