logo

Pomenovaný Tuple v Pythone

V Pythone sa „špeciálny“ druh n-tice nazýva „pomenovaná n-tice“. Začiatočníci Pythonu sú často zmätení, najmä kedy a prečo ho musíme implementovať.

Keďže NamedTuple je n-tica, môže vykonávať všetky funkcie, ktoré dokáže n-tica. Je to však viac ako jednoduchá pythonovská n-tice. V iných počítačových jazykoch, rovnako ako v C++, je oveľa viac podobná 'triede'. Je to podtyp n-tice so špecifikovanými poľami a definovanou dĺžkou zostavenou programovo podľa našich špecifikácií. Tento tutoriál vysvetlí Python NamedTuples a ukáže, ako ich používať a kedy a prečo ich musíme použiť.

Čo je Python Tuple?

Sme presvedčení, že predtým, ako budeme pokračovať, by sme mali znova navštíviť n-tice v Pythone.

N-tica v Pythone je kontajner, ktorý môže uložiť veľa hodnôt. Zvážte nasledujúci prípad.

kód

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

Ako vidíme, na jeho definovanie používame zátvorky. Indexy sa používajú na prístup k prvkom. (Majte na pamäti, že indexovanie v Pythone začína na nule.)

kód

 numbers[1] 

Výkon:

 32 

Číselná n-tica[1] Python je oddelená tým, že nemôžeme modifikovať jej prvky, t.j. prvky n-tice sú nemenné.

Syntax NamedTuple Pythonu

Najprv musíme importovať NamedTuple zo vstavaného modulu Pythonu nazývaného kolekcie, ako je znázornené:

 from collections import namedtuple 

Nasleduje základná syntax na zostavenie NamedTuple:

 namedtuple(Name,[Names of Values]) 

názov je to parameter pre názov, ktorý chceme dať našej NamedTuple, a

[Názvy hodnôt] je zástupný symbol pre zoznam obsahujúci názvy rôznych hodnôt alebo atribútov.

Príklad Python NamedTuple

Prvým krokom, ako už bolo povedané, je import NamedTuple.

 from collections import namedtuple 

Teraz môžeme použiť syntax z predchádzajúcej časti na vytvorenie NamedTuple:

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

V tomto príklade

hlavný program v jave

Rozhodli sme sa zavolať NamedTuple Student a uviesť mená hodnôt, 'Meno', 'Trieda', 'Vek', 'Predmet' a 'Marks' v zozname. A vytvorili sme našu prvú NamedTuple - Študent.

Teraz môžeme pomocou Študenta vytvoriť dom Student1 s požadovanými špecifikáciami takto:

filmová herečka kajal
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Vyžadujú sa iba konkrétne hodnoty alebo obsah, ktorý musia obsahovať štítky alebo polia v [Názvy hodnôt].

Ak chcete zadať nového študenta, povedzte Študent2, skopírujte jeho hodnoty a vložte ich do polí novej premennej.

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

Uvidíme, že môžeme použiť Študenta ako plán na zaznamenávanie nových študentov tak, ako chceme, bez toho, aby sme zakaždým museli vyvolávať štítky polí.

Ako získať hodnoty NamedTuple pomocou bodkovej notácie

Na získanie hodnôt inštancií NamedTuple Student1 a Student2 môžeme použiť bodkovú metódu. Nasleduje syntax:

 . 

Nasledujúca ukážka kódu to demonštruje:

kód

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

Výkon:

 15 11 'English' 79 'Itika' 

Podobne môžeme získať premenné súvisiace s NamedTuple Student2 pomocou Student2.Age, Student2.Class atď.

Metódy prístupu NamedTuple

Hodnoty môžeme získať z NamedTuple pomocou indexov, kľúčových slov a funkcie getattr(). Hodnoty polí NamedTuple sú prísne zoradené. V dôsledku toho môžeme použiť indexy na ich nájdenie.

Názvy polí sú konvertované na atribúty pomocou NamedTuple. Výsledkom je, že getattr() možno použiť na získanie údajov z tohto poľa.

kód

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

Výkon:

 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 

Postupy konverzie NamedTuple

Rôzne kolekcie je možné previesť na NamedTuple pomocou niekoľkých techník. Na transformáciu zoznamu, n-tice alebo iných iterovateľných objektov na inštanciu NamedTuple môžeme použiť aj funkciu _make().

