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.