Типы данных: кортежи (tuple) в языке Python
Кортеж (tuple) в Python: неизменяемая последовательность
Кортеж - это упорядоченный набор элементов, который, в отличие от списка, нельзя изменить после создания. Это свойство делает кортежи хэшируемыми, что позволяет использовать их в качестве ключей словаря и элементов множества. Кортежи часто применяются для хранения разнородных данных, которые не должны меняться, и для возврата нескольких значений из функции.
Самый распространенный способ создать кортеж - использовать круглые скобки и перечислить элементы через запятую:
coordinates = (55.7558, 37.6176) # широта и долгота Москвы
print(coordinates) # (55.7558, 37.6176)Python set list (set и list в python: различия и использование)
Доступ к элементам выполняется по индексу, начиная с 0:
print(coordinates[0]) # 55.7558
print(coordinates[-1]) # 37.6176Python пары значений (пары значений в python)
Попытка изменить элемент приведет к ошибке TypeError: 'tuple' object does not support item assignment.
# coordinates[0] = 55.0 # TypeError!
Python object get (метод get для объектов в python)
Главное преимущество кортежей перед списками - их неизменяемость. Это делает код более безопасным, когда нужно гарантировать, что данные не будут случайно изменены. Кортежи занимают меньше памяти и выполняются быстрее при итерации.
Как создать кортеж разными способами?
Кортеж можно создать без скобок, достаточно разделить элементы запятыми:
a = 1, 2, 3 # (1, 2, 3)
b = 'a', 'b' # ('a', 'b')Python get keys (метод get для словарей в python)
Для создания кортежа из одного элемента необходимо поставить запятую:
single = (5,) # (5,)
not_tuple = (5) # 5, число, не кортежGet index python (метод index в python)
Функция tuple() преобразует итерируемый объект в кортеж:
lst = [1, 2, 3]
print(tuple(lst)) # (1, 2, 3)Python get methods (методы get в python)
Как получить доступ к элементам кортежа и их срезы?
Индексация работает так же, как у списков. Срезы возвращают новый кортеж:
t = (0, 1, 2, 3, 4)
print(t[1:3]) # (1, 2)
print(t[:2]) # (0, 1)
print(t[::2]) # (0, 2, 4)Python длина списка (длина списка и массива в python)
Если индекс выходит за границы, возникает IndexError.
Как выполнить распаковку кортежа?
Распаковка (unpacking) позволяет присвоить элементы кортежа переменным:
point = (10, 20)
x, y = point
print(x, y) # 10 20словарь данных python (словарь данных в python)
Можно использовать символ * для захвата оставшихся элементов:
a, *rest = (1, 2, 3, 4)
print(a) # 1
print(rest) # [2, 3, 4]типы данных python кортеж (кортеж (tuple) в python)
Для игнорирования ненужных значений применяется подчеркивание _:
_, second, _ = (1, 2, 3)
print(second) # 2Python типы данных set (множество (set) в python)
Как использовать кортеж в качестве ключа словаря?
Кортежи могут быть ключами, если все их элементы хэшируемы:
locations = {
(55.76, 37.62): 'Москва',
(48.86, 2.35): 'Париж'
}
print(locations[(55.76, 37.62)]) # МоскваСписок в качестве ключа использовать нельзя, потому что списки изменяемы и не хэшируются.
Как вернуть несколько значений из функции с помощью кортежа?
Функция может возвращать кортеж, который затем распаковывается:
def min_max(lst):
return min(lst), max(lst)
result = min_max([3, 1, 4, 1, 5])
print(result) # (1, 5)
low, high = min_max([3, 1, 4, 1, 5])
print(low, high) # 1 5Это удобнее, чем возвращать список, когда данные не должны изменяться.
Как использовать именованные кортежи (namedtuple)?
Именованные кортежи (collections.namedtuple) позволяют обращаться к полям по имени:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p.x, p.y) # 3 4
print(p[0], p[1]) # 3 4 (индексация тоже работает)Это дает читаемость кода и неизменяемость.
Дополнительные примеры работы с кортежами
Кортеж как неизменяемый список
Если данные не должны меняться, кортеж предпочтительнее списка. Пример: конфигурационные параметры.
config = ('localhost', 8080, True)
host, port, debug = config
print(host, port, debug) # localhost 8080 Truelocalhost 8080 True
Сравнение кортежей
Кортежи сравниваются поэлементно слева направо.
a = (1, 2, 3)
b = (1, 2, 4)
print(a < b) # True (3 < 4)
print(a == (1, 2, 3)) # TrueTrue True
Использование кортежей в множествах
Кортежи могут быть элементами множества, если они хэшируемы.
set_of_tuples = {(1, 2), (3, 4), (1, 2)}
print(set_of_tuples) # {(1, 2), (3, 4)}{(1, 2), (3, 4)}Кортеж с изменяемыми элементами (список внутри кортежа)
Сам кортеж неизменяем, но если элемент кортежа изменяем, его можно изменить.
t = (1, [2, 3], 4)
t[1].append(5)
print(t) # (1, [2, 3, 5], 4)(1, [2, 3, 5], 4)
Нельзя заменить сам список на другой объект, но содержимое списка меняется.
Методы кортежей: count и index
Кортеж поддерживает только два метода.
t = (1, 2, 2, 3, 2)
print(t.count(2)) # 3
print(t.index(3)) # 3 (первое вхождение)3 3
Преобразование кортежа в список и обратно
t = (1, 2, 3)
lst = list(t)
lst.append(4)
new_t = tuple(lst)
print(new_t) # (1, 2, 3, 4)(1, 2, 3, 4)
Производительность: кортеж быстрее списка при итерации
import timeit
setup = 'a = tuple(range(1000)); b = list(range(1000))'
print(timeit.timeit('for x in a: pass', setup, number=100000))
print(timeit.timeit('for x in b: pass', setup, number=100000))0.345 0.456
Кортеж обычно быстрее, хотя разница может быть незначительной.
Именованные кортежи с методами и _replace
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age', 'city'])
p = Person('Alice', 30, 'Moscow')
print(p._fields) # ('name', 'age', 'city')
p_new = p._replace(age=31)
print(p_new) # Person(name='Alice', age=31, city='Moscow')
print(p) # оригинал не изменился('name', 'age', 'city')
Person(name='Alice', age=31, city='Moscow')
Person(name='Alice', age=30, city='Moscow')