Полное руководство по работе с кортежами (tuple) в языке Python
Кортеж (tuple) в Python
Кортеж - это неизменяемая последовательность элементов, которая используется для хранения упорядоченных данных. В отличие от списка, кортеж нельзя изменить после создания. Это обеспечивает целостность данных и позволяет использовать кортежи в качестве ключей словарей.
Самый простой способ создать кортеж - перечислить элементы в круглых скобках:
my_tuple = (1, 2, 3)
print(my_tuple[0]) # 1добавить в кортеж python (добавление элемента в кортеж в python)
Доступ к элементам осуществляется по индексу, как в списке. Попытка изменить элемент приведёт к ошибке:
my_tuple[0] = 10 # TypeError: 'tuple' object does not support item assignmentэлементы кортежа python (элементы кортежа в python)
Типичная ошибка:
Изменение кортежа. Решение: использовать список, если требуется изменяемость, или создать новый кортеж.Как преобразовать список или другую последовательность в кортеж?
Функция tuple() принимает любой итерируемый объект и возвращает кортеж:
my_list = [4, 5, 6]
new_tuple = tuple(my_list)
print(new_tuple) # (4, 5, 6)тип tuple python (тип tuple в python)
Возможная проблема:
Передача неитерируемого объекта (например, целого числа) вызываетTypeError. Решение: убедиться, что аргумент поддерживает итерацию.Как присвоить элементы кортежа отдельным переменным?
Распаковка кортежа позволяет присвоить каждое значение отдельной переменной:
coordinates = (10, 20)
x, y = coordinates
print(x, y) # 10 20Если количество переменных не совпадает с длиной кортежа, возникает ошибка. Для захвата остатка используется звёздочка:
a, *b = (1, 2, 3, 4)
print(a) # 1
print(b) # [2, 3, 4]Частая ошибка:
Несоответствие числа переменных и элементов. Решение: применить распаковку с* или проверить длину кортежа.Как создать кортеж с полями, доступными по имени?
Модуль collections предоставляет namedtuple - фабричный класс для создания подклассов кортежа с именованными полями:
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age'])
p = Person('Alice', 30)
print(p.name, p.age) # Alice 30Проблема:
Забытый импорт или неправильное имя класса. Решение: всегда импортироватьnamedtuple и проверять названия полей.В каких случаях кортеж предпочтительнее списка?
Кортежи занимают меньше памяти и работают быстрее при итерации. Они незаменимы, когда данные не должны изменяться (например, константы, ключи словаря, возвращаемые значения функций). Пример сравнения:
import sys
print(sys.getsizeof((1,2,3))) # меньше
print(sys.getsizeof([1,2,3])) # большеОшибка выбора:
Использование кортежа там, где нужна изменяемость. Решение: если данные планируется изменять, выбирать список.Какие встроенные методы есть у кортежа?
Кортеж имеет только два метода:
count(value)- возвращает количество вхождений значения.index(value, start, stop)- возвращает индекс первого вхождения.
t = (1, 2, 2, 3)
print(t.count(2)) # 2
print(t.index(3)) # 3Проблема:
Если значение отсутствует,index() вызывает ValueError. Решение: предварительная проверка value in t.Дополнительные примеры работы с кортежами.
Пустой кортеж:
empty = ()
print(empty) # ()()
Кортеж из одного элемента (обязательна запятая):
single = (42,)
print(type(single)) # <class 'tuple'><class 'tuple'>
Вложенные кортежи:
nested = (1, (2, 3), 4)
print(nested[1][0]) # 22
Срезы кортежа:
t = (0, 1, 2, 3, 4)
print(t[1:4]) # (1, 2, 3)
print(t[::-1]) # (4, 3, 2, 1, 0)(1, 2, 3) (4, 3, 2, 1, 0)
Конкатенация и повторение:
a = (1, 2)
b = (3, 4)
print(a + b) # (1, 2, 3, 4)
print(a * 3) # (1, 2, 1, 2, 1, 2)(1, 2, 3, 4) (1, 2, 1, 2, 1, 2)
Проверка вхождения:
print(2 in (1, 2, 3)) # TrueTrue
Лексикографическое сравнение кортежей:
print((1, 2) < (1, 3)) # True, так как второй элемент меньшеTrue
Использование кортежа в качестве ключа словаря:
d = {(1, 2): "value", (3, 4): "other"}
print(d[(1, 2)]) # "value"value
Возврат нескольких значений из функции (возвращается кортеж):
def min_max(numbers):
return min(numbers), max(numbers)
result = min_max([1, 5, 3])
print(result) # (1, 5)(1, 5)
Распаковка с остатком в цикле:
data = [(1, 2, 3), (4, 5, 6, 7)]
for first, *rest in data:
print(first, rest)1 [2, 3] 4 [5, 6, 7]
Преобразование кортежа в строку:
t = (10, 20, 30)
result = ', '.join(map(str, t))
print(result) # "10, 20, 30"10, 20, 30
Использование enumerate для получения пар индекс-значение (каждая пара - кортеж):
for item in enumerate(['a', 'b', 'c']):
print(item)(0, 'a') (1, 'b') (2, 'c')