Я не знал, что кортежи - это нечто большее, чем просто структура данных со скобками, которые обычно используются в операторе возврата. Кортежи - это довольно мощная структура данных. Мы рассмотрим кортежи и функцию Python namedtuple() factory из collections библиотеки с примерами для иллюстрации.

Синтаксис кортежа

Элементы могут быть любых типов - целые, строковые, списковые и т. Д.

Теперь давайте посмотрим на свойство кортежа, а затем посмотрим на него как на записи данных.

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

Мы также видели, что позиция переменной кортежа usa имеет значение - 0 для названия страны и 1 для названия столицы.

Учитывая это неизменное свойство кортежа, это идеальная структура данных для хранения данных - никаких побочных эффектов.

Давайте посмотрим на пример:

Здесь вы видите, что кортежи содержат данные о странах. Мы можем извлекать значения кортежа, используя переменные, которые их содержат. Мы используем *<variable-name> для наименования переменной, чтобы собрать более 1 значения, например, *rest и *prev_info в коде. Этот процесс также известен как распаковка кортежа.

При запуске файла получаем:

north america: [('United States of America', 'Washington, D.C.', 'Bald Eagle'), ('Canada', 'Otaawa', 'Canada Jay')]
country: Swaziland, capital: Mbabane, Lobamba, national bird: Purple-crested turaco
USA's national bird: Bald Eagle
Guyana's capital: Georgetown
usa: United States of America, rest info: ['Washington, D.C.', 'Bald Eagle']

Теперь давайте посмотрим на namedtuple фабричную функцию из collections библиотек Python.

namedtuple сочетает в себе подходы класса и кортежа, так что мы можем дать значимые имена для позиций.

Давайте посмотрим на пример:

Здесь мы создали кортеж с именем Rectangle, который имеет два поля - length и breadth. Мы можем получить доступ к значению кортежа Rectangle с помощью индекса или атрибута. Мы также можем распаковать его обычным способом.

Мы можем получить словарное представление кортежа, используя _asdict(). Мы можем создать новый экземпляр Rectangle, используя значения из существующего экземпляра. Для этого мы использовали распаковку словаря и распаковку позиционного аргумента.

При запуске файла получаем:

calculating area using indexing: 18
calculating area using attribute: 18
length: 9, breadth: 2
dict representation: {'length': 9, 'breadth': 2}
r2's initial id: 140454374705088
r2's  length: 9, breadth: 3
r2's id after replacing breadth value: 140454374705280
r3's lenght: 9, breadth: 2

Что, если мы хотим иметь значения по умолчанию для полей в namedtuple? У нас есть 2 способа сделать это - прототип и использование свойства __defaults__ кортежа.

Во-первых, давайте посмотрим на прототип:

При запуске файла получаем:

prototype circle's id: 140367016505888
area: 12.57, id: 140367016746416

Здесь при создании экземпляра Circle с именем circle_zer мы передали в поля значения по умолчанию. Помните, что как только мы начали передавать значения по умолчанию, он должен сделать это для всех оставшихся полей, которые идут после него. Это помогает устранить неоднозначность присвоения значения переменной для компилятора Python. Если вы не указали значения по умолчанию, вы получите positional argument ошибку.

Таким образом, экземпляр со значениями по умолчанию станет нашим прототипом. Мы можем создать экземпляр на основе прототипа, используя метод _replace. Поскольку кортежи являются неизменяемым типом последовательности, обратите внимание на то, что объект-прототип и новый экземпляр из прототипа имеют разные идентификаторы.

Второй способ - использовать свойство __defaults__.

Здесь мы использовали атрибут __defaults__ для передачи значений по умолчанию в поля в Circle кортеже. Значения по умолчанию передаются слева направо, поэтому, если бы мы просто передали 2 значения, они были бы установлены в поля origin_x и origin_y.

Он будет работать аналогично и по функциям:

Теперь давайте посмотрим на сценарий, в котором мы хотим расширить существующий кортеж Circle. Мы хотели бы добавить поле origin_z к Кругу, чтобы этот Круг работал в 3D-среде и стал Сферой. Мы можем сделать это, используя атрибут _fields кортежа, чтобы получить поля из 2D Circle и добавить новое поле origin_z. Затем следуйте обычному namedtuple способу установки и доступа к значениям кортежа.

Давайте посмотрим на пример:

При запуске файла получаем:

circle area: 28.27 at coordinate (1, 1)
sphere area: 113.10 at coordinate (1, 1, 1)

В заключении,

  • кортежи - это неизменная структура данных
  • кортежи могут работать как запись данных
  • у нас есть namedtuple фабричная функция для создания кортежа с именованными полями.

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

Поздравляю с завершением и благодарим за прочтение! 💐 Моя следующая статья будет о изменчивости и неизменности структур данных Python. Увидимся позже.

Вдохновение:

Вы можете поддержать меня на Патреоне!