Шрифт
элементу - задачи на списки python
Play

элементу - задачи на списки python

Что такое «названные кортежи» в Python? (7)

Читая изменения в Python 3.1 , я нашел что-то . неожиданное:

Кортеж sys.version_info теперь является именованным кортежем :

Раньше я никогда не слышал об именованных кортежах, и я думал, что элементы могут быть проиндексированы цифрами (например, в кортежах и списках) или ключами (например, в dicts). Я никогда не ожидал, что их можно индексировать в обоих направлениях.

Таким образом, мои вопросы:

  • Что называется кортежами?
  • Как их использовать?
  • Почему / когда я должен использовать именованные кортежи вместо обычных кортежей?
  • Почему / когда я должен использовать обычные кортежи вместо названных кортежей?
  • Есть ли какой-либо «именованный список» (измененная версия названного кортежа)?

Что называется кортежами?

Именованный кортеж является кортежем.

Он делает все, что кортеж может.

Но это больше, чем просто кортеж.

Это особый подкласс кортежа, который программно создан для вашей спецификации, с именованными полями и фиксированной длиной.

Это, например, создает подкласс кортежа, а кроме того, что он имеет фиксированную длину (в данном случае три), его можно использовать везде, где кортеж используется без нарушения. Это называется заменой Лыскова:

Это создает его:

Мы можем проверить его и использовать его атрибуты:

Более глубокое объяснение

Чтобы понять именованные кортежи, вам сначала нужно знать, что такое кортеж. Кортеж по существу является неизменным (не может быть изменен на месте в памяти).

Вот как вы можете использовать регулярный кортеж:

Вы можете развернуть кортеж с последовательной распаковкой:

Именованные кортежи - это кортежи, которые позволяют обращаться к своим элементам по имени, а не только по индексу!

Вы делаете namedtuple следующим образом:

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

Как их использовать?

Вы можете делать все, что может сделать кортеж (см. Выше), а также сделать следующее:

Один комментатор спросил:

В большом скрипте или программе, где обычно определяется именованный кортеж?

Типы, которые вы создаете с помощью namedtuple - это в основном классы, которые вы можете создать с легкой сокращенностью. Рассматривайте их как классы. Определите их на уровне модуля, чтобы маринованные и другие пользователи могли их найти.

Рабочий пример на глобальном уровне модуля:

И это демонстрирует неспособность найти определение:

Почему / когда я должен использовать именованные кортежи вместо обычных кортежей?

Используйте их, когда он улучшает ваш код, чтобы иметь семантику элементов кортежа, выраженных в вашем коде. Вы можете использовать их вместо объекта, если в противном случае вы использовали бы объект с неизменными атрибутами данных и без каких-либо функций. Вы также можете подклассифицировать их, чтобы добавить функциональность, например :

Почему / когда я должен использовать обычные кортежи вместо названных кортежей?

Вероятно, было бы регрессией перейти от использования названных кортежей к кортежам. Предварительное дизайнерское решение сосредотачивается вокруг того, стоит ли стоимость дополнительного входящего кода, чтобы улучшить читаемость при использовании кортежа.

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

Есть ли какой-либо «именованный список» (измененная версия названного кортежа)?

Вы ищете либо слот-объект, который реализует все функции статического размера, либо список подкласса, который работает как именованный кортеж (и это каким-то образом блокирует список из-за изменения размера).

Теперь расширенный и, возможно, даже Лисков заменяемый пример первого:

И использовать, просто подкласс и определить __slots__ :

namedtuple

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

Не называя каждый элемент в кортеже, он читал бы так:

Намного сложнее понять, что происходит в первом примере. С namedtuple каждое поле имеет имя. И вы получаете доступ к нему по имени, а не по позиции или индексу. Вместо p[1] мы можем назвать это p.saturation. Это легче понять. И он выглядит чище.

Создание экземпляра namedtuple проще, чем создание словаря.

