Что такое кортеж в программировании
Перейти к содержимому

Что такое кортеж в программировании

  • автор:

Кортеж

В математике корте́ж или n-ка (упорядоченная n-ка) — упорядоченный конечный набор длины n(где n— любое натуральное число либо 0), каждый из элементов которого x_iпринадлежит некоторому множеству X_i, 1\leqslant i \leqslant n. Элементы кортежа могут повторяться в нём любое число раз (этим, в частности, он отличается от упорядоченного множества, куда каждый элемент может входить только в одном экземпляре).

В математике кортеж обычно записывается перечислением элементов в круглых или угловых скобках.

В теории множеств кортеж обычно определяется индуктивно:

  • пустое множество — это кортеж (с нулевым количеством элементов);
  • для каждого кортежа (a_1, \ldots, a_n)=T, множество (a, a_1, \ldots, a_n)=\<a, \<a, T\>\>» width=»» height=»» /> также является кортежем.</li>
</ul>
<p>Элементы кортежа называются его компонентами, или координатами.</p><div class='code-block code-block-1' style='margin: 8px 0; clear: both;'>
<!-- 1seostattya -->
<script src=

Кортеж длины нуль называется пустым.

Частными случаями кортежа является (по числу элементов) упорядоченная пара, тройка, четвёрка.

Многие математические объекты формально определяются как кортежи. Например, Ориентированный граф определяется как кортеж (V,E), где V — это набор вершин, а E — подмножество V × V, обозначающее рёбра. Точка в n-мерном пространстве действительных чисел определяется как кортеж длины n, составленный из элементов множества действительных чисел.

В программировании

В некоторых языках программирования, например, Python или Lisp, кортеж — особый тип структуры данных. В языке C++ поддержка кортежей реализована как шаблон класса std::tuple [источник?] . В языке Python кортеж (англ. tuple ) отличается от списка тем, что элементы кортежа нельзя изменять.

thing = "rose" colour = "red" print "%s is %s" % (thing, colour) 

Эта программа на Python, использующая кортеж (thing, colour) , выведет: rose is red

В императивных языках множество аргументов подпрограммы описывается и передаётся кортежем.

Кортеж является стандартным типом в платформе .NET начиная с версии 4.0 [1]

В базах данных

В базах данных кортежем называется группа взаимосвязанных элементов данных. В реляционных базах данных кортеж — это элемент отношения, строка таблицы; упорядоченный набор из N элементов.

Примечания

Ссылки

Кортежи (tuple)

Python 3 логотип

Сегодня я расскажу о таком типе данных, как кортежи (tuple) и о том, где они применяются.

Кортеж, по сути — неизменяемый список.

Зачем нужны кортежи, если есть списки?

  • Защита от дурака. То есть кортеж защищен от изменений, как намеренных (что плохо), так и случайных (что хорошо).
  • Меньший размер. Дабы не быть голословным:

Как работать с кортежами?

С преимуществами кортежей разобрались, теперь встает вопрос — а как с ними работать. Примерно так же, как и со списками.

Создаем пустой кортеж:

    Создаем кортеж из одного элемента:
 
 
 

Ну и создать кортеж из итерируемого объекта можно с помощью все той же пресловутой функции tuple()

Операции с кортежами

Все операции над списками, не изменяющие список (сложение, умножение на число, методы index() и count() и некоторые другие операции). Можно также по-разному менять элементы местами и так далее.

Например, гордость программистов на python - поменять местами значения двух переменных:

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Кортежи

Кортежи (tuple) в Python – это те же списки за одним исключением. Кортежи неизменяемые структуры данных. Так же как списки они могут состоять из элементов разных типов, перечисленных через запятую. Кортежи заключаются в круглые, а не квадратные скобки.

>>> a = (10, 2.13, "square", 89, 'C') >>> a (10, 2.13, 'square', 89, 'C')

Из кортежа можно извлекать элементы и брать срезы:

>>> a[3] 89 >>> a[1:3] (2.13, 'square')

Однако изменять его элементы нельзя:

>>> a[0] = 11 Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment

Также у типа tuple нет методов для добавления и удаления элементов.

