Кортеж — это базовый тип данных Python. Важно понимать его и знать, как его использовать. Этот урок поможет вам в этом.
Кортежи Python используются для хранения упорядоченной последовательности значений. Кортежи неизменяемы, это означает, что значения в кортеже не могут быть изменены после определения кортежа. Значения в кортеже разделены запятыми и заключены в скобки.
Вы увидите несколько примеров, поясняющих, как можно использовать кортежи в своих программах и почему.
Давайте начнем исследовать мир кортежей!
Как создать кортеж в Python?
Чтобы создать новый кортеж, необходимо указать последовательность элементов, разделенных запятыми и заключенных в скобки.
Вот пример кортежа строк:
>>> values = ('value1', 'value2', 'value3')
Если при определении кортежа строк вы столкнулись с ошибкой EOL SyntaxError, убедитесь, что вы не пропустили ни одной кавычки.
>>> values = ('value1', 'value2', value3')
File "<stdin>", line 1
values = ('value1', 'value2', value3')
^
SyntaxError: EOL while scanning string literal
Вы также можете создать пустой кортеж с помощью функции tuple()
.
>>> values = tuple()
>>> print(values)
()
>>> print(type(values))
<class 'tuple'>
Как вы увидите в этом уроке, с пустым кортежем вы ничего не сможете сделать… 😀
Что такое кортеж в Python?
Кортеж — это тип данных Python, который можно использовать для хранения упорядоченных последовательностей, и он является неизменяемым.
Например, вы можете использовать кортеж для хранения названий стран.
>>> countries = ('Italy', 'United Kingdom', 'Russia', 'Poland', 'Spain')
Тот факт, что кортеж упорядочен, означает, что мы можем получить к нему доступ, используя индекс, который идет от нуля до размера кортежа минус один.
Извлечь первый элемент кортежа
>>> print(countries[0])
Italy
Извлечь последний элемент кортежа
>>> print(countries[len(countries)-1])
Spain
Обратите внимание, что в последнем примере мы использовали в качестве индекса len(countries) - 1
, где len()
— это функция, которая возвращает количество элементов в кортеже.
Может ли кортеж иметь отрицательный индекс?
В предыдущем разделе мы увидели, как использовать индексы для доступа к элементам в кортеже.
Также…
В Python возможен доступ к элементам кортежа с помощью отрицательных индексов.
Вот что произойдет, если я передам индекс -1 кортежу:
>>> countries = ('Italy', 'United Kingdom', 'Russia', 'Poland', 'Spain')
>>> print(countries[-1])
Spain
Индекс -1 в кортеже относится к последнему элементу кортежа.
При уменьшении значения отрицательного индекса вы перемещаетесь в кортеже справа налево, поэтому индекс -2 вернет строку «Польша» и т. д.
Что означает выход индекса за пределы диапазона для кортежа?
В предыдущих разделах мы увидели, как использовать положительные и отрицательные индексы для доступа к элементам кортежа.
Давайте посмотрим, что произойдет, если мы используем индексы, выходящие за границы кортежа.
>>> countries = ('Italy', 'United Kingdom', 'Russia', 'Poland', 'Spain')
Для этого кортежа максимально допустимый положительный индекс равен 4 и относится к последнему элементу.
Вот что произойдет, если мы используем индекс 5…
>>> print(countries[5])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
Нечто подобное применимо и к отрицательным индексам…
>>> print(countries[-6])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
Интерпретатор Python выдает исключение «индекс кортежа вне диапазона» при попытке доступа к элементу в кортеже с использованием положительного индекса, большего размера кортежа минус один. Та же ошибка возникает и при попытке доступа к элементу с использованием отрицательного индекса, меньшего размера кортежа.
Чтобы избежать ошибки «индекс вне диапазона», вы можете использовать следующий цикл Python for, который прозрачно обрабатывает индексы.
>>> for country in countries:
... print(country)
...
Italy
United Kingdom
Russia
Poland
Spain
Исключение «индекс вне диапазона» может возникнуть, если вы вручную измените индекс для доступа к элементам кортежа.
В этом случае вы можете внести ошибку в свой код, которая сгенерирует значение индекса за пределами допустимого диапазона.
Как использовать кортеж?
Кортеж хранит последовательность упорядоченных значений, к которым вы можете получить доступ во время выполнения вашей программы.
С кортежем можно делать множество вещей:
- Доступ к его элементам осуществляется напрямую с помощью индекса.
- Перебор кортежа с использованием цикла for.
- Извлечение части кортежа с помощью оператора среза.
- Передайте кортеж в функцию для дальнейших вычислений.
- Проверьте, присутствует ли определенное значение в кортеже.
Мы уже видели, как получить доступ к отдельным элементам с помощью индекса и как использовать цикл for для перебора элементов кортежа.
Вот как оператор среза применяется к кортежу.
>>> countries = ('Italy', 'United Kingdom', 'Russia', 'Poland', 'Spain')
Допустим, я хочу извлечь первый и второй элементы из кортежа. Оператор среза позволяет сделать это с помощью следующего синтаксиса:
tuple[start_index:stop_index]
Start_index включается в возвращаемый кортеж, а stop_index не включается.
Таким образом, чтобы получить первый и второй элементы из кортежа, мы будем использовать start_index = 0 и stop_index = 2.
>>> print(countries[0:2])
('Italy', 'United Kingdom')
Если опустить 0, то результат будет тот же:
>>> print(countries[:2])
('Italy', 'United Kingdom')
А чтобы получить все элементы после третьего (включительно), вы можете передать следующие параметры оператору среза.
>>> print(countries[2:])
('Russia', 'Poland', 'Spain')
Расширенный синтаксис оператора среза позволяет указать аргумент шага, позволяющий пропускать некоторые элементы.
tuple[start_index:stop_index:step]
Например, чтобы вывести каждый второй элемент кортежа, можно использовать следующее выражение.
>>> print(countries[::2])
('Italy', 'Russia', 'Spain')
Является ли кортеж изменяемым или неизменяемым?
Кортеж является неизменяемым, то есть после его создания в него нельзя добавлять новые элементы.
Определите кортеж, содержащий несколько языков:
>>> languages = ('Italian', 'English', 'Spanish', 'Polish')
Попробуйте обновить третий элемент этого кортежа…
>>> languages[2] = 'Russian'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
При этом вы получите исключение TypeError, которое говорит о том, что объект типа кортеж не поддерживает назначение элементов.
Примечание: мы передали индекс 2 для обновления третьего элемента кортежа, поскольку последовательности Python имеют нулевую индексацию (первый индекс равен 0).
Может ли кортеж иметь только один элемент?
Да, кортеж может иметь только один элемент. Это то, что вы называете 1-кортежем.
Вот как можно определить кортеж с 1 элементом.
>>> numbers = (1,)
>>> print(numbers)
(1,)
>>> print(type(numbers))
<class 'tuple'>
Поначалу этот синтаксис может показаться немного странным.
Теперь вы знаете, что когда вы видите скобки и одно значение, за которым следует запятая, это кортеж с одним элементом.
Доступ к элементу кортежа из 1 элемента можно получить, как обычно, используя индекс:
>>> print(numbers[0])
1
Попытка доступа к любому другому индексу вызовет исключение «индекс кортежа вне диапазона».
Что делает функция tuple()?
Как мы уже видели, функцию tuple()
можно использовать для создания нового пустого кортежа.
Давайте посмотрим, что произойдет, если применить tuple()
к структурам данных других типов.
Примените tuple()
к списку, чтобы преобразовать его в кортеж.
>>> numbers = [1, 2, 3, 4, 5]
>>> print(tuple(numbers))
(1, 2, 3, 4, 5)
Примените tuple()
к строке, чтобы преобразовать ее в кортеж символов.
>>> day = 'Monday'
>>> print(tuple(day))
('M', 'o', 'n', 'd', 'a', 'y')
Примените tuple()
к множеству, чтобы преобразовать его в кортеж.
>>> numbers = {1, 2, 3, 4, 5}
>>> print(type(numbers))
<class 'set'>
>>> print(tuple(numbers))
(1, 2, 3, 4, 5)
>>> print(type(tuple(numbers)))
<class 'tuple'>
Когда функция tuple()
применяется к словарю, она возвращает кортеж, содержащий ключи словаря.
>>> values = {'a':1, 'b':2}
>>> print(tuple(values))
('a', 'b')
Что такое вложенный кортеж?
Вложенный кортеж — это кортеж, содержащий другие кортежи.
Позвольте мне объяснить это на примере…
Следующий кортеж является примером вложенного кортежа, поскольку каждый элемент в кортеже также является кортежем.
>>> nested_values = ((1,2), (3, 4), (5, 6))
>>> print(type(nested_values))
<class 'tuple'>
>>> print(type(nested_values[0]))
<class 'tuple'>
В чем разница между кортежем и списком?
Основное различие между кортежем и списком в Python заключается в том, что кортеж неизменяем, а список изменяем.
Давайте посмотрим, что это означает на практике, определим список языков.
languages = ['Italian', 'English', 'Spanish', 'Polish']
А теперь обновим значение третьего элемента:
>>> languages[2] = 'Russian'
>>> print(languages)
['Italian', 'English', 'Russian', 'Polish']
Наш список был обновлен. Как мы уже видели, та же операция завершается неудачей для кортежа и вызывает исключение TypeError.
Теперь добавим новый элемент в список, используя метод списка append().
>>> languages.append('Spanish')
>>> print(languages)
['Italian', 'English', 'Russian', 'Polish', 'Spanish']
Мы добавили новый язык в конец списка.
Теперь преобразуем наш список в кортеж с помощью «функции» tuple().
>>> languages = tuple(languages)
>>> print(languages)
('Italian', 'English', 'Russian', 'Polish', 'Spanish')
>>> print(type(languages))
<class 'tuple'>
И вызовите метод append для кортежа, чтобы посмотреть, что произойдет.
>>> languages.append('French')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
У кортежа нет метода добавления, поскольку кортеж не может быть изменен (он неизменяемый).
По той же причине нельзя удалять элементы из кортежа.
Почему кортеж лучше списка?
Прежде всего нам необходимо прояснить сценарий, в котором мы хотим использовать кортеж, а не список.
Кортеж лучше списка, если вам нужно использовать последовательность, которую вы только читаете и никогда не обновляете в своей программе. В этом случае кортеж лучше, потому что, будучи неизменяемым, он требует меньше памяти, чем список. Это также делает кортеж быстрее списка, особенно если в нем огромное количество элементов.
Если вам нужна последовательность, требующая изменений во время выполнения вашей программы, то вместо кортежа следует использовать список.
Какой оператор можно использовать для проверки наличия элемента в кортеже?
Оператор in
проверяет, присутствует ли определенное значение в последовательности. Учитывая, что кортеж является последовательностью, оператор in также применяется к кортежам.
Определите кортеж языков…
>>> languages = ('Italian', 'English', 'Spanish', 'Polish')
Затем проверьте, есть ли в кортеже строка «Italian».
>>> 'Italian' in languages
True
Оператор in
в Python возвращает логическое значение, равное True
, если заданное значение присутствует в кортеже.
>>> 'Russian' in languages
False
Оператор Python in
возвращает логическое значение, равное False
, если заданное значение отсутствует в кортеже.
Вы можете использовать это в своих программах вместе с условными операторами.
>>> if 'Italian' in languages:
... print("Language detected")
...
Language detected
Как объединить два кортежа в Python
Если в вашей программе Python есть два или более кортежей, вы также можете захотеть объединить их, чтобы создать один кортеж.
>>> countries1 = ('Italy', 'United Kingdom')
>>> countries2 = ('Poland', 'Spain')
Для объединения двух кортежей можно использовать оператор +
.
>>> countries = countries1+countries2
>>> print(countries)
('Italy', 'United Kingdom', 'Poland', 'Spain')
>>> print(type(countries))
<class 'tuple'>
Как видите, результатом конкатенации по-прежнему является кортеж.
Какие типы кортежей можно создать?
Во всех рассмотренных до сих пор примерах мы работали с кортежами строк.
Вы также можете создавать кортежи, содержащие другие типы данных.
Например, кортеж целых чисел …
>>> numbers = (1, 3, 5, 67, 89)
Кортеж целых чисел и чисел с плавающей точкой …
>>> numbers = (1, 3.2, 5, 67.34, 89)
Кортеж логических значений …
>>> conditions = (True, False, False, True)
Кортеж списков …
>>> values = ([1, 2], [3, 4], [5, 6])
Кортеж словарей …
>>> values = ({'a':1}, {'b':2})
Какие еще типы кортежей вы могли бы создать?
Я предоставлю вам возможность поэкспериментировать.
Заключение
Мы рассмотрели все основы кортежей Python, и к настоящему моменту вы должны уметь использовать кортежи в своих приложениях.
Если у вас есть какие-либо сомнения по поводу затронутых нами тем, предлагаю вернуться к соответствующему разделу и попробовать написать код самостоятельно.
Удачного кодирования!