Найти в Дзене
programmer's notes (python and more)

Основы программирования на языке Python. Приложение к уроку 20. Кортежи

Оглавление

Доброго времени суток, читатели, зрители моего канала 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()

primer47.py
primer47.py

Текст программы

primer47.py

Конечно, мы можем добавлять элементы в кортеж например так

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