logo

NamedTuple v Pythonu

V Pythonu se „speciální“ druh n-tice nazývá „pojmenovaný n-tice“. Začátečníci v Pythonu jsou často zmateni, zejména kdy a proč jej musíme implementovat.

Protože NamedTuple je n-tice, může provádět všechny funkce, které může n-tice. Je to však více než jednoduchá pythonovská n-tice. V jiných počítačových jazycích, stejně jako v C++, je mnohem podobnější 'třídě'. Je to podtyp n-tice se zadanými poli a definovanou délkou vytvořenou programově podle našich specifikací. Tento tutoriál vysvětlí Python NamedTuples a ukáže, jak je používat a kdy a proč je musíme používat.

Co je Python Tuple?

Domníváme se, že bychom měli znovu navštívit n-tice v Pythonu, než budeme pokračovat.

N-tice v Pythonu je kontejner, který může uložit mnoho hodnot. Zvažte následující případ.

Kód

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

Jak vidíme, k jeho definici používáme závorky. Pro přístup k prvkům se používají indexy. (Mějte na paměti, že indexování v Pythonu začíná na nule.)

Kód

 numbers[1] 

Výstup:

 32 

Číselná [1] Pythonská n-tice je oddělena tím, že její prvky nemůžeme modifikovat, tj. prvky n-tice jsou neměnné.

Syntaxe Pythonu NamedTuple

Nejprve musíme importovat NamedTuple z vestavěného modulu Pythonu s názvem collections, jak je znázorněno:

 from collections import namedtuple 

Níže je uvedena základní syntaxe pro konstrukci NamedTuple:

 namedtuple(Name,[Names of Values]) 

název je to parametr pro titul, který chceme dát našemu NamedTuple, a

[Jména hodnot] je zástupný symbol pro seznam obsahující názvy různých hodnot nebo atributů.

Příklad Pythonu NamedTuple

Prvním krokem, jak již bylo řečeno, je import NamedTuple.

 from collections import namedtuple 

Nyní můžeme použít syntaxi z předchozí části k vytvoření NamedTuple:

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

V tomto příkladu

jak stáhnout youtube video vlc

Rozhodneme se zavolat pojmenovaného Tuple Studenta a uvést jména hodnot, 'Jméno', 'Třída', 'Věk', 'Předmět' a 'Značky' v seznamu. A vytvořili jsme naši první NamedTuple - Student.

Nyní můžeme vytvořit dům Student1 s požadovanými specifikacemi pomocí Student takto:

narodil se Freddie Mercury
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Povinné jsou pouze konkrétní hodnoty nebo obsah, které musí obsahovat štítky nebo pole v [Názvy hodnot].

Chcete-li vytvořit záznam nového studenta, řekněte Student2, zkopírujte jeho hodnoty a vložte je do polí nové proměnné.

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

Uvidíme, že můžeme použít Studenta jako plán k pořizování záznamů o nových studentech, jak chceme, aniž bychom museli pokaždé vyvolávat popisky polí.

Jak získat hodnoty NamedTuple pomocí tečkové notace

Pomocí tečkové metody můžeme získat hodnoty instancí NamedTuple Student1 a Student2. Následuje syntaxe:

 . 

Následující ukázka kódu to ukazuje:

Kód

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

Výstup:

 15 11 'English' 79 'Itika' 

Podobně můžeme načíst proměnné související s NamedTuple Student2 pomocí Student2.Age, Student2.Class a tak dále.

Metody přístupu NamedTuple

Hodnoty můžeme získat z NamedTuple pomocí indexů, klíčových slov a funkce getattr(). Hodnoty polí NamedTuple jsou přísně seřazeny. V důsledku toho můžeme k jejich nalezení použít indexy.

Názvy polí jsou převedeny na atributy pomocí NamedTuple. V důsledku toho lze getattr() použít k načtení dat z tohoto pole.

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ýstup:

 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 

Konverzní procedury NamedTuple

Různé kolekce lze převést na NamedTuple pomocí několika technik. K transformaci seznamu, n-tice nebo jiných iterovatelných objektů na instanci NamedTuple můžeme také použít funkci _make().

