Именованные кортежи Python: функция namedtuple для создания
В этом уроке вы узнаете, как использовать функцию namedtuple в Python для создания именованных кортежей.
- Что такое именованные кортежи в Python?
- Создание именованных классов кортежей
- Создание экземпляров именованных кортежей
- Доступ к данным именованного кортежа
- Аргумент rename функции 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 может работать так, как вы ожидали. Однако вам нужно написать много кода. Чтобы объединить простоту кортежа и очевидность класса, вы можете использовать именованный кортеж:
Именованные кортежи позволяют создавать кортежи и присваивать осмысленные имена позициям элементов кортежа. Технически именованный кортеж является подклассом кортежа. Кроме того, он добавляет имена свойств к позиционным элементам.
Создание именованных классов кортежей
Чтобы создать именованный класс кортежа, вам понадобится функция 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)
Объект 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