logo

NamedTuple a Python

A Python, un tipus de tupla 'especial' s'anomena 'tupla anomenada'. Els principiants de Python solen quedar perplexos amb això, sobretot quan i per què hem d'implementar-lo.

Com que una NamedTuple és una tupla, pot realitzar totes les funcions que una tupla pot. Tanmateix, és més que una simple tupla de Python. En altres llenguatges informàtics, igual que amb C++, és molt més semblant a una 'classe'. És un subtipus de tupla amb camps especificats i una longitud definida construïda mitjançant programació segons les nostres especificacions. Aquest tutorial explicarà Python NamedTuples i mostrarà com utilitzar-los i quan i per què els hem d'utilitzar.

Què és una tupla Python?

Creiem que hauríem de revisar les tuples a Python abans de continuar.

Una tupla a Python és un contenidor que pot emmagatzemar molts valors. Considereu el cas següent.

Codi

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

Com podem veure, fem servir els parèntesis per definir-lo. Els índexs s'utilitzen per accedir als elements. (Tingueu en compte que la indexació a Python comença a zero.)

Codi

 numbers[1] 

Sortida:

 32 

Una tupla Python de nombres[1] està separada pel fet que no podem modificar els seus elements, és a dir, els elements de la tupla són immutables.

Sintaxi de Python NamedTuple

Primer hem d'importar un NamedTuple del mòdul integrat de Python anomenat col·leccions, tal com es mostra:

 from collections import namedtuple 

La següent és la sintaxi bàsica per construir un NamedTuple:

 namedtuple(Name,[Names of Values]) 

Nom és el paràmetre del títol que volem donar al nostre NamedTuple, i

[Noms de valors] és un marcador de posició per a la llista que conté els noms dels diferents valors o atributs.

Exemple de Python NamedTuple

El primer pas, com s'ha dit anteriorment, és importar NamedTuple.

 from collections import namedtuple 

Ara podem utilitzar la sintaxi de la part anterior per construir un NamedTuple:

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

En aquest exemple,

fórmula de paleta

Escollim cridar l'estudiant NamedTuple i esmentar els noms dels valors, 'Nom', 'Classe', 'Edat', 'Assumpte' i 'Marques' en una llista. I hem creat el nostre primer NamedTuple - Student.

Ara, podem crear una casa Student1 amb les especificacions necessàries utilitzant Student de la següent manera:

lògica proposicional
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Només calen els valors o el contingut específics que han de tenir les etiquetes o els camps dels nostres [Noms de valors].

Per fer una entrada d'un estudiant nou, diguem Estudiante2, copieu-ne els valors i enganxeu-los als camps de la nova variable.

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

Veurem que podem utilitzar Student com a model per fer un registre dels estudiants nous com vulguem sense haver de cridar les etiquetes dels camps cada vegada.

Com obtenir els valors d'un NamedTuple mitjançant la notació de punts

Podem utilitzar el mètode dot per obtenir els valors de les instàncies NamedTuple Student1 i Student2. La següent és la sintaxi:

 . 

La mostra de codi següent ho demostra:

Codi

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

Sortida:

 15 11 'English' 79 'Itika' 

De la mateixa manera, podem recuperar les variables relacionades amb el NamedTuple Student2 mitjançant Student2.Age, Student2.Class, etc.

Els mètodes d'accés de NamedTuple

Podem recuperar els valors de NamedTuple utilitzant índexs, paraules clau i la funció getattr(). Els valors dels camps de NamedTuple estan estrictament ordenats. Com a resultat, podem utilitzar els índexs per trobar-los.

El NamedTuple converteix els noms de camp en atributs. Com a resultat, getattr() es pot utilitzar per recuperar dades d'aquest camp.

Codi

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

Sortida:

 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 

Procediments de conversió de NamedTuple

Es poden convertir diferents col·leccions a NamedTuple mitjançant algunes tècniques. També podem utilitzar la funció _make() per transformar una llista, una tupla o altres objectes iterables en una instància NamedTuple.

També podem convertir un objecte de tipus de dades de diccionari en una col·lecció NamedTuple. L'operatiu ** és necessari per a aquesta transformació.

Com a element de tipus de dades OrderedDict, NamedTuple pot generar elements amb les seves claus. Podem cridar la funció _asdict() per convertir-la en un OrderedDict.

Codi

 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) 

Sortida:

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

Més operacions a NamedTuple

Altres mètodes, com ara _fields() i _replace, estan disponibles. Podem determinar quins camps té un NamedTuple cridant a la funció _fields(). La funció _replace() s'utilitza per canviar un valor per un altre.

Codi

 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) 

Sortida:

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

Com funciona el NamedTuple de Python?

Vegem quins extres podem aconseguir amb un NamedTuple a Python.

1. Un NamedTuple a Python és immutable.

Un NamedTuple a Python no es pot modificar, igual que la seva versió normal. No podem alterar-ne les característiques.

Intentarem modificar una de les característiques d'una tupla del nom 'Estudiant' per demostrar-ho.

Codi

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

Sortida:

la roda del ratolí no es desplaça correctament
 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 

Com es pot veure, llança un AttributeError. Com a resultat, podem inferir que un NamedTuple és immutable.

2. Creació d'un diccionari Python a partir d'un Python NamedTuple

A Python, un NamedTuple és similar a un diccionari i el podem transformar en un de:

Codi

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

Sortida:

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

Utilitzem el. mètode asdict() per a això. Això també produeix un Python OrderedDict.

3. NamedTuple amb valors per defecte

Una classe de tupla anomenada es pot configurar amb paràmetres per defecte de la mateixa manera que podem establir valors inicials per als atributs d'una classe normal. Els valors predeterminats s'assignen als atributs més a la dreta, ja que els camps que tinguin un valor per defecte haurien d'aparèixer després de cada camp sense un valor predeterminat.

Redefinim la classe d'alumnes amb només 1 entrada per defecte.

Codi

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

Sortida:

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

La xifra predeterminada 100 s'aplicarà per a les marques, que és el camp més a la dreta de la nostra declaració si creem el NamedTuple amb un sol valor.

S'aplicarà el valor per defecte de l'Edat si especifiquem expressament que el camp és l'Edat?

descarregar autocad 2019 anglès mediafire

Codi

 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 ) 

Sortida:

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

La resposta és no. En un NamedTuple, l'ordenació dels camps és molt rígida. Fins i tot si declarem alguna cosa expressament, els valors per defecte han de ser els més a la dreta per evitar ambigüitats i dificultats potencials.

Beneficis de Python Namedtuple

Per descomptat, ningú utilitzarà NamedTuple si no veu cap avantatge. Així doncs, aquí teniu el que tenim:

1. A diferència d'una tupla estàndard, un NamedTuple a Python pot recuperar variables segons els seus títols.

Codi

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

Sortida:

 17 

2. Com que no inclou diccionaris per instància, Python NamedTuple és eficient en memòria igual que una tupla convencional. També és més ràpid que un diccionari per això.

Conclusió

Hem après com els NamedTuples ens permeten combinar els avantatges de les tuples i els diccionaris, com crear NamedTuples i com utilitzar-los en aquest tutorial. Com recuperar els valors de NamedTuples mitjançant la notació de punts a Python, com funcionen

Si el lector està familiaritzat amb la POO de Python, veurà que és idèntic a com funcionen les classes de Python. Una classe i els seus atributs actuen com un model per crear molts més objectes o instàncies, cadascun amb el seu propi conjunt de valors d'atributs.

Tanmateix, per augmentar la claredat del nostre codi, definir una classe i proporcionar les característiques essencials sol ser excessiu, i és molt més ràpid construir NamedTuples.