Возникает резонный вопрос. Зачем в язык программирования был введен этот тип данных, по-сути представляющий собой неизменяемый список? Дело в том, что иногда надо защитить список от изменений. Преобразовать же кортеж в список, если это потребуется, как и выполнить обратную операцию легко с помощью встроенных в Python функций list() и tuple() :

>>> a = (10, 2.13, "square", 89, 'C') >>> b = [1, 2, 3] >>> c = list(a) >>> d = tuple(b) >>> c [10, 2.13, 'square', 89, 'C'] >>> d (1, 2, 3)

Рассмотрим случай, когда уместно использовать кортежи. В Python изменяемые объекты передаются в функцию по ссылке. Это значит, что не создается копия объекта, а переменной-параметру присваивается ссылка на уже существующий объект. В итоге, если в теле функции объект изменяется, то эти изменения касаются глобального объекта.

def add_num(seq, num): for i in range(len(seq)): seq[i] += num return seq origin = [3, 6, 2, 6] changed = add_num(origin, 3) print(origin) print(changed)

Данная программа неправильная. Хотя никаких выбросов исключений не произойдет, она содержит логическую ошибку. На выводе получаем:

[6, 9, 5, 9] [6, 9, 5, 9]

То есть исходный список был также изменен. Параметр seq содержал ссылку не на свой локальный список, а на список-оригинал. Таким образом, в операторе return здесь нет смыла. Если функция замысливалась как изменяющая глобальный список, то программа должна выглядеть так:

def add_num(seq, num): for i in range(len(seq)): seq[i] += num origin = [3, 6, 2, 6] add_num(origin, 3) print(origin)

Что делать, если все же требуется не изменять исходный список, а сформировать по нему новый. Задачу можно решить несколькими способами. Во первых, в функции можно создать локальный список, после чего возвращать его:

def add_num(seq, num): new_seq = [] for i in seq: new_seq.append(i + num) return new_seq origin = [3, 6, 2, 6] changed = add_num(origin, 3) print(origin) print(changed)
[3, 6, 2, 6] [6, 9, 5, 9]

Исходный список в функции не меняется. Его элементы лишь перебираются.

Второй способ защитить список-оригинал – использовать кортеж. Этот способ более надежный, так как в больших программах трудно отследить, что ни одна функция не содержит команд изменения глобальных данных.

Хотя преобразовывать к кортежу можно как при передаче в функцию, так и в самой функции, лучше сразу делать глобальный список кортежем. Поскольку неизменяемые объекты передаются по значению, а не по ссылке, то в функцию будет поступать копия структуры, а не оригинал. Даже если туда передается оригинал, изменить его невозможно. Можно лишь, как вариант, скопировать его и/или изменить тип, создав тем самым локальную структуру, и делать с ней все, что заблагорассудится.

def add_num(seq, num): seq = list(seq) for i in range(len(seq)): seq[i] += num return seq origin = (3, 6, 2, 6) changed = add_num(origin, 3) print(origin) print(changed)

Списки в кортежах

Кортежи могут содержать списки, также как списки быть вложенными в другие списки.

>>> nested = (1, "do", ["param", 10, 20])

Как вы думаете, можем ли мы изменить список ["param", 10, 20] вложенный в кортеж nested ? Список изменяем, кортеж – нет. Если вам кажется, что нельзя, то вам кажется неправильно. На самом деле можно:

>>> nested[2][1] = 15 >>> nested (1, 'do', ['param', 15, 20])

Примечание. Выражения типа nested[2][1] используются для обращения к вложенным объектам. Первый индекс указывает на позицию вложенного объекта, второй – индекс элемента внутри вложенного объекта. Так в данном случае сам список внутри кортежа имеет индекс 2, а элемент списка 10 – индекс 1 в списке.

Странная ситуация. Кортеж неизменяем, но мы все-таки можем изменить его. На самом деле кортеж остается неизменяемым. Просто в нем содержится не сам список, а ссылка на него. Ее изменить нельзя. Но менять сам список можно.

Чтобы было проще понять, перепишем кортеж так:

>>> l = ["param", 10, 20] >>> t = (1, "do", l) >>> t (1, 'do', ['param', 10, 20])

