Перейти к содержимому

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

  • автор:

Кортеж

В математике корте́ж или 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>
<p>Кортеж длины нуль называется пустым.</p>
<p>Частными случаями кортежа является (по числу элементов) упорядоченная пара, тройка, четвёрка.</p>
<p>Многие математические объекты формально определяются как кортежи. Например, Ориентированный граф определяется как кортеж (<i>V</i>,<i>E</i>), где <i>V</i> — это набор вершин, а <i>E</i> — подмножество <i>V</i> × <i>V</i>, обозначающее рёбра. Точка в n-мерном пространстве действительных чисел определяется как кортеж длины n, составленный из элементов множества действительных чисел.</p>
<h3>В программировании</h3>
<p>В некоторых языках программирования, например, Python или Lisp, кортеж — особый тип структуры данных. В языке C++ поддержка кортежей реализована как шаблон класса std::tuple [<i>источник?</i>] . В языке Python кортеж (англ. <i>tuple</i> ) отличается от списка тем, что элементы кортежа нельзя изменять.</p>
<pre>thing <span >=</span> <span > 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 не будет опубликован. Обязательные поля помечены *