logo

NamedTuple w Pythonie

W Pythonie „specjalny” rodzaj krotki nosi nazwę „nazwana krotka”. Początkujący użytkownicy Pythona często są przez to zakłopotani, zwłaszcza kiedy i dlaczego musimy go wdrożyć.

Ponieważ NamedTuple jest krotką, może wykonywać wszystkie funkcje, które może wykonać krotka. Jest to jednak coś więcej niż zwykła krotka w Pythonie. W innych językach komputerowych, podobnie jak w C++, jest on znacznie bardziej podobny do „klasy”. Jest to podtyp krotki z określonymi polami i zdefiniowaną długością zbudowaną programowo zgodnie z naszymi specyfikacjami. W tym samouczku wyjaśnimy Python NamedTuples i pokażemy, jak z nich korzystać oraz kiedy i dlaczego musimy z nich korzystać.

Co to jest krotka Pythona?

Uważamy, że zanim przejdziemy dalej, powinniśmy ponownie przyjrzeć się krotkom w Pythonie.

Krotka w Pythonie to kontener, w którym można przechowywać wiele wartości. Rozważmy następujący przypadek.

Kod

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

Jak widać, do zdefiniowania tego używamy nawiasów. Indeksy służą do uzyskiwania dostępu do elementów. (Pamiętaj, że indeksowanie w Pythonie zaczyna się od zera.)

Kod

 numbers[1] 

Wyjście:

 32 

Krotkę Numbers[1] w Pythonie oddziela fakt, że nie możemy modyfikować jej elementów, tzn. elementy krotki są niezmienne.

Składnia NamedTuple w języku Python

Musimy najpierw zaimportować NamedTuple z wbudowanego modułu Pythona zwanego kolekcjami, jak pokazano:

 from collections import namedtuple 

Poniżej znajduje się podstawowa składnia konstruowania NamedTuple:

 namedtuple(Name,[Names of Values]) 

Nazwa jest to parametr tytułu, który chcemy nadać naszej NamedTuple, oraz

[Nazwy wartości] jest symbolem zastępczym listy zawierającej nazwy różnych wartości lub atrybutów.

Przykład NamedTuple w języku Python

Pierwszym krokiem, jak powiedziano wcześniej, jest zaimportowanie NamedTuple.

 from collections import namedtuple 

Teraz możemy użyć składni z poprzedniej części, aby zbudować NamedTuple:

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

W tym przykładzie

Java matematyczna.min

Decydujemy się wywołać NamedTuple Student i wymienić na liście nazwy wartości: „Nazwa”, „Klasa”, „Wiek”, „Temat” i „Oceny”. I stworzyliśmy naszą pierwszą NamedTuple - Student.

Teraz możemy stworzyć dom Student1 z wymaganymi specyfikacjami, używając Studenta w następujący sposób:

pętla do i while w Javie
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Wymagane są tylko określone wartości lub treści, które muszą przyjmować etykiety lub pola w naszych [Nazwach wartości].

Aby dokonać wpisu nowego ucznia, powiedzmy Student2, skopiuj jego wartości i wklej je w pola nowej zmiennej.

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

Zobaczymy, że możemy użyć Studenta jako planu do rejestrowania nowych uczniów według własnego uznania, bez konieczności za każdym razem wywoływania etykiet pól.

Jak uzyskać wartości NamedTuple za pomocą notacji kropkowej

Możemy użyć metody kropki, aby uzyskać wartości instancji NamedTuple Student1 i Student2. Poniżej znajduje się składnia:

 . 

Poniższy przykładowy kod demonstruje to:

Kod

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

Wyjście:

 15 11 'English' 79 'Itika' 

Podobnie możemy pobrać zmienne powiązane z NamedTuple Student2 za pomocą Student2.Age, Student2.Class i tak dalej.

Metody dostępu do NamedTuple

Możemy pobrać wartości z NamedTuple za pomocą indeksów, słów kluczowych i funkcji getattr(). Wartości pól NamedTuple są ściśle uporządkowane. W rezultacie możemy użyć indeksów, aby je znaleźć.

Nazwy pól są konwertowane na atrybuty przez NamedTuple. W rezultacie funkcja getattr() może zostać użyta do pobrania danych z tego pola.

Kod

 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')) 

Wyjście:

 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 

Procedury konwersji NamedTuple

Różne kolekcje można przekonwertować na NamedTuple przy użyciu kilku technik. Możemy również użyć funkcji _make() do przekształcenia listy, krotki lub innych obiektów iterowalnych w instancję NamedTuple.

Możemy także przekonwertować obiekt typu danych słownika na kolekcję NamedTuple. Do tej transformacji wymagany jest operator **.

Jako element typu danych OrderedDict NamedTuple może generować elementy za pomocą swoich kluczy. Możemy wywołać funkcję _asdict(), aby przekonwertować ją na OrderedDict.

Kod

 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) 

Wyjście:

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

Więcej operacji na NamedTuple

Dostępne są inne metody, takie jak _fields() i _replace. Możemy określić, które pola ma NamedTuple, wywołując funkcję _fields(). Funkcja _replace() służy do zamiany jednej wartości na inną.

Kod

węzeł listy w Javie
 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) 

Wyjście:

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

Jak działa NamedTuple w Pythonie?

Przyjrzyjmy się, co dodatkowo możemy osiągnąć za pomocą NamedTuple w Pythonie.

1. NamedTuple w Pythonie jest niezmienna.

NamedTuple w Pythonie nie może być modyfikowany, podobnie jak jego zwykła wersja. Nie jesteśmy w stanie zmienić jego właściwości.

Aby to zademonstrować, spróbujemy zmodyfikować jedną z cech krotki o nazwie „Student”.

Kod

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

Wyjście:

 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 

Jak widać, zgłasza błąd AttributeError. W rezultacie możemy wywnioskować, że NamedTuple jest niezmienna.

2. Tworzenie słownika Pythona na podstawie Pythona NamedTuple

W Pythonie NamedTuple jest podobny do słownika i możemy go przekształcić w jeden poprzez:

Kod

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

Wyjście:

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

Korzystamy z. w tym celu metodę asdict(). Spowoduje to również utworzenie obiektu OrderedDict w języku Python.

3. NamedTuple z wartościami domyślnymi

Nazwaną klasę krotek można skonfigurować z parametrami domyślnymi w taki sam sposób, w jaki możemy ustawić wartości początkowe atrybutów w zwykłej klasie. Wartości domyślne są przypisane do atrybutów znajdujących się najbardziej na prawo, ponieważ pola posiadające wartość domyślną powinny pojawiać się po każdym polu bez wartości domyślnej.

Zdefiniujmy na nowo klasę Student za pomocą tylko 1 domyślnego wpisu.

Kod

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

Wyjście:

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

Do znaczników zostanie zastosowana domyślna liczba 100, która jest skrajnym prawym polem naszej deklaracji, jeśli utworzymy NamedTuple z tylko jedną wartością.

Czy zostanie zastosowana domyślna wartość Wiek jeśli wyraźnie określimy pole jako Wiek?

Kod

 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 ) 

Wyjście:

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

Odpowiedź brzmi nie. W NamedTuple kolejność pól jest bardzo sztywna. Nawet jeśli wyraźnie coś zadeklarujemy, wartości domyślne muszą być najbardziej po prawej stronie, aby zapobiec niejasnościom i potencjalnym trudnościom.

Korzyści z Pythona Namedtuple

Oczywiście nikt nie będzie korzystał z NamedTuple, jeśli nie będzie widział żadnych korzyści. Oto co mamy:

1. W przeciwieństwie do standardowej krotki, NamedTuple w Pythonie może pobierać zmienne według ich tytułów.

Kod

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

Wyjście:

 17 

2. Ponieważ nie zawiera słowników dla poszczególnych instancji, Python NamedTuple jest wydajny pod względem pamięci tak samo jak konwencjonalna krotka. Z tego powodu jest także szybszy niż słownik.

podaj nazwę miasta w USA

Wniosek

W tym samouczku dowiedzieliśmy się, jak NamedTuples pozwalają nam łączyć zalety krotek i słowników, jak tworzyć NamedTuples i jak z nich korzystać. Jak pobrać wartości NamedTuples za pomocą notacji kropkowej w Pythonie, jak one działają

Jeśli czytelnik jest zaznajomiony z OOP Pythona, zobaczy, że jest to identyczne z działaniem klas Pythona. Klasa i jej atrybuty pełnią rolę planu tworzenia znacznie większej liczby obiektów lub instancji, każdy z własnym zestawem wartości atrybutów.

Aby jednak zwiększyć przejrzystość naszego kodu, zdefiniowanie klasy i podanie podstawowych cech jest zwykle nadmierne i zamiast tego znacznie szybciej jest konstruować NamedTuples.