Именованные кортежи - это, в основном, простые в создании, легкие типы объектов. На именованные экземпляры кортежей можно ссылаться, используя объектную переменную разыменования или стандартный синтаксис кортежей. Они могут использоваться аналогично struct
или другим распространенным типам записей, за исключением того, что они являются неизменяемыми. Они были добавлены в Python 2.6 и Python 3.0, хотя есть рецепт для реализации в Python 2.4 .
Например, принято представлять точку в виде кортежа (x, y)
. Это приводит к коду, подобному следующему:
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
Используя именованный кортеж, он становится более читабельным:
from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
Однако именованные кортежи по-прежнему обратно совместимы с обычными кортежами, поэтому следующее будет работать:
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
# use tuple unpacking
x1, y1 = pt1
Таким образом, вы должны использовать именованные кортежи вместо кортежей везде, где вы думаете, что объектная нотация сделает ваш код более понятным и более легко читаемым . Я лично начал использовать их для представления очень простых типов значений, особенно при передаче их в качестве параметров функциям. Это делает функции более читабельными, не видя контекста упаковки кортежей.
Кроме того, вы также можете заменить обычные неизменяемые классы, которые не имеют функций , только поля с ними. Вы даже можете использовать ваши именованные типы кортежей в качестве базовых классов:
class Point(namedtuple('Point', 'x y')):
[...]
Однако, как и в случае кортежей, атрибуты в именованных кортежах неизменны:
>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute
Если вы хотите иметь возможность изменять значения, вам нужен другой тип. Существует удобный рецепт для изменяемых типов записей, которые позволяют вам устанавливать новые значения для атрибутов.
>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
2.0
Я не знаю ни о какой форме "именованного списка", которая позволяет вам добавлять новые поля. Вы можете просто захотеть использовать словарь в этой ситуации. Именованные кортежи могут быть преобразованы в словари, используя pt1._asdict()
которые возвращаются {'x': 1.0, 'y': 5.0}
и могут работать со всеми обычными функциями словаря.
Как уже отмечалось, вы должны проверить документацию для получения дополнительной информации, из которой были построены эти примеры.
__slots__
typing.NamedTuple
который учитывает подсказки типов и особенно удобен для создания подклассов.namedtuple - это фабричная функция для создания класса кортежей. С помощью этого класса мы можем создавать кортежи, которые также могут вызываться по имени.
источник
namedtuple is a factory function for making a tuple class.
это, вероятно, единственный правильный ответ здесь: PИменованный кортеж - это кортеж.
Он делает все, что может кортеж.
Но это больше, чем просто кортеж.
Это определенный подкласс кортежа, который программно создается по вашей спецификации с именованными полями и фиксированной длиной.
Это, например, создает подкласс кортежа, и кроме того, что он имеет фиксированную длину (в данном случае три), он может использоваться везде, где кортеж используется без разрывов. Это называется заменяемостью по Лискову.
Новое в Python 3.6 , мы можем использовать определение класса
typing.NamedTuple
для создания именованного кортежа:Выше указано то же самое, что и ниже, за исключением того, что выше также имеет аннотации типов и строку документации. Ниже доступно в Python 2+:
Это создает его:
Мы можем проверить его и использовать его атрибуты:
Более глубокое объяснение
Чтобы понять именованные кортежи, сначала нужно знать, что такое кортеж. Кортеж по сути является неизменным (не может быть изменен на месте в памяти) списком.
Вот как вы можете использовать обычный кортеж:
Вы можете расширить кортеж с повторяемой распаковкой:
Именованные кортежи - это кортежи, которые позволяют обращаться к их элементам по имени, а не только по индексу!
Вы делаете именованный кортеж так:
Вы также можете использовать одну строку с именами, разделенными пробелами, чуть более удобочитаемое использование API:
Вы можете делать все, что могут делать кортежи (см. Выше), а также делать следующее:
Комментатор спросил:
Типы, которые вы создаете с
namedtuple
, в основном являются классами, которые вы можете создавать с помощью простых сокращений. Относитесь к ним как к классам. Определите их на уровне модуля, чтобы маринованные и другие пользователи могли их найти.Рабочий пример на уровне глобального модуля:
И это демонстрирует неспособность найти определение:
Используйте их, когда это улучшает ваш код, чтобы семантика элементов кортежа была выражена в вашем коде.
Вы можете использовать их вместо объекта, если вы иначе использовали бы объект с неизменными атрибутами данных и без функциональности.
Вы также можете разделить их на подклассы для добавления функциональности, например :
Вероятно, было бы регрессией перейти от использования именованных кортежей к кортежам. Первоначальное решение по проектированию сосредотачивается вокруг того, стоит ли затраты на дополнительный код улучшенной читаемости при использовании кортежа.
Нет никакой дополнительной памяти, используемой именованными кортежами против кортежей.
Вы ищете объект с прорезями, который реализует все функциональные возможности списка статического размера, или подклассовый список, который работает как именованный кортеж (и который каким-то образом блокирует список от изменения размера).
А теперь расширенный и, возможно, даже подменный Лисков, пример первого:
А чтобы использовать, просто подкласс и определить
__slots__
:источник
namedtuples - отличная особенность, они являются идеальным контейнером для данных. Когда вам нужно «хранить» данные, вы должны использовать кортежи или словари, например:
или:
Подход словаря является подавляющим, так как dict изменчив и медленнее, чем кортежи. С другой стороны, кортежи являются неизменяемыми и легковесными, но им не хватает читабельности для большого числа записей в полях данных.
Именованные кортежи являются идеальным компромиссом для двух подходов, они имеют отличную читаемость, легкость и неизменность (плюс они полиморфны!).
источник
ntuple.foo
vsntuple[1]
последний намного быстрее. Подробнее об этом: stackoverflow.com/questions/2646157/…именованные кортежи обеспечивают обратную совместимость с кодом, который проверяет версию, подобную этой
позволяя будущему коду быть более явным с помощью этого синтаксиса
источник
namedtuple
это один из самых простых способов очистить ваш код и сделать его более читабельным. Он самодокументирует, что происходит в кортеже. Экземпляры именных кортежей так же эффективны в плане памяти, как и обычные кортежи, поскольку у них нет словарей для каждого экземпляра, что делает их быстрее, чем словари.
Не называя каждый элемент в кортеже, он будет выглядеть так:
Намного сложнее понять, что происходит в первом примере. С именованным кортежем каждое поле имеет имя. И вы получаете доступ к нему по имени, а не по позиции или индексу. Вместо этого
p[1]
мы можем назвать это p.saturation. Это легче понять. И это выглядит чище.Создать экземпляр namedtuple проще, чем создать словарь.
Когда вы можете использовать namedtuple
p.hue
а неp['hue']
.Синтаксис
['x', 'y', 'z']
или строкиx y z
(без запятых, только пробелы) илиx, y, z
.True
, недопустимые имена полей автоматически заменяются позиционными именами. Например,['abc', 'def', 'ghi','abc']
преобразуется в['abc', '_1', 'ghi', '_3']
, исключая ключевое слово'def'
(так как это зарезервированное слово для определения функций) и дублирующее имя поля'abc'
.True
, определение класса печатается непосредственно перед сборкой.Вы по-прежнему можете получить доступ к именованным кортежам по их позиции, если вы того пожелаете.
p[1] == p.saturation
, Он все еще распаковывается как обычный кортеж.методы
Все обычные методы кортежа поддерживаются. Пример: min (), max (), len (), in, not in, конкатенация (+), index, slice и т. Д. И есть несколько дополнительных для namedtuple. Примечание: все они начинаются с подчеркивания.
_replace
,_make
,_asdict
._replace
Возвращает новый экземпляр именованного кортежа, заменяя указанные поля новыми значениями.Синтаксис
пример
Примечание : имена полей не в кавычках; они являются ключевыми словами здесь. Помните : кортежи являются неизменяемыми - даже если они являются именованными кортежами и имеют
_replace
метод._replace
Производитnew
экземпляр; он не изменяет оригинал и не заменяет старое значение. Конечно, вы можете сохранить новый результат в переменной.p = p._replace(hue=169)
_make
Делает новый экземпляр из существующей последовательности или повторяемой.
Синтаксис
пример
Что случилось с последним? Элемент внутри скобки должен быть повторяемым. Таким образом, список или кортеж внутри круглых скобок работает, но последовательность значений без включения в качестве итерируемого возвращает ошибку.
_asdict
Возвращает новый OrderedDict который сопоставляет имена полей с их соответствующими значениями.
Синтаксис
пример
Ссылка : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/
Также есть именованный список, который похож на именованный кортеж, но изменяемый https://pypi.python.org/pypi/namedlist
источник
_
!Что такое именованный кортеж?
Как следует из названия, namedtuple - это кортеж с именем. В стандартном кортеже мы получаем доступ к элементам, используя индекс, тогда как namedtuple позволяет пользователю определять имя для элементов. Это очень удобно, особенно при обработке файлов csv (с разделенными запятыми значениями) и работе со сложным и большим набором данных, когда код становится беспорядочным с использованием индексов (не так уж пифонических).
Как их использовать?
чтение
Интересный сценарий обработки CSV:
источник
Внутри Python хорошо используется контейнер, называемый именованным кортежем, он может использоваться для создания определения класса и обладает всеми функциями исходного кортежа.
Использование именованного кортежа будет напрямую применено к шаблону класса по умолчанию для генерации простого класса, этот метод позволяет много кода улучшить читаемость, и это также очень удобно при определении класса.
источник
Другой способ (новый способ) использования именованного кортежа - это использование NamedTuple из набора текста: подсказки типа в namedtuple
Давайте рассмотрим пример верхнего ответа в этом посте, чтобы узнать, как его использовать.
(1) Перед использованием именованного кортежа код выглядит так:
(2) Теперь мы используем именованный кортеж
наследовать класс NamedTuple и определить имя переменной в новом классе. test - это название класса
создавать экземпляры из класса и присваивать им значения
использовать переменные из экземпляров для расчета
источник
Попробуй это:
В основном,
namedtuples
легко создавать легкие типы объектов. Они превращают кортежи в удобные контейнеры для простых задач. При этомnamedtuples
вам не нужно использовать целочисленные индексы для доступа к членам кортежа.Примеры:
Код 1:
Код 2:
источник
Все остальные уже ответили, но я думаю, что мне еще есть что добавить.
Namedtuple может быть интуитивно понят как ярлык для определения класса.
Смотрите громоздкий и традиционный способ определения
class
.Что касается
namedtuple
источник
red_duck[0]
илиlen(red_duck)
илиfor x in red_duck: print(x)
. Кроме того, именованные кортежи являются неизменяемыми, поэтому эти операции завершатся с ошибкой:red_duck[0] = 2
,red_duck.foo = 'bar'
. Поскольку они являются неизменяемыми, именованные кортежи могут использоваться в качествеdict
ключей.