Доброго времени суток, читатели, зрители моего канала programmer's notes.
Дополнение к уроку
Кортежи в языке программирования Python
Некоторые соображения
Кортежи в языке Python это особый момент. Меня часто спрашивали, а зачем кортежи, если есть списки. Так вот, есть только одна причина, по которой без кортежей никак. Это ключи к словарям. Ключами в словарях могут быть числа, строки и кортежи. Это так называемые неизменяемые типы. Переменную неизменяемого типа можно "изменить" только создав новое значение для нее. Например
a = 10
a = a + 1
При этом во второй строке переменная a будет указывать уже на другой объект целого типа. Аналогично для строковых типов. При этом нельзя изменить символ в строке, не создав новую строку. Если переменная s строкового типа, то нельзя, например, написать s[0] = 'q' , это вызовет ошибку. Можно написать только
s = 'q' + s[1:]
но мы получим уже новый объект, на который указывает переменная s.
Аналогично, содержимое кортежа менять нельзя. Можно лишь создать новый кортеж. В остальном кортеж очень похож на список.
Есть еще две причины, по которым используют кортежи вместо списков. Но эти причины уже не являются обязательными.
1. Безопасность. Кортежи можно использовать в качестве констант, т.е. обезопасив себя и других, от случайных изменений.
2. В некоторых операциях использование кортежей ведет к ускорению работы программы.
Задать кортеж
Задать кортеж можно перечисли его элементы. Например так
dp = (3, 4, 'q')
равносильный вариант
dp = 3, 4, 'q'
Т.е. круглые скобки при определении кортежа необязательны.
Кортеж, состоящий из одного элемента
tp = (4,)
или
tp = 4,
Запятая нужно, чтобы отличить кортеж от арифметического выражения.
Пустой кортеж
tp = ()
или
tp = tuple()
Функция tuple() может быть использована, чтобы получить кортеж из другой коллекции.
Например так, из множества
st = {4, 5, 7, 8}
tp = tuple(st)
print(tp)
Результат выполнения
(8, 4, 5, 7)
Надеюсь, понятно, почему порядок элементов не совпадает с начальным
Список элементов
К элементам кортежа можно обращаться с помощью индекса. При чем как и в случае со списками используются квадратные скобки. Например tp[2] - элемент с индексом 2. Но нельзя присвоить значение элементу кортежа.
Запись вида
tp[1] = 3
является для кортежей ошибкой.
Пример вывода элементов кортежа приведен в программе. Заметим, что для кортежей по-прежнему работает функция len()
Текст программы
Конечно, мы можем добавлять элементы в кортеж например так
tp = tp + (45,)
но в результате данного действия создается новый кортеж, а старый удаляется из памяти. Т.е. назвать это добавлением элемента в кортеж в сущности будет неточностью. С точки зрения безопасности, однако, это некоторый "прокол", потому что имя переменной осталось тем же, а содержимое, которое скрывается за этой переменной изменилось.
Но есть еще примеры "похлеще".
tp = (1, [4, 5])
Т.е. элементом кортежа является список. А что если написать так
tp[1].append(10)
оказывается содержимое списка изменится, при этом нового кортежа создано не будет.
Детали, детали и еще раз детали, когда мы изучаем языки программирования.
Упаковка и распаковка
Запись типа
tp = (4, 2, 7, 8)
называется упаковкой кортежа. Другими словами кортеж (справа) мы упаковываем в переменную (слева).
Но есть обратная операция, распаковка.
tp = (3, 2, 1)
a, b, c = tp
Во второй строке мы распаковываем кортеж, т.е. присваиваем переменным значения элементов кортежа.
Что интересно. Запись, типа
b, a = a, b
которую мы все любим и которая выполняет действие по обмену значениями между переменными a и b, это распаковка кортежа, что справа. Вот и все.
Срезы
Для кортежей справедливо использование срезов. Для их написания также используются квадратные скобки. Но срез не может фигурировать слева от знака равенства, как это возможно для списков.
kr = 1, 2, 3, 4, 5
print(kr[0::2])
Результат выполнения фрагмента будет
(1, 3, 5)
Методы и функции
Как я уже написал, для кортежей можно использовать функцию len(), для определения количества элементов в нем. Но можно и сортировать кортежи с помощью sorted(), не забывая, что в результате получается список, а чтобы вернуться к кортежу используем функцию tuple(). Вот так
kr1 = 10, 2, 3, 4, 5
kr1 = tuple(sorted(kr1, reverse=True))
print(kr1)
Результат выполнения
(10, 5, 4, 3, 2)
Как можно догадаться, с кортежем можно использовать известные функции: sum() - получить сумму элементов, max() - получить максимальный элемент, min() - получить минимальный элемент.
Для получения информации о том, есть такой-то элемент в кортеже или нет, можно использовать:
1. Оператор in
tp = (3, 2, 1, 5, 7, 8, 4)
print((4 in tp))
Результат выполнения
True
2. Можно использовать метод count()
tp = (3, 2, 1, 5, 7, 8, 4, 7)
print(tp.count(7))
Результат выполнения фрагмента
2
3. Наконец есть еще метод index().
С помощью этого метода можно найти все вхождения элемента в кортеж.
Метод имеет три аргумента: элемент, который ищем в кортеже, начало поиска (не обязательно), конец поиска (необязательно).
Например, tp.index(1) - ищет первое вхождение элемента 1 в кортеже tp. Поиск осуществляется с самого первого элемента кортежа. Метод возвращает индекс найденного элемента.
Нужно не забывать, что метод index() выбрасывает исключение, если элемент не найден. Поэтому или
1. в начале стоит проверить, что элемент в кортеже есть;
2. обработать исключение с помощью try...except.
Замечание
Не забываем, три известные нами коллекции: списки, множества, кортежи могут переходить друг в друга с помощью известных функций list(), set(), tuple(). Также функции tuple() может из строки получить кортеж символов. Подобным образом, как уже знали ведут себя функции list() и set().
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.
#программирование #языки программирования #программисты #python