Кортеж содержит переменную-ссылку. Поменять ее на другую ссылку нельзя. Но кортеж не содержит самого списка. Поэтому его можно менять как угодно:

>>> l.pop(0) 'param' >>> t (1, 'do', [10, 20])

Однако такой номер не проходит с неизменяемыми типами:

>>> a = "Kat" >>> t = (a, l) >>> t ('Kat', [10, 20]) >>> a = "Bat" >>> t ('Kat', [10, 20])

Они передаются в кортеж как и в функцию – по значению. То есть их значение копируется в момент передачи.

Практическая работа

  1. Чтобы избежать изменения исходного списка, не обязательно использовать кортеж. Можно создать его копию с помощью метода списка copy() или взять срез от начала до конца [:] . Скопируйте список первым и вторым способом и убедитесь, что изменение копий никак не отражается на оригинале.
  2. Заполните один кортеж десятью случайными целыми числами от 0 до 5 включительно. Также заполните второй кортеж числами от -5 до 0. Для заполнения кортежей числами напишите одну функцию. Объедините два кортежа с помощью оператора +, создав тем самым третий кортеж. С помощью метода кортежа count() определите в нем количество нулей. Выведите на экран третий кортеж и количество нулей в нем.

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Кортежи

Кортеж - это тип данных, являющийся аналогом записи или класса. Как запись или класс, кортеж представляет собой набор элементов разных типов, но описывается существенно проще. Кроме того, поля кортежа имеют предопределенные имена и являются неизменными: поменять поля кортежа после его создания невозможно.

Тип кортежа

Для типа кортежа используется следующая запись:

var t: (string,integer);

Данная запись похожа на объявление перечислимого типа. Если в круглых скобках - новые имена, то это перечислимый тип, а если имена типов, то это - тип кортежа.

Кортежи представляются типом System.Tuple платформы .NET:

var t: System.Tuple;

Однако данное представление может поменяться в будущем.

Конструирование значений типа кортеж

Значения типа кортеж могут быть сконструированы в виде заключенного в круглые скобки перечисления составляющих кортеж значений через запятую. Например:

t := ('Иванов',23);

Для построенных таким образом значений работает автовыведение типа:

var t1 := ('Иванов',(5,3,4)); // кортеж, вторым элементом которого является кортеж

Вывод кортежей

Как и при выводе записей, при выводе кортежей значения их элементов заключаются в круглые скобки и перечисляются через запятую:

writeln(t); // (Иванов,23)
writeln(t1); // (Иванов,(5,3,4))

Доступ к элементам кортежа

Элементы (поля) кортежа имеют имена Item1, Item2 и т.д.:

Print(t.Item1,t.Item2);

К элементам кортежа можно обращаться также по индексу:

Индексы должны быть константными выражениями.

После создания кортеж неизменен: его поля нельзя менять:

t[1] := 20; // ошибка

Кортежное присваивание (распаковка кортежа в переменные)

Значения типа кортеж можно распаковать в переменные соответствующих типов, используя кортежное присваивание:

var t := ('Иванов',23);
var name: string;
var age: integer;
(name,age) := t;

Последнее присваивание, где в левой части оператора присваивания используется заключенное в круглые скобки перечисление переменных, называется кортежным. Кортежное присваивание компилятор заменяет на несколько подряд идущих одиночных присваиваний:

name := t[0];
age := t[1];

С использованием кортежного присваивания меняется стиль программирования. Например, чтобы поменять местами значения двух переменных a и b, достаточно написать следующее кортежное присваивание:

В кортежном присваивании справа допускается количество элементов большее, чем количество переменных слева:

Кортежное присваивание можно совмещать с описанием переменных:

(var a, var b) := (1,2);

var (a,b) := (1,2);

Использование кортежей в функциях

Кортежи позволяют упаковывать несколько значений в одно. Это оказывается удобным если надо передавать несколько взаимосвязанных значений в качестве параметра или возвращать из функции несколько значений.

Например, функция, вычисляющая площадь и периметр прямоугольника, может быть записана в виде:

function SP(a,b: real) := (a*b,2*(a+b));

Чтобы воспользоваться результатом такой функции, удобно использовать распаковку кортежа в переменные с описанием:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *