logo

NamedTuple v Pythonu

V Pythonu se 'posebna' vrsta tuple imenuje 'named tuple.' Začetniki Pythona so zaradi tega pogosto zbegani, zlasti kdaj in zakaj ga moramo implementirati.

Ker je NamedTuple tuple, lahko izvaja vse funkcije, ki jih lahko tuple. Je pa več kot preprosta tuple Python. V drugih računalniških jezikih je, tako kot pri C++, veliko bolj podoben 'razredu'. To je podvrsta tuple z določenimi polji in definirano dolžino, zgrajeno programsko po naših specifikacijah. Ta vadnica bo razložila Python NamedTuples in pokazala, kako jih uporabiti ter kdaj in zakaj jih moramo uporabiti.

Kaj je Python Tuple?

Menimo, da bi morali ponovno pregledati tuple v Pythonu, preden nadaljujemo.

Tuple v Pythonu je vsebnik, ki lahko shrani veliko vrednosti. Razmislite o naslednjem primeru.

Koda

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

Kot lahko vidimo, ga definiramo z oklepajem. Za dostop do elementov se uporabljajo indeksi. (Upoštevajte, da se indeksiranje v Pythonu začne pri nič.)

Koda

 numbers[1] 

Izhod:

 32 

Tuple numbers[1] Python je ločena po tem, da ne moremo spreminjati njenih elementov, kar pomeni, da so elementi tuplea nespremenljivi.

Sintaksa Python NamedTuple

Najprej moramo uvoziti NamedTuple iz Pythonovega vgrajenega modula, imenovanega collections, kot je prikazano:

 from collections import namedtuple 

Sledi osnovna sintaksa za izdelavo NamedTuple:

 namedtuple(Name,[Names of Values]) 

Ime je parameter za naslov, ki ga želimo dati naši NamedTuple, in

[Imena vrednosti] je ograda za seznam, ki vsebuje imena različnih vrednosti ali atributov.

Primer Python NamedTuple

Kot že rečeno, je prvi korak uvoz NamedTuple.

 from collections import namedtuple 

Zdaj lahko uporabimo sintakso iz prejšnjega dela za izdelavo NamedTuple:

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

V tem primeru

dva proti ena multiplekser

Odločimo se, da pokličemo NamedTuple Student in na seznamu omenimo imena vrednosti, 'Ime', 'Razred', 'Starost', 'Predmet' in 'Oznake'. In ustvarili smo naš prvi NamedTuple - Student.

Zdaj lahko ustvarimo hišo Student1 z zahtevanimi specifikacijami z uporabo Studenta, kot sledi:

model tcp ip
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Zahtevane so le določene vrednosti ali vsebina, ki jo morajo imeti oznake ali polja v naših [Imena vrednosti].

Če želite vnesti novega študenta, recimo Student2, kopirajte njegove vrednosti in jih prilepite v polja nove spremenljivke.

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

Videli bomo, da lahko uporabimo Student kot načrt za zapisovanje novih študentov, kot želimo, ne da bi morali vsakič klicati oznake polj.

Kako pridobiti vrednosti imenovane dvojke z uporabo pikčastega zapisa

Za pridobitev vrednosti primerkov NamedTuple Student1 in Student2 lahko uporabimo metodo pike. Sledi sintaksa:

 . 

Naslednji vzorec kode to prikazuje:

Koda

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

Izhod:

 15 11 'English' 79 'Itika' 

Podobno lahko pridobimo spremenljivke, povezane z NamedTuple Student2 z uporabo Student2.Age, Student2.Class itd.

Metode dostopa do NamedTuple

Vrednosti lahko pridobimo iz NamedTuple z uporabo indeksov, ključnih besed in funkcije getattr(). Vrednosti polj NamedTuple so strogo urejene. Zato lahko za njihovo iskanje uporabimo indekse.

Imena polj so pretvorjena v atribute z NamedTuple. Posledično lahko getattr() uporabite za pridobivanje podatkov iz tega polja.

Koda

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

Izhod:

 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 

Postopki pretvorbe NamedTuple

