Содержание:развернуть
- Примеры кортежей
- Зачем использовать кортеж вместо списка?
- Работа с кортежами
-
Создание
-
Упаковка
-
Распаковка
-
Обращение к элементу и поиск в кортеже
-
Сравнение
-
Перебор
-
Сортировка
-
Удаление
- Методы и особые операции
-
Срез
-
Длина кортежа
-
Конкатенация
-
Повторение
-
Индекс заданного элемента
-
Число вхождений элемента
- Преобразование
-
tuple → str
-
tuple → list
-
tuple → dict
- Именованные кортежи
- Tuple index out of range
Кортеж (tuple) — ещё один вид последовательностей в Python.
По своей природе они очень схожи со списками, но, в отличие от последних, являются неизменяемыми.
# кортеж
immutable_tuple = (4, 5, 6)
immutable_tuple[0] = 404
>
Traceback (most recent call last):
immutable_tuple[0] = 404
TypeError: 'tuple' object does not support item assignment# список
mutable_list = [7, 8, 9]
mutable_list[0] = 1
print(mutable_list)
> [1, 8, 9]
Как видно, в литеральной форме кортеж python 3 записывается в виде последовательности элементов в круглых скобках, в то время как для списков характерны квадратные.
👉 Некоторые особенности кортежей:
- они упорядочены по позициям;
- tuple могут хранить и содержать внутри себя объекты любых типов (и даже составных);
- доступ к элементам происходит по смещению, а не по ключу;
- в рамках этой структуры данных определены все операции, основанные на применении смещения (индексирование, срез);
- кортежи поддерживают неограниченное количество уровней вложенности;
- кортежи хранят указатели на другие объекты, а значит их можно представлять, как массивы ссылок;
- они позволяют очень просто менять местами значения двух переменных.
x = 100
y = 200
x, y = y, x
print(x)
> 200
print(y)
> 100
Примеры кортежей
# пустой кортеж
empty_tuple = ()
# кортеж из 4-х элементов разных типов
four_el_tuple = (36.6, 'Normal', None, False)
# пример tuple, что содержит вложенные элементы
nested_elem_tuple = (('one', 'two'), ['three', 'four'], {'five': 'six'}, (('seven', 'eight'), ('nine', 'ten')))
print(nested_elem_tuple)
> (('one', 'two'), ['three', 'four'], {'five': 'six'}, (('seven', 'eight'), ('nine', 'ten')))
Зачем использовать кортеж вместо списка?
Тем, кто уже успел познакомиться со списками в Python, может показаться не очевидным смысл использования кортежей. Ведь фактически, списки могут делать всё то же самое и даже больше. Это вполне естественный вопрос, но, разумеется, у создателей языка найдётся на него ответ:
- Неизменяемость — именно это свойство кортежей, порой, может выгодно отличать их от списков.
- Скорость — кортежи быстрее работают. По причине неизменяемости кортежи хранятся в памяти особым образом, поэтому операции с их элементами выполняются заведомо быстрее, чем с компонентами списка.
- Безопасность — неизменяемость также позволяет им быть идеальными кандидатами на роль констант. Константы, заданные кортежами, позволяют сделать код более читаемым и безопасным.
- Использование tuple в других структурах данных — кортежи применимы в отдельных структурах данных, от которых python требует неизменяемых значений. Например ключи словарей (dicts) должны состоять исключительно из данных immutable-типа.
💡 Кроме того, кортежи удобно использовать, когда необходимо вернуть из функции несколько значений:
def get_status(service_name):
return None, f"service {service_name} is OK!"
print(type(get_status('nginx')))
> <class 'tuple'>
error, message = get_status('nginx')
print(error)
print(message)
> None
> service nginx is OK!
Работа с кортежами
Создание
Как и другие коллекции языка Питон, кортеж можно создать двумя способами.
Способ №1: Литеральное объявление:
literal_creation = ('any', 'object')
print(literal_creation)
> ('any', 'object')
print(type(literal_creation))
> <class 'tuple'>
Способ №2: Через функцию tuple()
:
tuple_creation = tuple('any iterable object')
print(tuple_creation)
> ('a', 'n', 'y', ' ', 'i', 't', 'e', 'r', 'a', 'b', 'l', 'e', ' ', 'o', 'b', 'j', 'e', 'c', 't')
print(type(tuple_creation))
> <class 'tuple'>
💁♀️ Важно, чтобы аргумент, передаваемый в tuple()
был итерируемым объектом:
incorrect_creation = tuple(777)
>
Traceback (most recent call last):
incorrect_creation = tuple(777)
TypeError: 'int' object is not iterable
Упаковка
Упаковкой кортежа называют присваивание его какой-то переменной, что, по сути, совпадает с операцией объявления.
Стоит обратить внимание 2 момента:
- Выражения
some_tuple = (11, 12, 13)
иsome_tuple = 11, 12, 13
тождественны. - Для объявления кортежа, включающего один единственный элемент, нужно использовать завершающую запятую:
is_tuple = ('a',)
is_tuple_too = 'b',
not_a_tuple = 'c'
print(type(is_tuple))
print(type(is_tuple_too))
print(type(not_a_tuple))
> <class 'tuple'>
> <class 'tuple'>
> <class 'str'>
Распаковка
Обратная операция, смысл которой в том, чтобы присвоить значения элементов кортежа отдельным переменным.
notes = ('Do', 'Re', 'Mi', 'Fa', 'Sol', 'La', 'Si')
do, re, mi, fa, sol, la, si = notes
print(mi)
> Mi
Количество переменных должно совпадать с числом элементов tuple
Однако, если необходимо получить лишь какие-то отдельные значения, то в качестве “ненужных” переменных позволено использовать символ нижнего подчеркивания “_“:
night_sky = 'Moon', 'Stars'
moon, _ = night_sky
print(moon)
> Moon
Обращение к элементу и поиск в кортеже
Обратиться к элементу кортежа можно по номеру его позиции. Причём как с начала, так и с конца:
# Mike - [0], Leo - [1], Don - [2], Raph - [3]
turtles = ('Mike', 'Leo', 'Don', 'Raph')
# Mike - [-4], Leo - [-3], Don - [-2], Raph - [-1]
print(turtles[1])
print(turtles[-2])
print(turtles[2] == turtles[-2])
> Leo
> Don
> True
Если элемент кортежа есть вложенный кортеж, то применяются дополнительные квадратные скобки (в зависимости от уровня вложенности). Например, чтобы обратиться ко второму элементу второго элемента, следует поступить так:
input_box = ('firstbox', (15, 150))
# помним про индексацию, ведущую своё начало с 0
print(input_box[1][1])
> 150
Узнать, присутствует ли объект среди элементов кортежа, можно с помощью оператора in:
song = ('Roses', 'are', 'Red')
print('Red' in song)
print('Violet' in song)
> True
> False
Сравнение
tuple_A = 2 * 2,
tuple_B = 2 * 2 * 2,
tuple_C = 'a',
tuple_D = 'z',
tuple_E = (42, 'maximum')
tuple_F = (42, 'minimum')
tuple_Z = 999,
# при сравнении кортежей, числа сравниваются по значению
print(tuple_A < tuple_B)
> True
# строки в лексикографическом порядке
print(tuple_C < tuple_D)
> True
# при равенстве элементов на одинаковых позициях, сравниваются элементы на следующих
print(tuple_E < tuple_F)
> True
# сравнение элементов продолжается до первого неравенства
print(tuple_Z < tuple_F)
> False
Перебор
Наиболее простым и очевидным способом перебрать элементы кортежа является обход его в цикле for
:
my_tuple = ('Wise', 'men', 'say', 'only', 'fools', 'rush', 'in')
# Вывести все элементы кортежа
for word in my_tuple:
print(word)
>
Wise
men
say
only
fools
rush
in
Сортировка
Нет ничего проще, чем отсортировать готовый кортеж. В этом наш друг и помощник — прекрасная функция sorted()
:
not_sorted_tuple = (10**5, 10**2, 10**1, 10**4, 10**0, 10**3)
print(not_sorted_tuple)
> (100000, 100, 10, 10000, 1, 1000)
sorted_tuple = tuple(sorted(not_sorted_tuple))
print(sorted_tuple)
> (1, 10, 100, 1000, 10000, 100000)
Удаление
Добавить или удалить элемент содержащийся в tuple нельзя, по причине всё той же неизменяемости. Однако сам кортеж стереть с цифрового лица Земли возможно. Оператор del
к нашим услугам:
some_useless_stuff = ('sad', 'bad things', 'trans fats')
del some_useless_stuff
print(some_useless_stuff)
>
Traceback (most recent call last):
print(some_useless_stuff)
NameError: name 'some_useless_stuff' is not defined
Методы и особые операции
Срез
Слайсы кортежей предельно похожи на таковые у строк, а выглядят они следующим образом:
tuple[start:fin:step]
Где start
— начальный элемент среза (включительно), fin
— конечный (не включительно) и step
— “шаг” среза.
float_tuple = (1.1, 0.5, 45.5, 33.33, 9.12, 3.14, 2.73)
print(float_tuple[0:3])
> (1.1, 0.5, 45.5)
# тождественная запись
print(float_tuple[:3])
> (1.1, 0.5, 45.5)
# если не указывать конечное значение, будут выведены все элементы до конца
print(float_tuple[0:])
> (1.1, 0.5, 45.5, 33.33, 9.12, 3.14, 2.73)
# не указывать начальное - с начала
print(float_tuple[:])
> (1.1, 0.5, 45.5, 33.33, 9.12, 3.14, 2.73)
# выведем элементы с шагом 2
print(float_tuple[-7::2])
> (1.1, 45.5, 9.12, 2.73)
# отрицательный шаг позволит вывести tuple в обратном порядке
print(float_tuple[::-1])
> (2.73, 3.14, 9.12, 33.33, 45.5, 0.5, 1.1)
Длина кортежа
Используя функцию len()
, получаем длину/количество элементов:
php = ('p', 'h', 'p')
print(len(php))
> 3
Конкатенация
Для tuple определена операция конкатенации:
storm_1 = ('Lightning')Union = (' and ')
storm_2 = ('Thunder')
print(storm_1 + Union + storm_2)
> Lightning and Thunder
Повторение
Как и в случае с конкатенацией, для кортежей, впрочем, как и для строк, определена операция повторения:
dog_do = ('woof!',)
print(dog_do * 3)
> ('woof!', 'woof!', 'woof!')
Индекс заданного элемента
Метод index()
позволяет получить индекс элемента. Достаточно передать нужное значение элемента, как аргумент метода:
rom = ('I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X')
print(rom.index('X'))
> 9
Число вхождений элемента
Метод count()
ведёт подсчет числа вхождений элемента в кортеж.
AT = ('Finn', 'Jake', 'BiMo', 'Marceline', 'Princess Bubblegum', 'BiMo')
print(AT.count('Finn'))
> 1
print(AT.count('BiMo'))
> 2
Преобразование
tuple → str
Представляем вашему вниманию лёгкий способ преобразовать кортеж в строку при помощи метода join()
:
game_name = ('Breath', ' ', 'of', ' ', 'the', ' ', 'Wild')
game_name = ''.join(game_name)
print(game_name)
> Breath of the Wild
tuple → list
Тут всё ещё проще. Для такой конвертации необходимо всего лишь передать кортеж, как аргумент функции list()
:
dig_tuple = (1111, 2222, 3333)
print(dig_tuple)
> (1111, 2222, 3333)
dig_list = list(dig_tuple)
print(dig_list)
> [1111, 2222, 3333]
tuple → dict
А вот для преобразования кортежа в словарь придётся применить небольшую хитрость, а именно — генератор словарей:
score = (('Eric', 65000), ('Stephany', 87000))
score_dict = dict((x, y) for x, y in score)
print(score_dict)
> {'Eric': 65000, 'Stephany': 87000}
Именованные кортежи
Мощная особенность и настоящая гордость языка.
Именованный кортеж (или named tuple) позволяет программисту обращаться к элементу кортежа не по индексу, а через удобочитаемый заранее заданный идентификатор.
Покажем на примере:
# для начала импортируем сам модуль
from collections import namedtuple
citizen = namedtuple("Citizen", "name age status")
Alex = citizen(name='Alex Mercer', age=27, status='show businessman')
print(Alex.name)
> Alex Mercer
print(Alex.status)
> show businessman
Точечная нотация при обращении к свойству объекта может вызвать невольную ассоциацию с классами. В общем-то одно из применений namedtuple как раз связано с ситуациями, когда нужно передать несколько свойств объекта одним куском.
Tuple index out of range
Такая ошибка может возникнуть, например, при запуске следующего кода:
i_initiate_error = ('west', 'north', 'east', 'south')
print(i_initiate_error[4])
Причина её возникновения в том, что нельзя получить доступ к индексу кортежа за пределами его длины. Эта ошибка может возникать и при совсем нетривиальных обстоятельствах, однако суть её останется прежней. Начинающим программистам стоит помнить, что индексация кортежей начинается с 0, а не с 1.
Кортежи весьма похожи на списки, но очень сложно спорить с тем, что гибкость и функционал последних намного выше. Поэтому, при написании программ, следует, в основном, пользоваться ими, а не кортежами.
Кортежи tuple
в Python предназначены, как и списки, для хранения последовательностей, состоящих из данных любого типа. Однако, в отличие от списков, кортежи относятся к неизменяемым типам данных. По этой причине в них часто хранят информацию, которую необходимо защитить от случайного изменения – например, конфигурационные данные.
Кортеж в Питоне: свойства и особенности
1. Кортежи не поддерживают добавление и удаление элементов, но допускают расширение и дополнение для тех элементов, которые относятся к изменяемым типам (списки, словари), а также любые операции с элементами элементов:
>>> numbers = ([1, 2, 3, 4], [5, 4, 5])
>>> numbers[1].extend([3, 5, 9])
>>> numbers[0].append([7, 7, 8])
>>> numbers[1][1] += 5
>>> print(numbers)
([1, 2, 3, 4, [7, 7, 8]], [5, 9, 5, 3, 5, 9])
2. Кортежи поддерживают неограниченный уровень вложенности:
numbers = ((4, 5, 8, (5, 1, (5, 3))), (7, 2, (4, 5, (3, 1, 1))))
3. Кортежи работают немного быстрее, чем списки – это связано с особенностями хранения tuple
в памяти:
>>> from timeit import timeit
>>> times = 1000000
>>> t1 = timeit("list(['груша', 'виноград','яблоко', 'банан', 'апельсин'])", number=times)
>>> t2 = timeit("tuple(('груша', 'виноград','яблоко', 'банан', 'апельсин'))", number=times)
>>> diff = "{:.0%}".format((t2 - t1)/t1)
>>> print(f'Время копирования списка {times} раз: {t1}')
Время копирования списка 1000000 раз: 0.5761922669999961
>>> print(f'Время копирования кортежа {times} раз: {t2}')
Время копирования кортежа 1000000 раз: 0.22475764600000048
>>> print(f'Разница: {diff}')
Разница: -61%
4. Кортежи занимают меньше места в памяти:
>>> from sys import getsizeof
>>> numbers1 = ((1, 2, 3, 4), (5, 4, 5))
>>> numbers2 = [[1, 2, 3, 4], [5, 4, 5]]
>>> print(getsizeof(numbers1))
36
>>> print(getsizeof(numbers2))
44
5. Кортежи поддерживают конкатенацию +
и повторение * n
:
>>> num1 = (1, 2, 3)
>>> num2 = (4, 5, 6)
>>> print(num1 + num2)
(1, 2, 3, 4, 5, 6)
>>> print(num1 * 3)
(1, 2, 3, 1, 2, 3, 1, 2, 3)
6. Элементы tuple
можно использовать в качестве значений переменных; этот прием называют распаковкой кортежа:
>>> seasons = ('весна', 'лето', 'осень', 'зима')
>>> s1, s2, s3, s4 = seasons
>>> print(s1, s3)
весна осень
Создание tuple в Питоне
Пустой кортеж можно создать двумя способами – с помощью круглых скобок ()
и с использованием функции tuple()
:
my_tuple = ()
my_tuple2 = tuple()
При создании кортежа с одним элементом после этого элемента необходимо ставить запятую, иначе Python не определяет конструкцию как кортеж:
>>> my_tuple = (5)
>>> print(type(my_tuple))
<class 'int'>
>>> my_tuple = (5,)
>>> print(type(my_tuple))
<class 'tuple'>
Создать кортеж с несколькими элементами можно следующими способами.
Способ 1: Перечисление элементов
Как и в случае со списками и словарями, кортеж с данными можно создать вручную. Кортеж может содержать данные различных типов:
info = ('Егор', 'разработчик', 350000, 28)
Элементы кортежа необязательно перечислять в круглых скобках – когда Python получает более одного значения для переменной, создание (“упаковка”) кортежа происходит автоматически:
>>> letters = 'a', 'b', 'c', 'd'
>>> print(letters)
('a', 'b', 'c', 'd')
Способ 2: Преобразование других типов данных
С помощью встроенной функции tuple()
можно создать кортеж из списка, строки или множества:
>>> my_lst = [4, 6, 2, 8]
>>> print(tuple(my_lst))
(4, 6, 2, 8)
>>> my_str = 'Я изучаю Python'
>>> print(tuple(my_str))
('Я', ' ', 'и', 'з', 'у', 'ч', 'а', 'ю', ' ', 'P', 'y', 't', 'h', 'o', 'n')
>>> my_set = {2, 5, 6, 7}
>>> print(tuple(my_set))
(2, 5, 6, 7)
Однако при подобном преобразовании словаря в кортеж останутся только ключи:
>>> my_dict = {'яблоки': 52, 'апельсины': 35}
>>> print(tuple(my_dict))
('яблоки', 'апельсины')
Число напрямую преобразовать в кортеж нельзя:
>>> num = 178394
>>> print(tuple(num))
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: 'int' object is not iterable
Но если конвертировать число в строку, преобразование пройдет без ошибок:
>>> num = 31232534
>>> print(tuple(str(num)))
('3', '1', '2', '3', '2', '5', '3', '4')
В ходе преобразования строки в кортеж с помощью одной лишь функции tuple()
строка разбивается на отдельные символы. Если нужно разбить строку по одному разделителю, подойдет метод partition()
:
>>> st = 'Я изучаю***Python'
>>> print(st.partition('***'))
('Я изучаю', '***', 'Python')
Чтобы разбить строку по всем разделителям, вместе с tuple()
используют split()
:
>>> st = tuple(input().split())
Код на языке Python
>>> print(st)
('Код', 'на', 'языке', 'Python')
Способ 3: Генератор кортежей
Генераторы кортежей, в отличие от списков и словарей, не слишком удобно использовать для решения практических задач:
>>> my_tuple = (i for i in range(5))
>>> print(my_tuple)
<generator object <genexpr> at 0x023B5830>
Но если генератор кортежа все-таки необходимо использовать, это можно сделать двумя способами:
1. Распаковать сгенерированный объект при выводе:
>>> numbers = (i for i in range(10))
>>> print(*numbers)
0 1 2 3 4 5 6 7 8 9
2. Либо использовать в генераторе функцию tuple()
:
>>> my_tuple = tuple(i ** 2 for i in range(1, 12, 2))
>>> print(my_tuple)
(1, 9, 25, 49, 81, 121)
Способ 4: Распаковка строк и списков
Оператор распаковки *
и запятая после имени переменной автоматически превращают строки и списки в кортежи:
>>> st = 'Я изучаю Python'
>>> sp = ['Python', 'HTML5', 'CSS', 'JavaScript']
>>> tuple1 = (*st,)
>>> tuple2 = (*sp,)
>>> print(tuple1)
('Я', ' ', 'и', 'з', 'у', 'ч', 'а', 'ю', ' ', 'P', 'y', 't', 'h', 'o', 'n')
>>> print(tuple2)
('Python', 'HTML5', 'CSS', 'JavaScript')
Кортежи поддерживают большинство методов списков, за исключением удаления элементов и присваивания им новых значений:
>>> my_tuple = (4, 5, 6)
>>> del my_tuple[1]
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
>>> my_tuple[2] = 9
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Индексация и срезы
Индексация и срезы в кортежах работают так же, как и в списках:
>>> my_tuple = ('банан', 'груша', 'манго')
>>> print(my_tuple[0], my_tuple[-1])
банан манго
>>> print(my_tuple[1:])
('груша', 'манго')
>>> print(my_tuple[::-1])
('манго', 'груша', 'банан')
Для возвращения индексa элемента используется index()
:
>>> nutr = ('белки', 'жиры', 'углеводы')
>>> print(nutr.index('белки'))
0
Длина, сумма, минимальный и максимальный элементы
Эти методы тоже аналогичны списочным:
>>> my_tuple = ('карандаш', 'ручка', 'шар')
>>> print(len(my_tuple))
3
>>> print(min(my_tuple, key=len))
шар
>>> print(max(my_tuple, key=len))
карандаш
>>> nums = (4, 5, 2, 1, 6)
>>> print(sum(nums))
18
Принадлежность
С помощью операторов in
и not in
можно убедиться в наличии (отсутствии) определенного значения в кортеже:
>>> nums = (1, 3, 5, 6, 7, 8)
>>> (5 in nums)
True
>>> (25 not in nums)
True
Подсчет элементов
Для подсчета числа вхождений какого-либо значения в кортеже используется count()
:
>>> cities = ('Москва', 'Ростов', 'Москва', 'Рязань', 'Саратов', 'Москва')
>>> print(cities.count('Москва'))
3
Сортировка
Кортежи поддерживают сортировку, однако результатом будет список:
>>> nums = (4, 1, 7, 2, 0, 9, 5)
>>> print(sorted(nums))
[0, 1, 2, 4, 5, 7, 9]
Если результат должен сохраняться в виде кортежа, нужно использовать tuple()
:
>>> nums = (4, 1, 7, 2, 0, 9, 5)
>>> print(tuple(sorted(nums, reverse=True)))
(9, 7, 5, 4, 2, 1, 0)
Преобразование кортежей в другие типы данных
Кортеж можно преобразовать в строку:
>>> letters = ('P', 'y', 't', 'h', 'o', 'n')
>>> print('*'.join(letters))
P*y*t*h*o*n
В список:
>>> sp = (2, 7, 5, 8, 1)
>>> print(list(sp))
[2, 7, 5, 8, 1]
В словарь (если кортеж вложенный и состоит из пар значений):
>>> info = (('фрукты', 5), ('овощи', 15), ('конфеты', 3))
>>> print(dict(info))
{'фрукты': 5, 'овощи': 15, 'конфеты': 3}
Во множество:
>>> numbers = (3, 2, 1, 6, 7, 2, 2, 9)
>>> print(set(numbers))
{1, 2, 3, 6, 7, 9}
Сравнение кортежей
Как и списки, кортежи с однородными данными можно сравнивать между собой с помощью операторов >
, >=
, <
, <=
, ==
, !=
. Если элементы кортежей принадлежат к разным типам данных, поддерживаются только операторы ==
и !=
.
>>> tuple1 = (1, 2, 3)
>>> tuple2 = (4, 5, 6)
>>> print(tuple1 < tuple2)
True
>>> print(tuple1 != tuple2)
True
Практика
Задание 1
Напишите программу, которая:
- Создает кортежи из положительных и отрицательных целых чисел на основе полученной от пользователя строки.
- Выводит количество положительных и отрицательных чисел в этих кортежах.
Пример ввода:
45 -6 -9 43 23 5 2 -9 -1 6 3
Вывод:
Кортеж (45, 43, 23, 5, 2, 6, 3) состоит из 7 положительных чисел
Кортеж (-6, -9, -9, -1) состоит из 4 положительных чисел
Решение:
numbers = tuple(map(int, input().split()))
pos = tuple(i for i in numbers if i > 0)
neg = tuple(i for i in numbers if i < 0)
print(f'Кортеж {pos} состоит из {len(pos)} положительных чисел')
print(f'Кортеж {neg} состоит из {len(neg)} положительных чисел')
Задание 2
Напишите программу, которая:
- Создает кортеж из полученной от пользователя строки, состоящей из вещественных чисел, разделенных пробелами.
- Выводит минимальный и максимальный элементы кортежа, а также их сумму.
Пример ввода:
3.45 6.78 8.99 1.45 4.32 19.04 0.55
Вывод:
Минимальное число: 0.55
Максимальное число: 19.04
Сумма min и max: 19.59
Решение:
my_tuple = tuple(map(float, input().split()))
print(f'Минимальное число: {min(my_tuple)}')
print(f'Максимальное число: {max(my_tuple)}')
print(f'Сумма min и max: {((min(my_tuple) + max(my_tuple))):.2f}')
Задание 3
Имеется кортеж списков, в которых перечислены названия фруктов и калорийность:
fruit = (['яблоки', 46], ['персики', 49], ['лимоны', 36], ['виноград', 190])
Калорийность винограда указана ошибочно. Напишите программу, которая исправит калорийность на 75
, и добавит в третий элемент кортежа новое значение ['айва', 42]
. Результат должен выглядеть так:
fruit = (['яблоки', 46], ['персики', 49], ['лимоны', 36, 'айва', 42], ['виноград', 75])
Решение:
fruit = (['яблоки', 46], ['персики', 49], ['лимоны', 36], ['виноград', 190])
fruit[3][1] = 75
fruit[2].extend(['айва', 42])
print(fruit)
Задание 4
Имеется вложенный кортеж:
numbers = ((5, 4, 5, 4), (3, 3, 4, 6), (8, 9, 5, 4), (12, 4, 5, 1), (9, 3, 5, 1))
Напишите программу, которая формирует новый кортеж, состоящий из средних арифметических значений элементов numbers
. Результат выводится в следующем виде:
4.5 4.0 6.5 5.5 4.5
Решение:
numbers = ((5, 4, 5, 4), (3, 3, 4, 6), (8, 9, 5, 4), (12, 4, 5, 1), (9, 3, 5, 1))
avg = tuple(sum(i)/len(i) for i in numbers)
print(*avg)
Задание 5
Имеется вложенный кортеж:
nested_tuple = ((12, 3, 1), (5, 11), (15, 7, 8, 9), (10, 6, 4))
Напишите программу для преобразования nested_tuple в обычный кортеж, упорядоченный по возрастанию:
(1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15)
Решение:
nested_tuple = ((12, 3, 1), (5, 11), (15, 7, 8, 9), (10, 6, 4))
res = []
flat_list = [res.extend(i) for i in nested_tuple]
print(tuple(sorted(res)))
Задание 6
Напишите программу для сортировки вложенного кортежа по третьему элементу. Исходный кортеж:
(('красный', 33, 55), ('зеленый', 17, 44), ('синий', 12, 3), ('черный', 2, 5))
Результат:
(('черный', 2, 5), ('синий', 12, 3), ('зеленый', 17, 44), ('красный', 33, 55))
В качестве ключа сортировки следует использовать конструкцию key=lambda x: x[2]
– это анонимная функция. В последующих статьях мы будем подробно разбирать применение анонимных функций.
Решение:
nested_tuple = (('красный', 33, 55), ('зеленый', 17, 44), ('синий', 12, 3), ('черный', 2, 5))
nested_tuple = tuple(sorted(list(nested_tuple), key=lambda x: x[2]))
print(nested_tuple)
Задание 7
Напишите программу, которая:
- принимает на вход строку, состоящую из цифр или символов, разделенных пробелами;
- создает из строки кортеж;
- проверяет, состоит ли кортеж из одинаковых элементов;
- выводит
True
илиFalse
в зависимости от результатов проверки.
Для проверки соответствия всех элементов одному условию в Python используется встроенная функция all():
all(i == my_tuple[0] for i in my_tuple)
Пример ввода:
35 35 35 35 35
Вывод:
True
Решение:
my_tuple = tuple(input().split())
print(all(i == my_tuple[0] for i in my_tuple))
Задание 8
Напишите программу, которая на основе исходного кортежа создает новый кортеж, из которого исключены все пользователи с номерами телефонов с региональным кодом +56.
Исходный кортеж:
info = (('Евгений Романов', 25, '+56(983)354-67-21'),
('Марина Дятлова', 22, '+56(190)251-45-79'),
('Кирилл Кудрявцев', 34, '+7(890)456-12-42'),
('Сергей Дятлов', 24, '+56(190)156-42-99'),
('Юлия Степанова', 21, '+16(398)355-33-09'),
('Тимофей Иванов', 34, '+7(918)222-52-77'))
Ожидаемый результат:
(('Кирилл Кудрявцев', 34, '+7(890)456-12-42'), ('Юлия Степанова', 21, '+16(398)355-33-09'), ('Тимофей Иванов', 34, '+7(918)222-52-77'))
Решение:
info = (('Евгений Романов', 25, '+56(983)354-67-21'),
('Марина Дятлова', 22, '+56(190)251-45-79'),
('Кирилл Кудрявцев', 34, '+7(890)456-12-42'),
('Сергей Дятлов', 24, '+56(190)156-42-99'),
('Юлия Степанова', 21, '+16(398)355-33-09'),
('Тимофей Иванов', 34, '+7(918)222-52-77'))
new_info = tuple([i for i in info if not i[2].startswith('+56')])
print(new_info)
Задание 9
Имеется кортеж списков:
numbers = ([4, 5], [4, 5], [1, 6], [7, 3], [3, 3], [2, 4], [9, 5], [1, 1])
Напишите программу, которая добавит цифру 5
в конец каждого списка.
Ожидаемый результат:
numbers = ([4, 5, 5], [4, 5, 5], [1, 6, 5], [7, 3, 5], [3, 3, 5], [2, 4, 5], [9, 5, 5], [1, 1, 5])
Решение:
numbers = ([4, 5], [4, 5], [1, 6], [7, 3], [3, 3], [2, 4], [9, 5], [1, 1])
add = [i.extend([5]) for i in numbers]
print(numbers)
Задание 10
Напишите программу, которая:
- получает на вход целое число n – количество точек на плоскости;
- получает n строк с координатами
x, y
; - определяет точку, наиболее удаленную от начала координат.
Пример ввода:
5
4 8
1 2
7 4
7 8
3 2
Вывод:
7 8
Решение:
n = int(input())
points = [tuple(map(int, input().split())) for i in range(n)]
mx = max(points, key=lambda x: x[0] ** 2 + x[1] ** 2)
print(*mx)
Подведем итоги
Кортежи во многом похожи на списки. Выбор в пользу кортежей стоит делать тогда, когда необходимо защитить данные от случайного изменения. Кроме того, многие операции с кортежами выполняются быстрее и занимают меньше памяти. В следующей статье будем изучать множества.
Содержание самоучителя
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП – абстракция и полиморфизм
- Графический интерфейс на Tkinter
Понятие кортежа в Python
Еще одной упорядоченной коллекцией объектов в Python являются кортежи, которые практически во всем похожи на
списки. Однако в отличие от списков кортежи не могут изменяться непосредственно, поэтому многие операции применимые к спискам, становятся
недоступными для кортежей. Кроме того, литералы кортежей записываются не в квадратных, а в круглых скобках. Итак, что же такое кортеж?
Кортеж
(от англ. tuple) – это неизменяемая упорядоченная коллекция объектов
произвольного типа. Сами объекты называются элементами кортежа, а доступ к ним может быть
получен при помощи целочисленного индекса или среза.
Поскольку кортежи очень похожи на списки, дальнейшее изложение материала будет практически полностью дублировать содержание параграфа о
списках. Однако пренебрегать чтением и решением задач не стоит, т.к. это хорошая возможность еще раз повторить и закрепить основные понятия,
связанные с упорядоченными последовательностями.
Создание кортежей в Python
Проще всего литерал кортежа в Python
создается при помощи круглых скобок, внутри которых элементы кортежа
перечисляются через запятую (см. пример №1). В случае необходимости последний элемент кортежа можно также
завершать запятой. Это никак не повлияет на количество элементов кортежа, а значит и его длину. Однако, если кортеж состоит из одного элемента,
то запятую после него нужно указывать обязательно, иначе интерпретатор не сможет отличить кортеж от простого значения или выражения.
# Получаем пустой кортеж.
tpl_1 = ()
# Выведет ().
print(tpl_1, end='nn')
# Получаем кортеж с одним элементом.
# (3) нельзя, т.к. это просто число 3.
tpl_2 = (3,)
# Выведет (3,).
print(tpl_2, end='nn')
# Элементы перечисляем через запятую.
tpl_3 = (15, "Иван", None, 34.5, True)
# Выведет (15, 'Иван', None, 34.5, True).
print(tpl_3, end='nn')
# Последнюю запятую можно не опускать.
tpl_4 = (1, 2, 3,)
# Выведет (1, 2, 3).
print(tpl_4, end='nn')
# Эл-ми могут быть любые объекты, любой вложенности.
tpl_5 = (
{'1': 'top', '2': ['abc', (4, 5)]},
0.3,
)
# Выведет ({'1': 'top', '2': ['abc', (4, 5)]}, 0.3).
print(tpl_5)
()
(3,)
(15, 'Иван', None, 34.5, True)
(1, 2, 3)
({'1': 'top', '2': ['abc', (4, 5)]}, 0.3)
Пример №1. Создание кортежей в Python (часть 1).
Как видим, внутри кортежей действительно разрешается использовать объекты любого типа данных, создавая при этом любые их комбинации и уровни
вложенности. А благодаря наличию в синтаксисе круглых скобок, сложные и объемные литералы кортежей можно без проблем записывать на нескольких
строках, придавая исходному коду удобочитаемый вид.
Создать кортеж можно также при помощи встроенного конструктора типа tuple().
Если использовать его без аргумента, то он вернет нам пустой кортеж. Если же передать ему итерируемый объект, например, строку или список, то
конструктор вернет кортеж, элементами которого будут соответствующие элементы переданного объекта (см. пример №2).
# Получаем пустой кортеж.
tpl_1 = tuple()
# Выведет ().
print(tpl_1, end='nn')
# Получаем кортеж из строки.
tpl_2 = tuple('123')
# Выведет ('1', '2', '3').
print(tpl_2, end='nn')
# Преобразуем список в кортеж.
tpl_3 = tuple([15, "Иван", None, 34.5, True])
# Выведет (15, 'Иван', None, 34.5, True).
print(tpl_3)
()
('1', '2', '3')
(15, 'Иван', None, 34.5, True)
Пример №2. Создание кортежей в Python (часть 2).
Что касается генераторов, то создать кортеж с их помощью не получится, т.к. как генераторы заключенные в круглые скобки сами являются
«выражениями генераторами».
Доступ по индексу и срезы кортежей
Операции доступа по индексу и получения срезов для кортежей имеют практически тот же самый синтаксис и смысл, что и для списков (см. пример
№3).
# Формируем кортеж из целых чисел.
# Можно и без скобок, но лучше явно определять кортеж.
tpl_1 = 1, 2, 3, 4, 5
# Получим 1, т.е. 1-й эл-т кортежа (нумерация начинается с нуля).
print('tpl_1[0] ->', tpl_1[0], end='nn')
# Выводим последний эл-т кортежа (кол-во эл-тов кортежа минус один).
# Получим 5.
print('tpl_1[len(tpl_1)-1] ->', tpl_1[len(tpl_1)-1], end='nn')
# Можно использовать отрицательные индексы, тогда
# нумерация будет идти с конца и начинаться с -1.
# Опять же получим 5.
print('tpl_1[-1] ->', tpl_1[-1])
tpl_1[0] -> 1
tpl_1[len(tpl_1)-1] -> 5
tpl_1[-1] -> 5
Пример №3. Доступ к элементам кортежа по индексу (часть 1).
В принципе во многих случаях можно определять кортеж и без использования круглых скобок, т.к. для его определения важно именно наличие запятых между
объектами, которые станут элементами кортежа. Однако все зависит от конкретной ситуации. Например, запись вида
my_func(x, y) означает, что данной функции должно быть передано два аргумента, а запись
my_func((x, y)) означает, что функции должен быть передан кортеж из двух элементов. Так что лучше всегда явно
определять кортеж, используя для этого круглые скобки.
Поскольку в результате обращения к элементу кортежа по его индексу возвращается некоторый объект, расположенный по указанному смещению, то для
получения доступа к элементам на более глубоком уровне вложенности может потребоваться целая цепочка из нескольких индексов (см. пример
№4).
# Простой пример вложенных в кортеж списков.
tpl_1 = (3.14, ['abc', [4, 5]], 'кот')
# Выводим число 3.14 (1-й элемент кортежа).
print('tpl_1[0] ->', tpl_1[0], end='nn')
# Выводим 2-й символ строки 'кот'.
print('tpl_1[2][1] ->', tpl_1[2][1], end='nn')
# Выводим 3-й символ строки 'abc'.
print('tpl_1[1][0][2] ->', tpl_1[1][0][2], end='nn')
# Выводим число 5 вложенного списка [4, 5].
print('tpl_1[1][1][1] ->', tpl_1[1][1][1])
tpl_1[0] -> 3.14
tpl_1[2][1] -> о
tpl_1[1][0][2] -> c
tpl_1[1][1][1] -> 5
Пример №4. Доступ к элементам кортежа по индексу (часть 2).
Следует отметить, что цепочка доступа к конкретному элементу может иметь и более сложную конструкцию, включающую не только квадратные скобки с
индексами для доступа к элементам строк, кортежей или списков, но и квадратные скобки с ключами для доступа к элементам словарей, и точки для
доступа к атрибутам объектов. Например, для кортежа tpl = ({‘one’: ‘top’, ‘two’: [‘abc’, [4, 5]]}, 0.3) цепочка
получения доступа ко второму элементу вложенного списка [4, 5] будет иметь вид
tpl[0][‘two’][1][1].
Что касается получения срезов для кортежей, то для них справедлив тот же порядок, что и для других упорядоченных коллекций, т.е. строк и списков
(см. пример №5).
# Формируем кортеж из целых чисел.
tpl_1 = (1, 2, 3, 4, 5, 6, 7)
# Получаем кортеж из первых двух эл-тов.
print('tpl_1[0:2] ->', tpl_1[0:2], end='nn')
# Можно и так, все равно получим (1, 2).
print('tpl_1[:2] ->', tpl_1[:2], end='nn')
# Получаем кортеж из посл-х двух эл-тов ((6, 7)).
print('tpl_1[-2:] ->', tpl_1[-2:], end='nn')
# Получаем кортеж (3, 4, 5) из эл-тов с 3-го по 5-й.
print('tpl_1[2:5] ->', tpl_1[2:5], end='nn')
# Получим (2, 3, 4, 5) (использ. отриц. индексы).
print('tpl_1[-6:-2] ->', tpl_1[-6:-2], end='nn')
# Убедимся, что кортеж не изменился.
print('tpl_1 ->', tpl_1, end='nn')
# Напоследок выведем копию кортежа.
print('tpl_1[:] ->', tpl_1[:])
tpl_1[0:2] -> (1, 2)
tpl_1[:2] -> (1, 2)
tpl_1[-2:] -> (6, 7)
tpl_1[2:5] -> (3, 4, 5)
tpl_1[-6:-2] -> (2, 3, 4, 5)
tpl_1 -> (1, 2, 3, 4, 5, 6, 7)
tpl_1[:] -> (1, 2, 3, 4, 5, 6, 7)
Пример №5. Операция взятия среза у кортежей.
Опять же, при извлечении срезов следует помнить, что нумерация элементов в кортежах начинается с нуля, а элемент с индексом второго предела,
указанного в квадратных скобках, не будет присутствовать в срезе. Например, в срезе кортежа tpl_1[0:5] будут
присутствовать первые пять элементов с индексами от 0 до 4, но не включая
элемент с индексом 5.
Как и в случае со строками и списками, один или оба предела среза можно опускать. Если не указывать первый предел, интерпретатор будет начинать срез
с первого элемента кортежа (с индексом 0), а при отсутствии второго предела срез будет идти до конца кортежа. Если
опустить оба предела, мы получим копию кортежа. При необходимости разрешается указывать и третий предел, который будет задавать
шаг среза (см. пример №6).
# Формируем кортеж из целых чисел.
tpl_1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# Выводим его для наглядности.
print('tpl_1 ->', tpl_1, end='nn')
# Выводим каждый 2-й элемент среза (слева направо).
# (1, 3, 5, 7).
print('tpl_1[0:7:2] ->', tpl_1[0:7:2], end='nn')
# Можно и так, получим опять (1, 3, 5, 7).
print('tpl_1[:7:2] ->', tpl_1[:7:2], end='nn')
# Выводим каждый третий элемент всего кортежа.
# (1, 4, 7, 10).
print('tpl_1[::3] ->', tpl_1[::3], end='nn')
# Выводим каждый 2-й эл-т, считая с конца среза (-1, -2,...).
# Сам срез берется справа налево, если шаг отрицательный.
# (9, 7, 5).
print('tpl_1[8:2:-2] ->', tpl_1[8:2:-2], end='nn')
# Выводим каждый 3-й эл-т среза, считая справа налево.
# (8, 5).
print('tpl_1[-3:1:-3] ->', tpl_1[-3:1:-3], end='nn')
# Выводим каждый 2-й эл-т, считая с конца кортежа.
# (10, 8, 6, 4, 2).
print('tpl_1[::-2] ->', tpl_1[::-2])
tpl_1 -> (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
tpl_1[0:7:2] -> (1, 3, 5, 7)
tpl_1[:7:2] -> (1, 3, 5, 7)
tpl_1[::3] -> (1, 4, 7, 10)
tpl_1[8:2:-2] -> (9, 7, 5)
tpl_1[-3:1:-3] -> (8, 5)
tpl_1[::-2] -> (10, 8, 6, 4, 2)
Пример №6. Порядок использования шага среза у кортежей.
Как видим, шаг среза также может иметь отрицательное значение (аналогично спискам и строкам). В этом случае отсчет элементов кортежа и шагов ведется в
противоположном направлении, а границы среза указываются справа налево, т.е. индекс элемента, стоящего правее в кортеже должен указываться первым.
Например, в срезе примера tpl_1[-3:1:-3] отсчет ведется справа налево, начиная с
3-го элемента, отсчитываемого с конца кортежа, до элемента с индексом 1,
который находится левее и в срез не включается.
Неизменяемость кортежей означает, что для них запрещены операции добавления новых элементов, а также удаления или замены уже существующих. При этом мы спокойно можем
изменять конкретные элементы кортежа, если они это допускают (см. пример №7).
# Формируем кортеж из 3-х элементов.
tpl_1 = ('и', ['b', [4, 5]], 0.3)
# Изменяем 1-й эл-т вложенного списка [4, 5].
tpl_1[1][1][0] = 's'
# Выведет ('и', ['b', ['s', 5]], 4).
print('tpl_1[1][1][0] = 's' ->', tpl_1, end='nn')
# А вот так уже не получится (кортеж неизменяем).
tpl_1[0] = 7
# Выведет исключение.
print('tpl_1[0] = 7 ->', tpl_1)
tpl_1[1][1][0] = 's' -> ('и', ['b', ['s', 5]], 0.3)
'tuple' object does not support item assignment
Пример №7. Изменение элементов кортежей.
Операторы кортежей в Python
Поскольку кортежи относятся к упорядоченным последовательностям, операторы +, +=,
* и *= имеют для них практически тот же смысл, что и для списков и строк
(см. пример №8).
# Формируем кортежи.
tpl_1 = (1, 2, 3)
tpl_2 = (4, 5, 6)
# Осуществляем конкатенацию кортежей (т.е. объединение).
# Выведет (1, 2, 3, 4, 5, 6).
print('tpl_1 + tpl_2 ->', tpl_1 + tpl_2, end='nn')
# Объединяем с самим собой 3 раза (tpl_1 + tpl_1 + tpl_1).
# Выведет (1, 2, 3, 1, 2, 3, 1, 2, 3).
print('tpl_1*3 ->', tpl_1*3, end='nn')
# Тоже, что и tpl_1 = tpl_1 + tpl_2.
tpl_1 += tpl_2
# Теперь tpl_1 == (1, 2, 3, 4, 5, 6).
print('tpl_1 += tpl_2 ->', tpl_1)
tpl_1 + tpl_2 -> (1, 2, 3, 4, 5, 6)
tpl_1*3 -> (1, 2, 3, 1, 2, 3, 1, 2, 3)
tpl_1 += tpl_2 -> (1, 2, 3, 4, 5, 6)
Пример №8. Использование операторов + и * применительно к кортежам.
Незабываем, что по обе стороны от оператора сложения должны находиться кортежи (в общем случае это должны быть последовательности
одного и того же типа), т.к. интерпретатор не занимается автоматическим приведением типов и просто выдаст ошибку.
Далее. В отношении элементов кортежа мы можем использовать оператор проверки на вхождение in, который
совершает поиск требуемого объекта (левый операнд) среди элементов целевого кортежа (правый операнд). Опять же, в случае успеха операция возвращает
True, иначе – False (см. пример №9).
# Формируем кортеж.
tpl_1 = (1, 2, 3, [4, 5])
# Проверяем наличие числа 8 в кортеже.
answer = 8 in tpl_1
# Если операция вернула True,
if answer:
# выводим подтверждение на экран.
print('Число 8 присутствует в кортеже tpl_1.', end='nn')
# Иначе
else:
# выводим на экран отрицание.
print('Числа 8 нет в кортеже tpl_1.', end='nn')
# Проверим вхождение, используя not in.
if 5 not in tpl_1[3]:
# Выводим подтверждение на экран.
print('Число 5 отсутствует в tpl_1[3].')
# Иначе
else:
# Выводим на экран сообщение.
print('Число 5 присутствует в tpl_1[3].')
Числа 8 нет в кортеже tpl_1.
Число 5 присутствует в tpl_1[3].
Пример №9. Использование оператора in применительно к кортежам.
Напомним, что оператор in может использоваться не только самостоятельно, но и совместно с оператором
отрицания not, который инверсирует возвращаемое логическое значение оператора in.
Соответственно, например, операция ‘крот’ not in (‘кот’, ‘кит’) вернет True
вместо False.
Если возникает необходимость в обходе элементов кортежа, то, по аналогии со строками и списками, можно смело использовать оператор цикла
for (см. пример №10).
# Формируем кортеж.
tpl_1 = (1, 2, 3, 4, 5)
# Проверим все ли числа в кортеже целые.
for elem in tpl_1:
# Если эл-т не является целым числом,
if type(elem) is not int:
# выводим сообщение на экран
print('Не все эл-ты кортежа целые числа.')
# и прерываем цикл.
break
# Eсли цикл завершился успешно,
else:
# выводим положительный результат.
print('Все эл-ты в кортеже - целые числа.')
Все эл-ты в кортеже - целые числа.
Пример №10. Использование цикла for для обхода элементов кортежа.
Поскольку кортежи относятся к неизменяемым последовательностям, оператор удаления del
к элементам кортежа неприменим, хотя сам кортеж данный оператор спокойно удаляет.
Функции и методы кортежей в Python
Что касается методов кортежей, то для них применимы общие методы упорядоченных последовательностей, которые не приводят к их изменению. Я насчитал всего
два таких метода.
-
tpl.count(x) – возвращает количество элементов с указанным значением x
в целевом кортеже tpl (см. пример №11). Отметим, что в отличие от аналогичного
метода для строк, здесь указывать интервал для поиска нельзя, т.к. метод принимает только один аргумент. -
tpl.index(x[, start[, end]]) – возвращает индекс i первого вхождения
элемента tpl[i] со значением x в целевой кортеж
tpl или в срез кортежа tpl[start:end], если он задан. В случае неудачного
поиска метод вызывает исключение ValueError. Обратите внимание, что при использовании среза отсчет индекса
элемента все равно стартует с начала всего кортежа.
# Создаем кортеж для манипуляций.
tpl = ('a', 'b', 'c', 'a', 'b', 'c')
# Ищем кол-во эл-тов со значением 'b'
n_1 = tpl.count('b')
# Получим 2.
print('tpl.count("b") ->', n_1)
# Ищем кол-во эл-тов со значением 23
n_2 = tpl.count(23)
# Получим 0, т.к. эл-тов с таким значением нет в кортеже.
print('tpl.count(23) ->', n_2, end='nn')
# Ищем индекс 1-го встретившегося эл-та со значением 'c'.
index_1 = tpl.index('c')
# Выведет 2.
print('tpl.index("c") ->', index_1)
# Тоже самое, но ищем с 4-го элемента кортежа.
index_2 = tpl.index('c', 3)
# Получим индекс 5, т.к. ищем не сначала кортежа.
print('tpl.index("c", 3) ->', index_2)
tpl.count("b") -> 2
tpl.count(23) -> 0
tpl.index("c") -> 2
tpl.index("c", 3) -> 5
Пример №11. Методы кортежей.
Применимы к кортежам и некоторые встроенные функции, которые получают доступ к элементам кортежа, но не изменяют его непосредственно:
len() (возвращает количество элементов в кортеже),
min() (возвращает элемент с минимальным значением, при этом элементы должны быть одного типа с возможностью
сравнения), max() (возвращает элемент с максимальным значением, при этом элементы должны быть одного типа
с возможностью сравнения), sum() (возвращает сумму элементов кортежа, при этом элементы должны быть числами) и т. д.
Зачем нужны кортежи, если есть списки?
«Ну, и зачем нам эти кортежи, если есть списки?» – часто спрашивают начинающие программисты. Действительно, кортежи копируют списки и при этом
сильно ограничены в возможностях, да еще и неизменяемые. Однако ключевая мысль здесь – «неизменяемые». Благодаря этому мы можем быть уверены, что
кортеж не будет изменен через другую ссылку в другом месте программы. Кроме того, встречаются ситуации, когда использование списков недопустимо,
например, в качестве ключей словаря кортежи можно использовать, а списки нет. Именно поэтому, когда в программе нужно использовать упорядоченные
коллекции объектов с возможностью их изменения в будущем, нужно выбирать списки; если же нужны фиксированные коллекции объектов, следует выбирать
кортежи.
Хотя сами кортежи и неизменяемы, они могут содержать элементы изменяемых типов (например, списки или словари), а те могут быть изменены программой. Такие кортежи
использовать в качестве ключей словаря не получится.
Второй важной особенностью кортежей является то, что за счет неизменяемости, а значит и более простой внутренней структуры, кортежи в общем случае занимают в памяти меньше места, чем списки
(см. пример №12). Как следствие, операции с кортежами являются более производительными, хотя и не такими гибкими.
# Импортируем модуль sys.
import sys
# Создаем кортеж и список.
tpl = (1, 2, 3, 4, 5)
li = [1, 2, 3, 4, 5]
# Получаем размеры.
print('Размер tpl:', sys.getsizeof(tpl))
print('Размер li:', sys.getsizeof(li))
Размер tpl: 80
Размер li: 120
Пример №12. Отличие кортежей от списков.
Краткие итоги параграфа
-
В Python кортежи представляют собой упорядоченные, но неизменяемые, коллекции объектов произвольного типа с
доступом по индексу. -
Чтобы создать кортеж достаточно перечислить требуемые объекты (элементы кортежа) через запятую внутри круглых скобок (например,
tpl = (3.7, ‘оса’, [1, 2])). Здесь стоит не забывать, что если таким образом создается кортеж с одним
элементом, после него следует ставить запятую (например, tpl = (7,)). -
Также кортежи могут быть созданы при помощи функции tuple(iterable) (например, инструкция
tuple(‘abc’) вернет кортеж (‘a’, ‘b’, ‘c’)). - Использовать для создания кортежей генераторы нельзя, т.к. генераторы заключенные в круглые скобки сами являются «выражениями генераторами».
-
После создания кортежа доступ к любому элементу кортежа можно получить по его индексу, т.е. порядковому номеру элемента в кортеже. При этом
следует помнить, что индексация элементов в кортежах начинается с нуля (например, инструкция print(tpl[1])
выведет второй элемент последнего кортежа, т.е. строку ‘b’). -
Что касается срезов, то для кортежей они имеют практически тот же смысл, что и для строк и списков. Главное не забывать, что кортежи неизменяемы,
и не пытаться использовать срезы для замены, удаления или добавления элементов в кортеж. -
Арифметические операторы + и *, а также их комбинированные
собратья += и *=, работают с кортежами по хорошо известной нам схеме, т.е.
практически так же, как со строками и списками. -
Оператор удаления del в отношении элементов кортежа неприменим. А вот оператор
in и цикл for как раз наоборот: первый как всегда
совершает поиск требуемого объекта среди элементов целевого кортежа, а второй позволяет поочередно обойти все его элементы. -
Из методов для кортежей доступны только общие методы упорядоченных последовательностей. Это tpl.count(x),
который подсчитывает количество элементов с указанным значением x, и
tpl.index(x[, start[, end]]), который возвращает индекс i первого вхождения
в кортеж элемента tpl[i] со значением x). Найти эти методы можно в подразделе
«Sequence Types – list, tuple, range»
раздела «Built-in types» стандартной библиотеки. -
Благодаря своей неизменяемости кортежи занимают в памяти меньше места, чем списки, а операции с ними являются более производительными. При этом следует помнить, что хотя сами кортежи и
неизменяемы, их элементы изменяемых типов (например, списки или словари) могут быть изменены программой (такие кортежи использовать в качестве ключей словаря не получится).
Вопросы и задания для самоконтроля
1. Какие из утверждений относятся к кортежам: коллекция объектов, упорядоченная последовательность, неизменяемая и
неупорядоченная последовательность, изменяемая неупорядоченная коллекция объектов, неизменяемая упорядоченная последовательность элементов?
Показать решение.
Ответ. Кортежи – это неизменяемые упорядоченные коллекции объектов (последовательности элементов)
произвольного типа. Значит по отношению к ним верны утверждения: коллекция объектов, упорядоченная последовательность, неизменяемая упорядоченная
последовательность элементов.
2. Разрешается ли использовать в качестве элементов кортежа списки?
Показать решение.
Ответ. Кортежи – это неизменяемые упорядоченные коллекции объектов произвольного типа. Значит мы можем использовать в качестве их
элементов и списки, и словари и любые другие изменяемые объекты.
3. Для чего нужны кортежи, если есть списки?
Показать решение.
Ответ. Кортежи неизменяемы, поэтому они могут использоваться в качестве ключей словаря (пусть и с ограничениями на неизменяемость
вложенных элементов), а также хорошо подходят для случаев, когда нужно быть уверенным в целостности данных. Кроме того, кортежи занимают меньше памяти, чем списки, а значит с
кортежами производительность операций будет выше.
4. Какие из представленых литералов относятся к типу tuple:
(‘tuple’, ‘list’), ‘(3, 4)’, (5,),
‘Питон, Python’? Проверьте типы программно.
Показать решение.
Ответ. Тип tuple:
(‘tuple’, ‘list’), (5,).
# Выводим типы представленных литералов.
print("Тип ('tuple', 'list'):", type(('tuple', 'list')))
print("Тип '(3, 4)':", type('(3, 4)'))
print("Тип (5,):", type((5,)))
print("Тип 'Питон, Python':", type('Питон, Python'))
Тип ('tuple', 'list'): <class 'tuple'>
Тип '(3, 4)': <class 'str'>
Тип (5,): <class 'tuple'>
Тип 'Питон, Python': <class 'str'>
5. Дан кортеж (([1, 2], [‘012’, ‘abc’]), [4, 3]). Как получить доступ к символу
‘c’ строки ‘abc’?
Показать решение.
Ответ. Доступ к элементам вложенных последовательностей вроде списков, строк или кортежей можно получить через последовательную цепочку
обращений по индексу.
# Сохраняем кортеж в переменной.
tpl = (([1, 2], ['012', 'abc']), [4, 3])
# Используем цепочку доступа по индексу.
print(tpl[0][1][1][2])
c
6. Какие значения будут присвоены переменным в инструкциях tpl_1 = (1, 2, 3, 4, 5, 6, 7)[1:4],
tpl_2 = (1, 2, 3, 4, 5, 6, 7)[-4:-3] и tpl_3 = (1, 2, 3, 4, 5, 6, 7)[::2]? Проверьте свой ответ программно.
Показать решение.
# Получаем срезы.
tpl_1 = (1, 2, 3, 4, 5, 6, 7)[1:4]
tpl_2 = (1, 2, 3, 4, 5, 6, 7)[-4:-3]
tpl_3 = (1, 2, 3, 4, 5, 6, 7)[::2]
# Выведет (2, 3, 4].
print('tpl_1:', tpl_1)
# Выведет (4,) (с запятой!).
print('tpl_2:', tpl_2)
# Выведет (1, 3, 5, 7).
print('tpl_3:', tpl_3)
tpl_1: (2, 3, 4) tpl_2: (4,) tpl_3: (1, 3, 5, 7)
7. Имеется кортеж (1, 2, 3). В нем необходимо заменить первый элемент и получить кортеж
(5, 2, 3). Как это сделать, ведь кортежи неизменяемы?
Показать решение.
Ответ. Да, кортежи относятся к неизменяемым типам данных. Поэтому изменить их непосредственно не получится, но никто не запрещает нам создать
новый кортеж с желаемым значением.
# Сохраним кортеж в переменной.
tpl = (1, 2, 3)
# Создаем новый кортеж, используя операции
# конкатенации и извлечения среза.
tpl_1 = (5,) + tpl[1:]
# Выводим новый кортеж на экран.
print(tpl_1)
# Используем дорогостоящую операцию
# преобразования в список и обратно.
li = list(tpl)
li[0] = 5
tpl_2 = tuple(li)
# Выводим новый кортеж на экран.
print(tpl_2)
(5, 2, 3)
(5, 2, 3)
8. Что произойдет, если в кортеже (1, [2, 3]) попытаться изменить в списке одно из значений? Объясните
свой ответ.
Показать решение.
Ответ. Мы не можем изменять сами кортежи, т.е. удалять, добавлять или перемещать его элементы, которые представляют собой объекты произвольного
типа. Однако изменять значения элементов кортежа, которые являются объектами изменяемых типов мы можем. Поэтому мы можем свободно изменить любое из значений списка данного кортежа.
# Целевой кортеж.
tpl = (1, [2, 3])
# Выведет (1, [2, 3]).
print('tpl:', tpl)
# Вносим изменения в список.
tpl[1][0] = 5
# Выведет (1, [5, 3]).
print('tpl:', tpl)
tpl: (1, [2, 3])
tpl: (1, [5, 3])
9. Что можно сказать про методы с именами count, split,
index и clear в контексте кортежей?
Показать решение.
Ответ. Кортежи, как и строки, относятся к неизменяемым типам данных. Поэтому у них отсутствуют методы split и
clear, которые связаны с изменением кортежей.
10. Дополнительные упражнения и задачи по теме расположены в разделе
«Кортежи»
нашего сборника задач и упражнений по языку программирования Python.
Быстрый переход к другим страницам
По аналогии со списками кортежи в Python — это стандартный тип, позволяющий хранить значения в виде последовательности. Они полезны в тех случаях, когда необходимо передать данные, не позволяя изменять их. Эти данные могут быть использованы, но в оригинальной структуре изменения не отобразятся.
В этом руководстве вы познакомитесь с кортежами Python в подробностях:
- Узнаете, как их создавать. Увидите, что значит неизменяемый тип на примерах
- Разберетесь, чем кортежи в Python отличаются от списков
- Познакомитесь с операциями: срезами, конкатенацией, умножением и так далее
- Увидите встроенные функции
- Научитесь присваивать сразу несколько значений кортежами
Эта структура данных используется для хранения последовательности упорядоченных и неизменяемых элементов.
Кортежи создают с помощью круглых скобок ()
. Для создания нужно написать следующее:
cake = ('c','a','k','e')
print(type(cake))
Примечание: type()
— это встроенная функция для проверки типа данных переданного параметра.
Кортежи могут включать однородные и разнородные значения. Но после объявления их уже нельзя будет поменять:
mixed_type = ('C',0,0,'K','I','E')
for i in mixed_type:
print(i,":",type(i))
C :
0 :
0 :
K :
I :
E :
# Попробуйте изменить 0 на «O»
mixed_type[1] = "O"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 mixed_type[1] = 'O' # Попробуйте изменить 0 на «O»
TypeError: 'tuple' object does not support item assignment
Последняя ошибка появилась из-за попытки поменять значения внутри кортежа.
Кортежи можно создавать и вот так:
numbers_tuple = 1,2,3,4,5
print(type(numbers_tuple))
Кортежи против списков
Как вы могли заметить, кортежи очень похожи на списки. По сути, они являются неизменяемыми списками. Это значит, что после создания кортежа хранимые в нем значения нельзя удалять или менять. Добавлять новые также нельзя:
numbers_tuple = (1,2,3,4,5)
numbers_list = [1,2,3,4,5]
# Добавим число в кортеж
numbers_tuple.append(6)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
in ()
3
4 # Добавим число в кортеж
----> 5 numbers_tuple.append(6)
AttributeError: 'tuple' object has no attribute 'append'
Ошибка появляется, потому что нельзя добавлять новые элементы в кортеж, что работает в случае со списками.
# Добавим число в список
numbers_list.append(6)
numbers_list.append(7)
numbers_list.append(8)
# Удалить число из списка
numbers_list.remove(7)
print(numbers_list)
[1, 2, 3, 4, 5, 6, 8]
Но зачем использовать этот тип данных, если он неизменяемый?
Кортежи не только предоставляют доступ только для чтения к элементам, но и работают быстрее списков. Рассмотрим в качестве примера следующий код:
>>> import timeit
>>> timeit.timeit('x=(1,2,3,4,5,6,7,8,9)', number=100000)
0.0018976779974764213
>>> timeit.timeit('x=[1,2,3,4,5,6,7,8,9]', number=100000)
0.019868606992531568
Какую роль играет неизменяемость в случае с кортежами?
Согласно официальной документации Python неизменяемый — это «объект с фиксированным значением», но в отношении кортежей «значение» — это чересчур размытый термин. Лучше использовать id
. id
определяет расположения объекта в памяти.
Рассмотрим подробнее:
# Кортеж 'n_tuple' со списком в качестве одного из его элементов.
n_tuple = (1, 1, [3,4])
# Элементы с одинаковым значением имеют одинаковый идентификатор.
id(n_tuple[0]) == id(n_tuple[1])
True
# Элементы с разным значением имеют разные идентификаторы.
id(n_tuple[0]) == id(n_tuple[2])
False
print(id(n_tuple[0]), id(n_tuple[2]))
4297148528, 4359711048
n_tuple.append(5)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
in ()
----> 1 n_tuple.append(5)
AttributeError: 'tuple' object has no attribute 'append'
Добавить элемент в кортеж нельзя, поэтому появляется последняя ошибка AttributeError. Вот почему эта структура данных неизменна. Но всегда можно сделать вот так:
n_tuple[2].append(5)
n_tuple
(1, 1, [3, 4, 5])
Это позволяет изменять оригинальный кортеж? Куда в таком случае делась их неизменяемость?
Суть в том, что id
списка в кортеже не меняется несмотря на добавленный в него элемент 5.
id(n_tuple[2])
4359711048
Теперь вы знаете следующее:
Некоторые кортежи (которые содержат только неизменяемые объекты: строки и так далее) — неизменяемые, а другие (содержащие изменяемые типы, например, списки) изменяемые. Но это очень обсуждаемая тема среди программистов на Python и необходимы кое-какие познания, чтобы полностью понять ее. В целом же кортежи неизменяемые.
- Вы не можете добавлять в них новые элементы. У этого типа нет методов
append()
илиextend()
- Удалять элементы тоже нельзя, также из-за неизменяемости. Методов
remove()
иpop()
здесь нет - Искать элементы в кортеже можно, потому что этот процесс его не меняет
- Разрешено использовать оператор
in
для проверки наличия элемента в кортеже
Так что если вы планируете использовать постоянный набор значений для перебора, используйте кортеж вместо списка. Он будет работать быстрее. Плюс, это безопаснее, ведь такой тип данных защищен от записи.
Если вы хотите узнать больше о списках Python, обязательно ознакомьтесь с этим руководством!
Стандартные операции с кортежами
Python предоставляет несколько способов для управления кортежами. Рассмотрим их на примерах.
Срезы
Значение индекса первого элемента в кортеже — 0
. По аналогии со списками эти значения можно использовать с квадратными скобками []
для получения доступа к кортежам:
numbers = (0,1,2,3,4,5)
numbers[0]
0
Можно использовать и отрицательные значения:
numbers[-1]
5
Индексы позволяют получать отдельные элементы, а с помощью срезов становятся доступны и подмножества. Для этого нужно использовать диапазоны индексов:
[Начальный индекст (включен):Конечный индекс (исключен):Частота]
Частота в данном случае является опциональным параметром, а его значение по умолчанию равно 1.
# Элемент с индексом 4 исключен
numbers[1:4]
(1, 2, 3)
# Это возвращает все элементы в кортеже
numbers[:]
(0, 1, 2, 3, 4, 5)
# Частота = 2
numbers[::2]
(0, 2, 4)
Совет: значение частоты может быть и негативным, чтобы развернуть кортеж.
numbers[::-1]
(5, 4, 3, 2, 1, 0)
Объединение кортежей
Можно объединять кортежи для создания нового объекта. Операция объединения выполняет конкатенацию двух кортежей.
x = (1,2,3,4)
y = (5,6,7,8)
# Объединение двух кортежей для формирования нового кортежа
z = x + y
print(z)
(1, 2, 3, 4, 5, 6, 7, 8)
y = [5,6,7,8]
z = x + y
print(z)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
1 y = [5,6,7,8]
----> 2 z = x + y
3 print(z)
TypeError: can only concatenate tuple (not "list") to tuple
Разрешается объединять только определенные типы данных. Так, попытка соединить кортеж и список закончится ошибкой.
Умножение кортежей
Операция умножения приводит к тому, что кортеж повторяется несколько раз.
x = (1,2,3,4)
z = x*2
print(z)
(1, 2, 3, 4, 1, 2, 3, 4)
Функции кортежей
В отличие от списков у кортежей нет методов, таких как append()
, remove()
, extend()
, insert()
или pop()
опять-таки из-за их неизменяемости. Но есть другие:
count() и len()
count()
возвращает количество повторений элемента в кортеже.
a = [1,2,3,4,5,5]
a.count(5)
2
len()
— длину кортежа:
a = (1,2,3,4,5)
print(len(a))
5
any()
Функцию any()
можно использовать, чтобы определить являются ли элементы кортежа итерируемыми. Если да, то она вернет True
.
a = (1,)
print(any(a))
True
Обратите внимание на запятую (,
) в объявлении кортежа a
. Если ее не указать при создании объекта с одним элементом? Python предположит, что вы по ошибке добавили лишнюю пару скобок (это ни на что не влияет), но тип данных в таком случае — это не кортеж. Поэтому важно не забывать использовать запятую при объявлении кортежа с одним элементом.
И снова к функции any
. В булевом контексте значение элемента не имеет значения. Пустой кортеж вернет False
, а кортеж с хотя бы одним элементом — True
.
b = ()
print(any(b))
False
Функция может быть полезной, если кортеж вызывается? и нужно удостовериться, что он не пустой.
tuple()
Функция tuple()
используется для конвертации данных в кортеж. Например, так можно превратить список в кортеж.
a_list = [1,2,3,4,5]
b_tuple = tuple(a_list)
print(type(b_tuple))
min() и max()
Функция max()
q возвращает самый большой элемент последовательности, а min()
— самый маленький. Возьмем следующий пример:
print(max(a))
print(min(a))
5
A
Эти функции можно использовать и для кортежей со строками.
# Строка «Apple» автоматически преобразуется в последовательность символов.
a = ('Apple')
print(max(a))
p
sum()
С помощью этой функции можно вернуть сумму элементов в кортеже. Работает только с числовыми значениями.
sum(a)
28
sorted()
Чтобы получить кортеж с отсортированными элементами, используйте sorted()
как в следующем примере:
a = (6,7,4,2,1,5,3)
sorted(a)
[1, 2, 3, 4, 5, 6, 7]
Но важно отметить, что возвращаемый тип — список, а не кортеж. При этом последовательность в оригинальном объекте неизменна, а сам он остается кортежем.
Присваивание несколько кортежей
Кортежи можно использовать для присваивания нескольких значений одновременно. Вот так:
a = (1,2,3)
(one,two,three) = a
print(one)
1
a
— это кортеж из трех элементов и (one, two, three)
— кортеж трех переменных. Присваивание (one, two, three)
кортежу a
присваивает каждое значение a
каждой переменной: one
, two
и three
по очереди. Это удобно, если нужно присвоить определенному количеству переменных значений в кортеже.
Выводы
Теперь вы знаете, что такое кортежи, как их создавать, какие самые распространенные операции, и как ими можно управлять. Также — распространенные методы структур Python. А в качестве бонуса научились присваивать нескольким переменным разные значения.
В этой статье вы узнаете всё о кортежах в Python. Что такое кортежи, как их создавать, когда их использовать и какие существуют методы кортежей.
Кортеж в Python похож на список. Только в отличие от списка кортеж — неизменяемый, то есть менять его элементы после создания нельзя.
Как создать кортеж
Чтобы создать кортеж, нужно поместить все элементы, разделенные запятыми, в круглые скобки ()
. Скобки не обязательны, но рекомендуем их использовать.
Кортеж может иметь любое количество элементов разных типов (целые числа, числа с плавающей точкой, списки, строки и т. д).
# Разные типы кортежей
# Пустой кортеж
my_tuple = ()
print(my_tuple)
# Кортеж с целыми числами
my_tuple = (1, 2, 3)
print(my_tuple)
# Кортеж с разными типами данных
my_tuple = (1, "Привет", 3.4)
print(my_tuple)
# Вложенный кортеж
my_tuple = ("мышь", [8, 4, 6], (1, 2, 3))
print(my_tuple)
Вывод:
()
(1, 2, 3)
(1, 'Привет', 3.4)
('мышь', [8, 4, 6], (1, 2, 3))
Кортеж можно создать и без использования скобок. Это называется упаковкой кортежа.
# упаковываем кортеж
my_tuple = 3, 4.6, "собака"
print(my_tuple)
# точно так же можно распаковать кортеж
a, b, c = my_tuple
print(a) # 3
print(b) # 4.6
print(c) # собака
Вывод:
(3, 4.6, 'собака')
3
4.6
собака
Если нужно создать кортеж с одним элементом, все немного сложнее. Дело в том, что одного элемента в круглых скобках недостаточно. Понадобится добавить в конец запятую — иначе Python не поймет, что это кортеж.
my_tuple = ("привет")
print(type(my_tuple)) # <class 'str'>
# Создаем кортеж с одним элементом
my_tuple = ("привет",)
print(type(my_tuple)) # <class 'tuple'>
# Можно и без скобок
my_tuple = "привет",
print(type(my_tuple)) # <class 'tuple'>
Вывод:
<class 'str'>
<class 'tuple'>
<class 'tuple'>
Как получить элемент кортежа
1. По индексу
Мы можем использовать оператор индекса []
, чтобы получить доступ к элементу кортежа.
Примечание. Обратите внимание, что индексирование кортежа начинается с 0. То есть первый элемент кортежа имеет индекс 0.
Кортеж из 9 элементов будет иметь индексы от 0 до 8. Попытка получить доступ к индексу за пределами диапазона индексов кортежа (в нашем случае 9, 10 и т. д.) приведет к ошибке IndexeError.
Индекс должен быть целым числом, поэтому мы не можем использовать float или другие типы в качестве индекса. Это приведет к ошибке TypeError.
Точно так же доступ к вложенным кортежам осуществляется с помощью вложенной индексации, как показано в примере ниже.
my_tuple = ('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
print(my_tuple[0]) # 'c'
print(my_tuple[5]) # 'h'
# Вызов print(my_tuple[9]) приведет к ошибке
# IndexError: list index out of range
# Вызов my_tuple[2.0] приведет к ошибке
# TypeError: list indices must be integers, not float
# Индекс должен быть целым числом
# вложенный кортеж
n_tuple = ("мышь", [8, 4, 6], (1, 2, 3))
# вложенное индексирование
print(n_tuple[0][3]) # 'ь'
print(n_tuple[1][1]) # 4
Вывод:
c
h
ь
4
2. По отрицательному индексу
Python допускает отрицательную индексацию коллекций (наборов значений). Она работает и с кортежами.
Индекс -1 отсылает к последнему элементу, -2 — ко второму элементу с конца и так далее.
my_tuple = ('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
# Вывод: 'k'
print(my_tuple[-1])
# Вывод: 'c'
print(my_tuple[-9])
Вывод:
k
c
3. С помощью срезов
Получить доступ к диапазону элементов в кортеже можно с помощью оператора срезов :
.
Использование срезов еще называют слайсингом, от английского slicing — «нарезка».
my_tuple = ('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
# элементы со 2 по 4
# Вывод: ('o', 'd', 'e')
print(my_tuple[1:4])
# элементы от начала и до второго элемента
# Вывод: ('c', 'o')
print(my_tuple[:-7])
# два последних элемента
# Вывод: ('c', 'k')
print(my_tuple[7:])
# все элементы от начала до конца
# Вывод: ('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
print(my_tuple[:])
Вывод:
('o', 'd', 'e')
('c', 'o')
('c', 'k')
('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
Как изменить кортеж
Никак. В отличие от списков, кортежи неизменяемы. Это значит, что элементы кортежа нельзя изменять после добавления в кортеж. Однако если элемент сам по себе является изменяемым типом данных (например, списком), его вложенные элементы менять уже можно.
Переназначить кортеж тоже можно.
my_tuple = (4, 2, 3, [6, 5])
# my_tuple[1] = 9
# Эта строка приведет к ошибке
# TypeError: 'tuple' object does not support item assignment
# Значения изменяемого элемента менять можно
my_tuple[3][0] = 9 # Вывод: (4, 2, 3, [9, 5])
print(my_tuple)
# Можно переназначить кортеж
my_tuple = ('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
# Вывод: ('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
print(my_tuple)
Вывод:
(4, 2, 3, [9, 5])
('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
В Python кортежи можно объединить с помощью оператора +
. Это называется конкатенацией.
С помощью оператора *
можно повторить элементы в кортеже заданное количество раз.
Оба оператора +
и *
приводят к созданию нового кортежа.
# Конкатенация
#Вывод: (1, 2, 3, 4, 5, 6)
print((1, 2, 3) + (4, 5, 6))
# Повторение
# Вывод: ('Повторить', 'Повторить', 'Повторить')
print(("Повторить",) * 3)
Вывод:
(1, 2, 3, 4, 5, 6)
('Повторить', 'Повторить', 'Повторить')
Как удалить кортеж
Изменять элементы кортежа нельзя. Это значит, что удалять их тоже нельзя.
В Python можно только полностью удалить кортеж — с помощью ключевого слова del
.
my_tuple = ('c', 'o', 'd', 'e', 'c', 'h', 'i', 'c', 'k')
# нельзя удалить элементы кортежа
# TypeError: 'tuple' object doesn't support item deletion
# del my_tuple[3]
# зато можно удалить кортеж полностью
del my_tuple
# вызов приведет к ошибке NameError: name 'my_tuple' is not defined
print(my_tuple)
Вывод:
Traceback (most recent call last):
File "<string>", line 12, in <module>
NameError: name 'my_tuple' is not defined
Методы кортежа
Методы добавления или удаления элементов недоступны для кортежа в силу его неизменяемости.
Для кортежа существует только два метода: .count()
и .index()
.
my_tuple = ('я', 'б', 'л', 'о', 'к', 'о',)
print(my_tuple.count('о')) # Вывод: 2
print(my_tuple.index('к')) # Вывод: 4
Вывод:
2
4
Другие операции с кортежами
1. Проверка на вхождение в кортеж
Мы можем проверить, существует ли тот или иной элемент в кортеже или нет, с помощью ключевого слова in
и not in
.
my_tuple = ('я', 'б', 'л', 'о', 'к', 'о',)
print('я' in my_tuple)
print('х' in my_tuple)
print('п' not in my_tuple)
Вывод:
True
False
True
2. Итерирование по кортежу
Для перебора элементов кортежа можно использовать цикл for
.
for name in ('Андрей', 'Маша'):
print("Привет, ", name)
Вывод:
Привет, Андрей
Привет, Маша
Преимущества кортежа над списком
Кортежи очень похожи на списки, поэтому они используются в похожих ситуациях. Выбор зависит от задачи. В одном случае эффективнее будет работать кортеж, а в другом — не обойтись без списка.