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