Môžeme tiež skonvertovať objekt typu údajov slovníka na kolekciu NamedTuple. Na túto transformáciu je potrebný pracovník **.

Ako položka typu údajov OrderedDict môže NamedTuple získať položky pomocou svojich kľúčov. Môžeme zavolať funkciu _asdict() a previesť ju na OrderedDict.

kód

 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) 

Výkon:

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

Ďalšie operácie na NamedTuple

K dispozícii sú aj iné metódy, ako napríklad _fields() a _replace. Môžeme určiť, ktoré polia má NamedTuple volaním funkcie _fields(). Funkcia _replace() sa používa na výmenu jednej hodnoty za inú.

kód

 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) 

Výkon:

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

Ako funguje NamedTuple v Pythone?

Pozrime sa, čo navyše môžeme dosiahnuť s NamedTuple v Pythone.

1. NamedTuple v Pythone je Immutable.

NamedTuple v Pythone nemožno upravovať, podobne ako jeho obyčajná verzia. Nie sme schopní zmeniť jeho vlastnosti.

Aby sme to demonštrovali, pokúsime sa upraviť jednu z charakteristík n-tice s menom 'Student'.

kód

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

Výkon:

 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 

Ako je vidieť, vyhodí AttributeError. V dôsledku toho môžeme odvodiť, že NamedTuple je nemenný.

2. Vytvorenie slovníka Python z Python NamedTuple

V Pythone je NamedTuple podobný slovníku a môžeme ho transformovať do jedného pomocou:

pytón ťavej

kód

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

Výkon:

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

Využívame. metóda asdict() na tento účel. To tiež vytvára Python OrderedDict.

3. NamedTuple s predvolenými hodnotami

Pomenovanú triedu n-tice možno nakonfigurovať s predvolenými parametrami rovnakým spôsobom, akým môžeme nastaviť počiatočné hodnoty pre atribúty v bežnej triede. Predvolené hodnoty sú priradené k atribútom úplne vpravo, pretože polia s predvolenou hodnotou by sa mali objaviť po každom poli bez predvolenej hodnoty.

Predefinujme triedu Študent iba s 1 predvolenou položkou.

kód

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

Výkon:

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

Pre značky sa použije predvolená hodnota 100, čo je pole úplne vpravo v našej deklarácii, ak vytvoríme NamedTuple len s jednou hodnotou.

Použije sa predvolená hodnota pre Vek, ak výslovne špecifikujeme pole ako Vek?

kód

 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 ) 

Výkon:

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

Odpoveď je nie. V NamedTuple je usporiadanie polí veľmi prísne. Aj keď čokoľvek výslovne deklarujeme, predvolené hodnoty musia byť tie najsprávnejšie, aby sa predišlo nejednoznačnosti a potenciálnym ťažkostiam.

Výhody Pythonu Namedtuple

Samozrejme, nikto nebude používať NamedTuple, ak nevidí žiadne výhody. Takže tu je to, čo máme:

baran herec

1. Na rozdiel od štandardnej n-tice môže NamedTuple v Pythone získavať premenné podľa ich názvov.

kód

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

Výkon:

 17 

2. Pretože neobsahuje slovníky pre jednotlivé inštancie, Python NamedTuple je efektívny v pamäti rovnako ako konvenčná n-tica. Vďaka tomu je tiež rýchlejší ako slovník.

Záver

V tomto návode sme sa naučili, ako nám NamedTuples umožňujú kombinovať výhody n-tic a slovníkov, ako vytvárať NamedTuples a ako ich používať. Ako získať hodnoty NamedTuples pomocou bodkovej notácie v Pythone, ako fungujú

Ak je čitateľ oboznámený s Pythonovým OOP, uvidí, že je totožné s tým, ako fungujú triedy Pythonu. Trieda a jej atribúty fungujú ako plán na vytváranie mnohých ďalších objektov alebo inštancií, z ktorých každý má svoju vlastnú množinu hodnôt atribútov.

Na zvýšenie prehľadnosti nášho kódu je však definovanie triedy a poskytovanie základných charakteristík zvyčajne nadmerné a namiesto toho je oveľa rýchlejšie zostaviť NamedTuples.