Именованные кортежи Python: функция namedtuple для создания

В этом уроке вы узнаете, как использовать функцию namedtuple в Python для создания именованных кортежей.

Содержание

Что такое именованные кортежи в Python?

Ниже показан кортеж, состоящий из двух элементов:

point =(100,200)

Кортеж точек представляет собой двумерную точку, координата x которой равна 100, а координата y — 200.

Чтобы получить координаты x и y, вы можете использовать следующий синтаксис:

 x = point[0]
 y = point[1]

Этот код работает нормально. Однако это не так очевидно. Когда вы смотрите на точку[0], вам необходимо знать ее неявное значение, которое не упоминается в коде.

Чтобы сделать код более понятным, вы можете использовать класс. Например:

class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

И вы можете создать новый экземпляр Point2D:

a = Point2D(100, 200)

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

print(a.x)
print(a.y)

Чтобы сравнить две точки на предмет совпадения, вам необходимо реализовать метод __eq__:

class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        if isinstance(other, Point2D):
            return self.x == other.x and self.y == other.y
        return False

Метод __eq__ проверяет, является ли точка экземпляром класса Point2D, и возвращает True, если координаты x и y равны.

Ниже показано, как сравнить два экземпляра класса Point2D:

a = Point2D(100, 200)
b = Point2D(100, 200)

print(a is b)  # False
print(a == b)  # true

Point2D может работать так, как вы ожидали. Однако вам нужно написать много кода. Чтобы объединить простоту кортежа и очевидность класса, вы можете использовать именованный кортеж:

Именованный кортеж в Python

Именованные кортежи позволяют создавать кортежи и присваивать осмысленные имена позициям элементов кортежа. Технически именованный кортеж является подклассом кортежа. Кроме того, он добавляет имена свойств к позиционным элементам.

Создание именованных классов кортежей

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

Namedtuple — это функция, которая возвращает новый именованный класс кортежа. Другими словами, Nametuple() — это фабрика классов.

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

from collections import namedtuple

Функция Nametuple принимает следующие аргументы для создания класса:

  • Имя класса, указывающее имя именованного класса кортежа.
  • Последовательность имен полей, соответствующих элементам кортежей. Имена полей должны быть допустимыми именами переменных, за исключением того, что они не могут начинаться с подчеркивания(_).

Например, в следующем примере используется функция Nametuple для создания класса Point2D:

Point2D = namedtuple('Point2D',['x','y'])

Nametuple также может принимать имена полей как:

1) Кортеж строки:

Point2D = namedtuple('Point2D',('x','y'))

2) Или одну строку с именами полей, разделенными запятыми:

Point2D = namedtuple('Point2D',('x, y'))

3) Или одну строку с именами полей, разделенными пробелами.

Point2D = namedtuple('Point2D','x y')

Создание экземпляров именованных кортежей

Point2D — это класс, который является подклассом кортежа. И вы можете создавать новые экземпляры класса Point2D, как и обычный класс. Например:

point = Point2D(100, 200)

Или вы можете использовать аргументы ключевого слова:

point = Point2D(x=100, y=200)

Как создавать новые экземпляры класса Point2D в Python

Объект Point является экземпляром класса Point2D. Следовательно, это экземпляр класса кортежа:

print(isinstance(point, Point2D))  # True
print(isinstance(point, tuple))  # True

Доступ к данным именованного кортежа

Именованный кортеж — это обычный кортеж. Таким образом, вы можете применять все операции с кортежами к именованному кортежу.

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

  • Нарезка
  • Распаковка
  • Индексирование
  • Итерация

Например:

# unpacking
x, y = point
print(f'({x}, {y})')  #(100, 200)

# indexing
x = point[0]
y = point[1]
print(f'({x}, {y})')  #(100, 200)

# iterating

for coordinate in point:
    print(coordinate)

Выход:

(100, 200)
(100, 200)
100
200

Аргумент rename функции namedtuple

Функция Nametuple принимает аргумент rename, содержащий только ключевые слова, который позволяет переименовывать недопустимые имена полей.

Следующие действия приводят к ошибке, поскольку имя поля _radius начинается с подчеркивания(_):

from collections import namedtuple

Circle = namedtuple(
    'Circle',
    'center_x, center_y, _radius'
)

Однако когда вы используете аргумент rename, функция Nametuple автоматически переименовывает _radius в допустимое имя поля. Например:

from collections import namedtuple

Circle = namedtuple(
    'Circle',
    'center_x, center_y, _radius',
    rename=True
)

Чтобы найти имена полей именованного кортежа, вы можете использовать свойство класса _fields. Например:

print(Circle._fields)

Выход:

('center_x', 'center_y', '_2')

В этом примере функция Nametuple автоматически изменяет поле _radius на _2.

Дополнительные функции Python для именованных кортежей

Именованные кортежи изначально предоставляют некоторые полезные функции. Например, вы можете использовать оператор равенства(==) для сравнения двух именованных экземпляров кортежа:

a = Point2D(100, 200)
b = Point2D(100, 200)

print(a == b)  # True

Если вы используете этот класс, вам необходимо реализовать __eq__, чтобы получить эту функцию.

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

print(a)

Выход:

Point2D(x=100, y=200)

Опять же, если вы используете класс, вам необходимо реализовать метод __rep__.

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

print(max(a))  # 200
print(min(a))  # 100
Похожие посты
Добавить комментарий

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