U Pythonu, 'posebna' vrsta tuplea naziva se 'named tuple'. Python početnici često su zbunjeni njime, osobito kada i zašto ga moramo implementirati.
Budući da je NamedTuple tuple, može obavljati sve funkcije koje može tuple. Međutim, to je više od jednostavne Python tuple. U drugim računalnim jezicima, baš kao i kod C++, mnogo je sličniji 'klasi'. To je podvrsta tuplea s određenim poljima i definiranom duljinom izgrađenom programski prema našim specifikacijama. Ovaj vodič objasnit će Python NamedTuples i pokazati kako ih koristiti te kada i zašto ih moramo koristiti.
Što je Python Tuple?
Vjerujemo da bismo trebali ponovno pregledati torke u Pythonu prije nego što nastavimo.
Tuple u Pythonu je spremnik koji može pohraniti mnoge vrijednosti. Razmotrimo sljedeći slučaj.
Kodirati
numbers = (34, 32, 56, 24, 75, 24)
Kao što vidimo, koristimo zagrade da ga definiramo. Indeksi se koriste za pristup elementima. (Imajte na umu da indeksiranje u Pythonu počinje od nule.)
Kodirati
numbers[1]
Izlaz:
32
Numbers[1] Python tuple je odvojen činjenicom da ne možemo mijenjati njegove elemente, tj. elementi tuple su nepromjenjivi.
Python NamedTuple sintaksa
Prvo moramo uvesti NamedTuple iz Pythonovog ugrađenog modula pod nazivom collections, kao što je prikazano:
from collections import namedtuple
Slijedi osnovna sintaksa za konstrukciju NamedTuple:
namedtuple(Name,[Names of Values])
Ime to je parametar za naslov koji želimo dati našoj NamedTuple, i
[Imena vrijednosti] je rezervirano mjesto za popis koji sadrži nazive različitih vrijednosti ili atributa.
Primjer Python NamedTuple
Prvi korak, kao što je prethodno rečeno, je uvoz NamedTuple.
from collections import namedtuple
Sada možemo koristiti sintaksu iz prethodnog dijela za izgradnju NamedTuple:
Student = namedtuple('Student',['Name','Class','Age','Subject','Marks'])
U ovom primjeru,
što je $home linux
Odabiremo pozvati NamedTuple Student i spomenuti nazive vrijednosti, 'Ime', 'Razred', 'Dob', 'Predmet' i 'Ocjene' na popisu. I stvorili smo naš prvi NamedTuple - Student.
Sada možemo stvoriti kuću Student1 sa potrebnim specifikacijama koristeći Student na sljedeći način:
dijagram e-r modela
Studnet1 = Student('Itika', 11, 15, 'English', 79)
Potrebne su samo određene vrijednosti ili sadržaj koje oznake ili polja u našim [Nazivima vrijednosti] moraju poprimiti.
Da biste unijeli novog studenta, recimo Student2, kopirajte njegove vrijednosti i zalijepite ih u polja nove varijable.
Studnet2 = Student('Arshia', 12, 17, 'Maths', 93)
Vidjet ćemo da možemo upotrijebiti Student kao nacrt za uzimanje zapisa o novim studentima kako želimo bez potrebe da svaki put prozivamo oznake polja.
Kako dobiti vrijednosti imenovane torke pomoću notacije s točkama
Možemo koristiti metodu točke za dobivanje vrijednosti instanci NamedTuple Student1 i Student2. Sljedeća je sintaksa:
.
Sljedeći primjer koda to pokazuje:
Kodirati
print (Student1.Age) print (Student1.Class) print (Student1.Subject) print (Student1.Marks) print (Student1.Name)
Izlaz:
15 11 'English' 79 'Itika'
Isto tako, možemo dohvatiti varijable koje se odnose na NamedTuple Student2 koristeći Student2.Age, Student2.Class, i tako dalje.
Metode pristupa NamedTuple
Vrijednosti možemo dohvatiti iz NamedTuple pomoću indeksa, ključnih riječi i funkcije getattr(). Vrijednosti polja NamedTuple su strogo poredane. Kao rezultat toga, možemo koristiti indekse da ih pronađemo.
Imena polja se pretvaraju u atribute pomoću NamedTuple. Kao rezultat, getattr() se može koristiti za dohvaćanje podataka iz tog polja.
Kodirati
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'))
Izlaz:
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
Procedure pretvorbe NamedTuple
Različite zbirke mogu se pretvoriti u NamedTuple pomoću nekoliko tehnika. Također možemo upotrijebiti funkciju _make() za transformaciju popisa, torke ili drugih objekata koji se mogu ponavljati u instancu NamedTuple.
Također možemo pretvoriti objekt tipa podataka rječnika u kolekciju NamedTuple. Za ovu transformaciju potrebna je operacija **.
Kao stavka tipa podataka OrderedDict, NamedTuple može dati stavke sa svojim ključevima. Možemo pozvati funkciju _asdict() da je pretvorimo u OrderedDict.
Kodirati
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) Izlaz:
Participant(Name='Itika', Age='21', Country='India') Participant(Name='Arshia', Age='19', Country='Australia') {'Name': 'Itika', 'Age': '21', 'Country': 'India'} Više operacija na NamedTuple
Dostupne su i druge metode, kao što su _fields() i _replace. Možemo odrediti koja polja ima NamedTuple pozivom funkcije _fields(). Funkcija _replace() koristi se za zamjenu jedne vrijednosti za drugu.
Kodirati
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)
Izlaz:
Participant(Name='Itika', Age='21', Country='India') The fields of Participant: ('Name', 'Age', 'Country') Participant(Name='Itika', Age='21', Country='Germany')
Kako radi Python NamedTuple?
Pogledajmo što dodatno možemo postići s NamedTuple u Pythonu.
1. NamedTuple u Pythonu je nepromjenjiv.
NamedTuple u Pythonu ne može se mijenjati, slično kao i njegova obična verzija. Ne možemo promijeniti njegove karakteristike.
brojevi u abecedi
Pokušat ćemo modificirati jednu od karakteristika torke imena 'Student' da to demonstriramo.
Kodirati
from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) Student1.Class = 11
Izlaz:
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
Kao što se može vidjeti, izbacuje AttributeError. Kao rezultat, možemo zaključiti da je NamedTuple nepromjenjiv.
2. Stvaranje Python rječnika iz Python NamedTuple
U Pythonu, NamedTuple je sličan rječniku i možemo ga pretvoriti u jedan na sljedeći način:
Kodirati
from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) print ( Student1._asdict() )
Izlaz:
{'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93} Koristimo se. metoda asdict() za ovo. Ovo također proizvodi Python OrderedDict.
3. NamedTuple sa zadanim vrijednostima
Imenovana klasa tuple može se konfigurirati sa zadanim parametrima na isti način na koji možemo postaviti početne vrijednosti za atribute u običnoj klasi. Zadane vrijednosti se dodjeljuju krajnjim desnim atributima budući da se polja sa zadanom vrijednošću trebaju pojaviti nakon svakog polja bez zadane vrijednosti.
Redefinirajmo razred učenika sa samo 1 zadanim unosom.
Kodirati
from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1 )
Izlaz:
Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100)
Zadana brojka 100 primijenit će se za oznake, što je krajnje desno polje u našoj deklaraciji ako kreiramo NamedTuple sa samo jednom vrijednošću.
Hoće li se zadana vrijednost za dob primijeniti ako izričito odredimo da polje bude dob?
Kodirati
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 )
Izlaz:
TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject'
Odgovor je ne. U NamedTuple, redoslijed polja je vrlo krut. Čak i ako nešto izričito deklariramo, zadane vrijednosti moraju biti najdesnije kako bi se spriječila dvosmislenost i potencijalne poteškoće.
Prednosti Python Namedtuple
Naravno, nitko neće koristiti NamedTuple ako ne vidi nikakve prednosti. Dakle, evo što imamo:
1. Za razliku od standardne tuple, NamedTuple u Pythonu može dohvatiti varijable prema njihovim naslovima.
Kodirati
from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1.Age )
Izlaz:
17
2. Budući da ne uključuje rječnike po instanci, Python NamedTuple učinkovit je u memoriji baš kao i konvencionalna tuple. Zbog toga je i brži od rječnika.
Zaključak
Naučili smo kako nam NamedTuples omogućuje kombiniranje prednosti i tuples i rječnika, kako izgraditi NamedTuples i kako ih koristiti u ovom vodiču. Kako dohvatiti vrijednosti NamedTuples koristeći notaciju točka u Pythonu, kako rade
Ako je čitatelj upoznat s Pythonovim OOP-om, vidjet će da je to identično načinu na koji funkcioniraju Python klase. Klasa i njezini atributi djeluju kao nacrt za stvaranje mnogo više objekata ili instanci, svaki sa svojim skupom vrijednosti atributa.
podebljani tekst css
Međutim, kako bismo povećali jasnoću našeg koda, definiranje klase i pružanje bitnih karakteristika obično je pretjerano, a puno je brže umjesto toga konstruirati NamedTuples.