Različne zbirke je mogoče pretvoriti v NamedTuple z uporabo nekaj tehnik. Funkcijo _make() lahko uporabimo tudi za preoblikovanje seznama, tuple ali drugih ponovljivih objektov v primerek NamedTuple.

Prav tako lahko pretvorimo objekt slovarskega podatkovnega tipa v zbirko NamedTuple. Za to transformacijo je potrebna operacija **.

Kot postavka podatkovnega tipa OrderedDict lahko NamedTuple daje elemente s svojimi ključi. Pokličemo lahko funkcijo _asdict(), da jo pretvorimo v OrderedDict.

java boolean

Koda

 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) 

Izhod:

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

Več operacij na NamedTuple

Na voljo so tudi druge metode, kot sta _fields() in _replace. S klicem funkcije _fields() lahko ugotovimo, katera polja ima NamedTuple. Funkcija _replace() se uporablja za zamenjavo ene vrednosti za drugo.

Koda

 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) 

Izhod:

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

Kako deluje Pythonov NamedTuple?

Poglejmo, kaj dodatnega lahko dosežemo z NamedTuple v Pythonu.

1. NamedTuple v Pythonu je nespremenljiv.

NamedTuple v Pythonu ni mogoče spreminjati, tako kot običajne različice. Njegovih lastnosti ne moremo spremeniti.

Poskusili bomo spremeniti eno od značilnosti tuple z imenom 'Študent', da bi to prikazali.

Koda

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

Izhod:

 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 

Kot lahko vidite, vrže AttributeError. Posledično lahko sklepamo, da je NamedTuple nespremenljiv.

2. Ustvarjanje slovarja Python iz Python NamedTuple

V Pythonu je NamedTuple podoben slovarju in v enega ga lahko pretvorimo tako:

Koda

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

Izhod:

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

Uporabljamo. metoda asdict() za to. To tudi ustvari Python OrderedDict.

3. NamedTuple s privzetimi vrednostmi

Poimenovani tuple razred je mogoče konfigurirati s privzetimi parametri na enak način, kot lahko nastavimo začetne vrednosti za atribute v navadnem razredu. Privzete vrednosti so dodeljene skrajno desnim atributom, saj se morajo polja s privzeto vrednostjo pojaviti za vsakim poljem brez privzete vrednosti.

Ponovno definirajmo razred študenta s samo enim privzetim vnosom.

c struktura v strukturi

Koda

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

Izhod:

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

Za oznake bo uporabljena privzeta številka 100, ki je skrajno desno polje v naši izjavi, če ustvarimo NamedTuple s samo eno vrednostjo.

Ali bo uporabljena privzeta vrednost za starost, če izrecno določimo, da bo polje starost?

Koda

 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 ) 

Izhod:

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

Odgovor je ne. V NamedTuple je vrstni red polj zelo tog. Tudi če kar koli izrecno deklariramo, morajo biti privzete vrednosti najbolj prave, da preprečimo dvoumnost in morebitne težave.

Prednosti Python Namedtuple

Seveda nihče ne bo uporabljal NamedTuple, če ne vidi prednosti. Torej, tukaj je, kaj imamo:

1. Za razliko od standardne tuple lahko NamedTuple v Pythonu pridobi spremenljivke po njihovih naslovih.

Koda

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

Izhod:

 17 

2. Ker ne vključuje slovarjev za posamezno instanco, je Python NamedTuple učinkovit v pomnilniku tako kot običajna tuple. Zaradi tega je tudi hitrejši od slovarja.

Zaključek

V tej vadnici smo izvedeli, kako nam NamedTuples omogočajo združevanje prednosti tuples in slovarjev, kako zgraditi NamedTuples in kako jih uporabljati. Kako pridobiti vrednosti NamedTuples z zapisom pik v Pythonu, kako delujejo

Če je bralec seznanjen s Pythonovim OOP, bo videl, da je to identično delovanju razredov Python. Razred in njegovi atributi delujejo kot načrt za ustvarjanje številnih drugih predmetov ali primerkov, od katerih ima vsak svoj niz vrednosti atributov.

Da bi povečali jasnost naše kode, pa je definiranje razreda in zagotavljanje bistvenih značilnosti običajno pretirano, zato je namesto tega veliko hitreje sestaviti NamedTuples.