Рубріки: Новини

Що таке іменовані кортежі (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 — це зручний спосіб обробки структур даних, який має інтуїтивно зрозумілий доступ до елементів за їх найменуванням. Вони корисні для простих незмінних структур даних, таких як точки, координати або записи з фіксованими атрибутами. Але якщо потрібна змінність, складна логіка, динамічна структура, методи, наслідування чи контроль даних, тоді розробнику краще використовувати інші структури: наприклад, класи чи словник.

 

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

Google залишить можливість встановлювати неперевірені Android-додатки. Але з «режимом очікування»

Google додає роз'яснення щодо свого майбутнього плану посилити контроль над екосистемою Android. Починаючи з березня…

20.03.2026

Хакери використовують критичну вразливість Zimbra для атак на українські державні установи

Хакерське угруповання APT28 (також відоме як Fancy Bear або Strontium), яке пов’язують із російським ГРУ,…

20.03.2026

ChatGPT, браузер та Codex об’єднають в єдину суперпрограму для ПК

OpenAI планує об'єднати свій додаток ChatGPT, платформу кодування Codex та браузер в одну «суперпрограму» для…

20.03.2026

5 років ув’язнення: американця визнали винним за веб-трансляції згенерованих ним пісень

У США добігає кінця перший в історії судовий процес за шахрайство з музичним стрімінгом за…

20.03.2026

MiMo-V2-Pro від Xiaomi: майже наздоганяє GPT-5.2 та Opus 4.6 і коштує в 6-7 разів дешевше

Xiaomi Labs офіційно представила MiMo-V2-Pro — свою флагманську LLM-модель, яка має 1 трильйон параметрів. Бенчмарки…

19.03.2026

Meta закриє доступ до Horizon Worlds через VR. Залишиться лише мобільна версія

Віртуальний всесвіт Horizon Worlds стане недоступним через VR-гарнітуру після 15 червня 2026 року. У лютому…

19.03.2026