logo

NamedTuple у Python

У Python «особливий» тип кортежу називається «іменований кортеж». Початківці Python часто спантеличені цим, особливо коли і чому ми повинні це реалізувати.

Оскільки NamedTuple — це кортеж, він може виконувати всі функції, які може виконувати кортеж. Однак це більше, ніж простий кортеж Python. В інших комп’ютерних мовах, як і в C++, це набагато більше схоже на «клас». Це підтип кортежу з заданими полями та визначеною довжиною, побудований програмно відповідно до наших специфікацій. Цей підручник пояснює Python NamedTuples і показує, як їх використовувати, коли і чому ми повинні їх використовувати.

Що таке кортеж Python?

Ми вважаємо, що перед тим, як продовжити, нам слід переглянути кортежі в Python.

Кортеж у Python — це контейнер, який може зберігати багато значень. Розглянемо такий випадок.

Код

 numbers = (34, 32, 56, 24, 75, 24) 

Як ми бачимо, ми використовуємо круглі дужки, щоб визначити його. Для доступу до елементів використовуються індекси. (Майте на увазі, що індексація в Python починається з нуля.)

Код

 numbers[1] 

Вихід:

 32 

Кортеж numbers[1] Python відокремлений тим фактом, що ми не можемо змінювати його елементи, тобто елементи кортежу є незмінними.

Синтаксис Python NamedTuple

Спочатку ми повинні імпортувати NamedTuple із вбудованого модуля Python під назвою collections, як показано:

 from collections import namedtuple 

Нижче наведено базовий синтаксис для побудови NamedTuple:

 namedtuple(Name,[Names of Values]) 

Ім'я це параметр для заголовка, який ми хочемо надати нашому NamedTuple, і

[Назви значень] є заповнювачем для списку, що містить імена різних значень або атрибутів.

Приклад Python NamedTuple

Першим кроком, як було сказано раніше, є імпорт NamedTuple.

 from collections import namedtuple 

Тепер ми можемо використати синтаксис із попередньої частини для створення NamedTuple:

 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 

У цьому прикладі

вирівняти зображення за допомогою css

Ми вибираємо виклик NamedTuple Student і згадуємо назви значень, «Ім’я», «Клас», «Вік», «Предмет» і «Оцінки» у списку. І ми створили наш перший NamedTuple - Student.

Тепер ми можемо створити будинок Student1 із необхідними специфікаціями за допомогою Student наступним чином:

сортування масиву Java
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Потрібні лише конкретні значення або вміст, які повинні приймати мітки або поля в [Назви значень].

Щоб зробити запис нового студента, скажімо Student2, скопіюйте його значення та вставте їх у поля нової змінної.

 Studnet2 = Student('Arshia', 12, 17, 'Maths', 93) 

Ми побачимо, що ми можемо використовувати Student як схему для запису нових студентів, як ми хочемо, без необхідності щоразу викликати мітки полів.

Як отримати значення іменованого кортежу за допомогою крапкової нотації

Ми можемо використовувати метод точки, щоб отримати значення екземплярів NamedTuple Student1 і Student2. Нижче наведено синтаксис:

 . 

Наведений нижче приклад коду демонструє це:

Код

 print (Student1.Age) print (Student1.Class) print (Student1.Subject) print (Student1.Marks) print (Student1.Name) 

Вихід:

 15 11 'English' 79 'Itika' 

Так само ми можемо отримати змінні, пов’язані з NamedTuple Student2, використовуючи Student2.Age, Student2.Class тощо.

Методи доступу до NamedTuple

Ми можемо отримати значення з NamedTuple за допомогою індексів, ключових слів і функції getattr(). Значення полів NamedTuple суворо впорядковані. У результаті ми можемо використовувати індекси для їх пошуку.

Назви полів перетворюються на атрибути за допомогою NamedTuple. У результаті getattr() можна використовувати для отримання даних із цього поля.

Код

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #Adding two participants p1 = Participant('Itika', '21', 'India') p2 = Participant('Arshia', '19', 'Australia') #Accessing the items using index print( 'The name and country of the first participant are: ' + p1[0] + ' and ' + p1[2]) #Accessing the items using name of the field print( 'The name and country of the second participant are: ' + p2.Name + ' and ' + p2.Country) #Accessing the items using the method: getattr() print( 'The Age of participant 1 and 2 are: ' + getattr(p1, 'Age') + ' and ' + getattr(p2, 'Age')) 

Вихід:

 The name and country of the first participant are: Itika and India The name and country of the second participant are: Arshia and Australia The Age of participant 1 and 2 are: 21 and 19 

Процедури перетворення NamedTuple

Різні колекції можна перетворити на NamedTuple за допомогою кількох прийомів. Ми також можемо використовувати функцію _make(), щоб перетворити список, кортеж або інші ітеровані об’єкти в екземпляр NamedTuple.

Ми також можемо перетворити об’єкт типу даних словника в колекцію NamedTuple. Для цього перетворення потрібен оператор **.