Můžeme také převést objekt datového typu slovníku na kolekci NamedTuple. Pro tuto transformaci je nutný pracovník **.

Jako položka datového typu OrderedDict může NamedTuple získat položky pomocí svých klíčů. Můžeme zavolat funkci _asdict() a převést ji 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ýstup:

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

Další operace na NamedTuple

K dispozici jsou další metody, jako je _fields() a _replace. Můžeme určit, která pole má NamedTuple voláním funkce _fields(). Funkce _replace() se používá k výměně jedné hodnoty za jinou.

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ýstup:

sql pořadí náhodně
 Participant(Name='Itika', Age='21', Country='India') The fields of Participant: ('Name', 'Age', 'Country') Participant(Name='Itika', Age='21', Country='Germany') 

Jak funguje NamedTuple v Pythonu?

Podívejme se na to, co navíc můžeme dosáhnout s NamedTuple v Pythonu.

1. NamedTuple v Pythonu je neměnný.

NamedTuple v Pythonu nelze upravit, podobně jako jeho běžná verze. Nejsme schopni změnit jeho vlastnosti.

Pokusíme se upravit jednu z charakteristik n-tice se jménem 'Student', abychom to ukázali.

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ýstup:

 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 je vidět, vyhodí AttributeError. V důsledku toho můžeme odvodit, že NamedTuple je neměnný.

2. Vytvoření slovníku Python z Pythonu NamedTuple

V Pythonu je NamedTuple podobný slovníku a můžeme jej transformovat do jednoho pomocí:

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ýstup:

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

Využíváme . za tímto účelem metoda asdict(). To také vytváří Python OrderedDict.

3. NamedTuple s výchozími hodnotami

Třídu pojmenované n-tice lze nakonfigurovat s výchozími parametry stejným způsobem, jakým můžeme nastavit počáteční hodnoty atributů v běžné třídě. Výchozí hodnoty jsou přiřazeny atributům zcela vpravo, protože pole s výchozí hodnotou by se měla objevit po každém poli bez výchozí hodnoty.

Pojďme předefinovat třídu Student pouze s 1 výchozí 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ýstup:

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

Pro značky bude použita výchozí hodnota 100, což je pole zcela vpravo v naší deklaraci, pokud vytvoříme NamedTuple pouze s jednou hodnotou.

Použije se výchozí hodnota pro Věk, pokud výslovně specifikujeme pole jako Věk?

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ýstup:

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

Odpověď je ne. V NamedTuple je řazení polí velmi tuhé. I když cokoli výslovně deklarujeme, výchozí hodnoty musí být ty pravé, aby se předešlo nejednoznačnosti a potenciálním potížím.

Výhody Pythonu Namedtuple

Samozřejmě nikdo nebude používat NamedTuple, pokud nevidí žádné výhody. Takže tady je to, co máme:

1. Na rozdíl od standardní n-tice může NamedTuple v Pythonu získávat proměnné podle jejich názvů.

Kód

kolik uncí je 10 mililitrů
 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1.Age ) 

Výstup:

 17 

2. Protože Python NamedTuple neobsahuje slovníky pro jednotlivé instance, je efektivní v paměti stejně jako konvenční n-tice. Díky tomu je také rychlejší než slovník.

Závěr

V tomto tutoriálu jsme se naučili, jak nám NamedTuples umožňují kombinovat výhody n-tic i slovníků, jak vytvářet NamedTuples a jak je používat. Jak načíst hodnoty NamedTuples pomocí tečkové notace v Pythonu, jak fungují

Pokud je čtenář seznámen s OOP Pythonu, uvidí, že je totožné s tím, jak fungují třídy Pythonu. Třída a její atributy fungují jako plán pro vytváření mnoha dalších objektů nebo instancí, z nichž každý má svou vlastní sadu hodnot atributů.

Pro zvýšení jasnosti našeho kódu je však definování třídy a poskytování základních charakteristik obvykle přehnané a je mnohem rychlejší místo toho vytvořit NamedTuples.