Рубріки: Основы

Что такое именованные кортежи (namedtuple) в Python

Дмитро Сімагін

Именованные кортежи (namedtuple) — это расширение стандартных кортежей (tuples) в языке Python, предоставляемое модулем collections. Благодаря им можно обращаться к элементам не только по индексу, как в обычных кортежах, но и по именам полей. Так вы улучшаете код, делая его читабельным при работе с такими данными, как координаты или списки людей.

Особенности именованных кортежей

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

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

1. Импорт и создание именованного кортежа

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

from collections import namedtuple

# Создание типа кортежа Point с полями x и y
Point = namedtuple('Point', ['x', 'y'])

# Создание экземпляра Point
p = Point(100, 200)

 

2. Доступ к полям по имени

После создания объекта такого кортежа вы можете обратиться к полям по наименованию, примерно также, как к атрибутам:

print(p.x)  # Вывод: 100
print(p.y)  # Вывод: 200

 

3. Доступ к полям по индексу

Так как именованные кортежи основаны на стандартных кортежах, это обеспечивает доступность к элементам по индексу:

print(p[0])  # Вывод: 100
print(p[1])  # Вывод: 200

 

4. Использование с распаковкой

Именованные кортежи поддерживают распаковку, как стандартные кортежи:

x, y = p
print(x)  # Вывод: 100
print(y)  # Вывод: 200

 

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

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

  • _make() — создает именованный кортеж из переданного списка или итератора.
data = [30, 40]
p2 = Point._make(data)
print(p2)  # Выведет: Point(x=30, y=40)

 

  • _asdict() — возвращает словарь, где ключи — это имена полей, а значения — их значения.
print(p._asdict())  # Выведет: {'x': 10, 'y': 20}

 

  • _replace() — возвращает новый экземпляр кортежа, заменяя указанные поля.
p3 = p._replace(x=50)
print(p3)  # Выведет: Point(x=50, y=20)

 

  • _fields — возвращает список с именами полей.
print(Point._fields)  # Выведет: ('x', 'y')

 

Как применять именованные кортежи

Предположим, нам нужно обработать информацию о погоде в Нью-Йорке. Благодаря навыкам работы с именованными кортежами это можно сделать следующим образом:

from collections import namedtuple

# Именованный кортеж для хранения данных о погоде
Weather = namedtuple('Weather', ['city', 'temperature', 'condition'])

# Создаем несколько записей
weather_today = Weather(city="New York", temperature=25, condition="Sunny")
weather_yesterday = Weather(city="New York", temperature=22, condition="Cloudy")

# Доступ к полям
print(f"Сегодня в {weather_today.city} температура {weather_today.temperature}°C и {weather_today.condition}.")
# Выведет: Сегодня в New York температура 25°C и Sunny.

# Сравнение данных
if weather_today.temperature > weather_yesterday.temperature:
    print("Сегодня теплее, чем вчера.")
else:
    print("Сегодня холоднее, чем вчера.")

 

Вот еще один пример. Здесь мы работаем с банковскими счетами.

from collections import namedtuple

# Именованный кортеж для банковского счета
BankAccount = namedtuple('BankAccount', ['account_number', 'holder_name', 'balance'])

# Создаем несколько счетов
account1 = BankAccount('123456', 'John Doe', 1500.0)
account2 = BankAccount('654321', 'Jane Doe', 2500.0)

# Доступ к данным счета
print(f"Владелец счета {account1.account_number}: {account1.holder_name}, баланс: ${account1.balance}")
# Выведет: Владелец счета 123456: John Doe, баланс: $1500.0

# Проверка баланса и замена
if account1.balance < 2000:
    updated_account1 = account1._replace(balance=2000.0)
    print(f"Баланс обновлен: ${updated_account1.balance}")  # Выведет: Баланс обновлен: $2000.0

 

Именованные кортежи — за и против

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

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

  1. Когда требуется изменяемость данных. Поскольку именованные кортежи неизменяемы (immutable), они не подходят, когда необходимо изменить значения атрибутов. В этом случае лучше использовать такие структуры, как словарь (dict) или класс.
  2. Когда структура данных сложная. Именованные кортежи хороши для структур данных, где всего нескольких полей. Но при наличии объекта с несколькими уровнями вложенности лучше использовать обычные классы.
  3. Когда нужны методы или логика. Если нужно добавить методы для обработки данных, тут больше подходят классы, поскольку именованные кортежи не поддерживают поведение объектов в виде методов.
  4. Когда количество полей может изменяться. При работе с изменяемой структурой данных и неокончательным количеством полей лучше отказаться от именованных кортежей, так как при создании они требуют четко заданного набора полей. В таких случаях лучше использовать словарь (dict).
  5. Когда важна производительность в большом количестве объектов. Если ваша программа работает с большим количеством объектов, обратите свое внимание на другие структуры данных.
  6. Когда требуется наследование. Именованные кортежи не поддерживают наследование. Поэтому если вам нужно создать иерархию объектов с возможностью наследования свойств и поведения, лучше используйте обычные классы.
  7. Когда требуется контроль за значениями. Если нужно проверять или изменять значения полей перед их сохранением (например, проверять возраст), именованные кортежи также не подходят. Они не поддерживают валидацию данных и другие механизмы контроля.

 

Заключение

Как видите, именованные кортежи в Python — это удобный способ обработки структур данных, имеющий интуитивно понятный доступ к элементам по их наименованиям. Они полезны для простых неизменяемых структур данных, таких как точки, координаты или записи с фиксированными атрибутами. Но если требуется изменяемость, сложная логика, динамическая структура, методы, наследование или контроль за данными, то тогда разработчику лучше использовать иные структуры: например, классы или словарь.

Останні статті

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024