Як елемент типу даних OrderedDict, NamedTuple може видавати елементи зі своїми ключами. Ми можемо викликати функцію _asdict(), щоб перетворити її на OrderedDict.

Код

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants list_ = ['Itika', '21', 'India'] p1 = Participant._make(list_) print(p1) #Dict to convert Employee dict_ = {'Name':'Arshia', 'Age' : '19', 'Country' : 'Australia'} p2 = Participant(**dict_) print(p2) #Displaying the namedtuple as dictionary participant_dict = p1._asdict() print(participant_dict) 

Вихід:

 Participant(Name='Itika', Age='21', Country='India') Participant(Name='Arshia', Age='19', Country='Australia') {'Name': 'Itika', 'Age': '21', 'Country': 'India'} 

Більше операцій у NamedTuple

Доступні інші методи, такі як _fields() і _replace. Ми можемо визначити, які поля має NamedTuple, викликавши функцію _fields(). Функція _replace() використовується для заміни одного значення іншим.

Код

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants p1 = Participant('Itika', '21', 'India') print(p1) print('The fields of Participant: ' + str(p1._fields)) #updating the country of participant p1 p1 = p1._replace(Country = 'Germany') print(p1) 

Вихід:

 Participant(Name='Itika', Age='21', Country='India') The fields of Participant: ('Name', 'Age', 'Country') Participant(Name='Itika', Age='21', Country='Germany') 

Як працює NamedTuple Python?

Давайте подивимося, чого додаткового ми можемо досягти за допомогою NamedTuple у Python.

1. Іменований кортеж у Python є незмінним.

NamedTuple у Python не можна змінити, як і його звичайну версію. Ми не можемо змінити його характеристики.

Щоб продемонструвати це, ми спробуємо змінити одну з характеристик кортежу з іменем «Студент».

Код

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) Student1.Class = 11 

Вихід:

що робить ravel у python
 AttributeError Traceback (most recent call last) Input In [41], in () 2 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 3 Student1 = Student('Arshia', 12, 17, 'Maths', 93) ----> 4 Student1.Class = 11 AttributeError: can't set attribute 

Як видно, він викидає AttributeError. У результаті ми можемо зробити висновок, що NamedTuple є незмінним.

2. Створення словника Python із Python NamedTuple

У Python NamedTuple схожий на словник, і ми можемо перетворити його на такий:

Код

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) print ( Student1._asdict() ) 

Вихід:

 {'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93} 

Ми використовуємо. метод asdict() для цього. Це також створює Python OrderedDict.

3. Іменований кортеж із значеннями за замовчуванням

Іменований клас кортежу можна налаштувати за допомогою параметрів за замовчуванням так само, як ми можемо встановити початкові значення для атрибутів у звичайному класі. Значення за замовчуванням призначаються крайнім правим атрибутам, оскільки поля зі значенням за замовчуванням мають з’являтися після кожного поля без значення за замовчуванням.

Давайте перевизначимо клас Student лише з 1 записом за замовчуванням.

Код

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1 ) 

Вихід:

 Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100) 

Цифра за замовчуванням 100 буде застосована для позначок, які є крайнім правим полем у нашій декларації, якщо ми створюємо NamedTuple лише з одним значенням.

Чи буде застосовано значення за замовчуванням для віку, якщо ми явно вкажемо поле як вік?

Код

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') Student1 = Student(Age = 18) print ( Student1 ) 

Вихід:

 TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject' 

Відповідь - ні. У NamedTuple порядок полів є дуже жорстким. Навіть якщо ми чітко заявляємо щось, значення за замовчуванням мають бути найбільш правильними, щоб запобігти двозначності та потенційним труднощам.

Переваги Python Namedtuple

Звичайно, ніхто не буде використовувати NamedTuple, якщо не бачить жодних переваг. Отже, ось що ми маємо:

1. На відміну від стандартного кортежу, NamedTuple у Python може отримувати змінні за їхніми назвами.

Код

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1.Age ) 

Вихід:

 17 

2. Оскільки він не містить словників для кожного екземпляра, Python NamedTuple ефективний у пам’яті так само, як звичайний кортеж. Через це він також швидший, ніж словник.

Висновок

У цьому підручнику ми дізналися, як NamedTuples дозволяють нам поєднувати переваги кортежів і словників, як створювати NamedTuples і як ними користуватися. Як отримати значення NamedTuples за допомогою крапкової нотації в Python, як вони працюють

Якщо читач знайомий з ООП Python, він побачить, що це ідентично тому, як функціонують класи Python. Клас і його атрибути діють як план для створення багатьох інших об’єктів або екземплярів, кожен із власним набором значень атрибутів.

спробуйте зловити java

Однак, щоб підвищити ясність нашого коду, визначення класу та надання основних характеристик зазвичай є надмірним, і замість цього набагато швидше побудувати NamedTuples.