Когда вы можете использовать namedtuple

  1. Как только что было сказано, именованный элемент упрощает понимание кортежей. Поэтому, если вам нужно ссылаться на элементы в кортеже, то создание их как namedtuples имеет смысл.
  2. Кроме того, что он более легкий, чем словарь, namedtuple также сохраняет порядок в отличие от словаря.
  3. Как и в примере выше, проще создать экземпляр namedtuple, чем словарь. И ссылка на элемент в названном кортеже выглядит более понятным, чем словарь. p.hue а не p['hue'] .
  • namedtuple находится в библиотеке коллекций.
  • typename: Это имя нового подкласса кортежа.
  • field_names: последовательность имен для каждого поля. Это может быть последовательность, как в списке ['x', 'y', 'z'] или string xyz (без запятых, просто пробелов) или x, y, z .
  • rename: Если переименовать True , недопустимые имена полей автоматически заменяются позиционными именами. Например, ['abc', 'def', 'ghi','abc'] преобразуется в ['abc', '_1', 'ghi', '_3'] , исключая ключевое слово 'def' (так как - зарезервированное слово для определения функций) и дублирующее поле 'abc' .
  • verbose: Если verbose is True , определение класса печатается непосредственно перед его построением.

Вы можете по-прежнему обращаться к namedtuples по их позиции, если вы так решите. p[1] == p.saturation . Он по-прежнему распаковывается, как обычный кортеж.

методы

Поддерживаются все обычные кортежи . Ex: min (), max (), len (), in, not in, concatenation (+), index, slice и т. Д. И есть несколько дополнительных для namedtuple. Примечание: все они начинаются с подчеркивания. _replace , _make , _asdict .

_replace Возвращает новый экземпляр именованного кортежа, заменяя указанные поля новыми значениями.

Примечание : имена полей не указаны в кавычках; они являются ключевыми словами здесь. Помните : кортежи неизменяемы - даже если они именованы и имеют метод _replace . _replace создает new экземпляр; он не изменяет оригинал или не заменяет старое значение. Конечно, вы можете сохранить новый результат в переменной. p = p._replace(hue=169)

_make

Создает новый экземпляр из существующей последовательности или повторяется.

Что случилось с последним? Элемент внутри скобки должен быть итерируемым. Таким образом, список или кортеж внутри скобок работает, но последовательность значений без включения в качестве итерации возвращает ошибку.

_asdict

Возвращает новый OrderedDict который сопоставляет имена полей с их соответствующими значениями.

Существует также именованный список, похожий на именованный кортеж, но изменяемый https://pypi.python.org/pypi/namedlist

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

Использование named tuple будет непосредственно применяться к шаблону класса по умолчанию для создания простого класса, этот метод позволяет много кода улучшить читаемость, а также очень удобно при определении класса.

Все остальные уже ответили на это, но я думаю, что мне еще есть что добавить.

Namedtuple можно было интуитивно считать ярлыком для определения класса.

См. Громоздкий и обычный способ определения class .

Что касается namedtuple

В принципе, namedtuples легко создавать, облегчают типы объектов. Они превращают кортежи в удобные контейнеры для простых задач. С namedtuples вам не нужно использовать целочисленные индексы для доступа к членам кортежа.

Что такое namedtuple?

Как следует из названия, namedtuple является кортежем с именем. В стандартном кортеже мы обращаемся к элементам с помощью индекса, тогда как namedtuple позволяет пользователю определять имя для элементов. Это очень удобно, особенно обрабатывать файлы csv (значения, разделенные запятой) и работать со сложным и большим набором данных, где код становится беспорядочным с использованием индексов (не так pythonic).

Как их использовать?

Используя именованный кортеж, он становится более читаемым:

Однако названные кортежи по-прежнему обратно совместимы с обычными кортежами, поэтому все еще будут работать:

Таким образом, вы должны использовать именованные кортежи вместо кортежей, где бы вы ни думали, что обозначение объекта сделает ваш код более питоновым и более легко читаемым . Я лично начал использовать их для представления очень простых типов значений, особенно при передаче их в качестве параметров функций. Это делает функции более читабельными, не видя контекста упаковки кортежа.

Кроме того, вы также можете заменить обычные неизменяемые классы, у которых нет функций , только поля с ними. Вы даже можете использовать свои названные типы кортежей в качестве базовых классов:

Однако, как и в случае с кортежами, атрибуты в названных кортежах неизменяемы:

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

Однако я не знаю какой-либо формы «именованного списка», которая позволяет добавлять новые поля. Вы можете просто использовать словарь в этой ситуации. Именованные кортежи могут быть преобразованы в словари, используя pt1._asdict() который возвращает и может работать со всеми обычными функциями словаря.

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

📎📎📎📎📎📎📎📎📎📎