En Python, un tipo de tupla 'especial' se denomina 'tupla con nombre'. Los principiantes en Python frecuentemente se quedan perplejos, particularmente cuando y por qué debemos implementarlo.
Debido a que NamedTuple es una tupla, puede realizar todas las funciones que una tupla puede realizar. Sin embargo, es más que una simple tupla de Python. En otros lenguajes informáticos, al igual que con C++, es mucho más similar a una 'clase'. Es un subtipo de tupla con campos específicos y una longitud definida construida mediante programación según nuestras especificaciones. Este tutorial explicará Python NamedTuples y mostrará cómo usarlos y cuándo y por qué debemos utilizarlos.
¿Qué es una tupla de Python?
Creemos que deberíamos revisar las tuplas en Python antes de continuar.
Una tupla en Python es un contenedor que puede almacenar muchos valores. Considere el siguiente caso.
Código
numbers = (34, 32, 56, 24, 75, 24)
Como podemos ver, usamos paréntesis para definirlo. Los índices se utilizan para acceder a elementos. (Tenga en cuenta que la indexación en Python comienza en cero).
Código
numbers[1]
Producción:
32
Una tupla de Python de números[1] está separada por el hecho de que no podemos modificar sus elementos, es decir, los elementos de la tupla son inmutables.
Sintaxis de Python NamedTuple
Primero debemos importar un NamedTuple del módulo integrado de Python llamado colecciones, como se muestra:
from collections import namedtuple
La siguiente es la sintaxis básica para construir un NamedTuple:
namedtuple(Name,[Names of Values])
Nombre es el parámetro para el título que queremos darle a nuestra NamedTuple, y
[Nombres de valores] es un marcador de posición para la lista que contiene los nombres de los diferentes valores o atributos.
Ejemplo de Python con nombre de tupla
El primer paso, como se dijo anteriormente, es importar NamedTuple.
from collections import namedtuple
Ahora podemos usar la sintaxis de la parte anterior para construir un NamedTuple:
Student = namedtuple('Student',['Name','Class','Age','Subject','Marks'])
En este ejemplo,
transición de opacidad css
Elegimos llamar a NamedTuple Student y mencionar los nombres de los valores, 'Nombre', 'Clase', 'Edad', 'Asunto' y 'Marcas' en una lista. Y hemos creado nuestro primer NamedTuple: Estudiante.
Ahora, podemos crear una casa Student1 con las especificaciones requeridas usando Student de la siguiente manera:
hacer y mientras bucle en java
Studnet1 = Student('Itika', 11, 15, 'English', 79)
Solo se requieren los valores o contenidos específicos que deben tener las etiquetas o campos en nuestros [Nombres de valores].
Para realizar una entrada de un nuevo estudiante, digamos Estudiante2, copie sus valores y péguelos en los campos de la nueva variable.
Studnet2 = Student('Arshia', 12, 17, 'Maths', 93)
Veremos que podemos usar Student como modelo para tomar un registro de nuevos estudiantes como queramos sin tener que llamar las etiquetas de los campos cada vez.
Cómo obtener los valores de una tupla con nombre usando la notación de puntos
Podemos usar el método de puntos para obtener los valores de las instancias NamedTuple Student1 y Student2. La siguiente es la sintaxis:
.
El siguiente ejemplo de código demuestra esto:
Código
print (Student1.Age) print (Student1.Class) print (Student1.Subject) print (Student1.Marks) print (Student1.Name)
Producción:
15 11 'English' 79 'Itika'
Asimismo, podemos recuperar las variables relacionadas con NamedTuple Student2 usando Student2.Age, Student2.Class, etc.
Los métodos de acceso de NamedTuple
Podemos recuperar los valores de NamedTuple usando índices, palabras clave y la función getattr(). Los valores de los campos de NamedTuple están estrictamente ordenados. Como resultado, podemos usar los índices para encontrarlos.
NamedTuple convierte los nombres de los campos en atributos. Como resultado, getattr() se puede utilizar para recuperar datos de ese campo.
Código
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'))
Producción:
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
Procedimientos de conversión de NamedTuple
Se pueden convertir diferentes colecciones a NamedTuple utilizando algunas técnicas. También podemos usar la función _make() para transformar una lista, tupla u otros objetos iterables en una instancia de NamedTuple.
También podemos convertir un objeto de tipo de datos de diccionario en una colección NamedTuple. Se requiere el operativo ** para esta transformación.
Como elemento de tipo de datos OrderedDict, NamedTuple puede generar elementos con sus claves. Podemos llamar a la función _asdict() para convertirla en un OrderedDict.
Código
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)
Producción:
Participant(Name='Itika', Age='21', Country='India') Participant(Name='Arshia', Age='19', Country='Australia') {'Name': 'Itika', 'Age': '21', 'Country': 'India'}
Más operaciones en NamedTuple
Hay otros métodos disponibles, como _fields() y _replace. Podemos determinar qué campos tiene NamedTuple llamando a la función _fields(). La función _replace() se utiliza para intercambiar un valor por otro.
Código
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)
Producción:
Participant(Name='Itika', Age='21', Country='India') The fields of Participant: ('Name', 'Age', 'Country') Participant(Name='Itika', Age='21', Country='Germany')
¿Cómo funciona NamedTuple de Python?
Veamos qué más podemos lograr con NamedTuple en Python.
1. Un NamedTuple en Python es inmutable.
Un NamedTuple en Python no se puede modificar, al igual que su versión normal. No podemos alterar sus características.
Intentaremos modificar una de las características de una tupla con el nombre 'Estudiante' para demostrar esto.
Código
from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) Student1.Class = 11
Producción:
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
Como puede verse, arroja un AttributeError. Como resultado, podemos inferir que NamedTuple es inmutable.
2. Crear un diccionario de Python a partir de un NamedTuple de Python
En Python, un NamedTuple es similar a un diccionario y podemos transformarlo en uno de la siguiente manera:
Código
operador condicional en java
from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) print ( Student1._asdict() )
Producción:
{'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93}
Utilizamos el. método asdict() para esto. Esto también produce un OrderedDict de Python.
3. NamedTuple con valores predeterminados
Una clase de tupla con nombre se puede configurar con parámetros predeterminados de la misma manera que podemos establecer valores iniciales para los atributos en una clase normal. Los valores predeterminados se asignan a los atributos situados más a la derecha, ya que los campos que tienen un valor predeterminado deben aparecer después de cada campo sin valor predeterminado.
Redefinamos la clase Estudiante con solo 1 entrada predeterminada.
Código
from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1 )
Producción:
Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100)
Se aplicará la cifra predeterminada 100 para las marcas, que es el campo más a la derecha en nuestra declaración si creamos NamedTuple con un solo valor.
¿Se aplicará el valor predeterminado para Edad si especificamos expresamente que el campo sea Edad?
Código
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 )
Producción:
TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject'
La respuesta es no. En NamedTuple, el orden de los campos es muy rígido. Incluso si declaramos algo expresamente, los valores predeterminados deben ser los más correctos para evitar ambigüedades y posibles dificultades.
hacer mientras bucle java
Beneficios de Python Namedtuple
Por supuesto, nadie utilizará NamedTuple si no ve ninguna ventaja. Entonces, esto es lo que tenemos:
1. A diferencia de una tupla estándar, una NamedTuple en Python puede recuperar variables por sus títulos.
Código
from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1.Age )
Producción:
17
2. Debido a que no incluye diccionarios por instancia, Python NamedTuple es tan eficiente en la memoria como una tupla convencional. También es más rápido que un diccionario debido a esto.
Conclusión
Aprendimos cómo NamedTuples nos permite combinar los beneficios de las tuplas y los diccionarios, cómo construir NamedTuples y cómo usarlos en este tutorial. Cómo recuperar los valores de NamedTuples usando la notación de puntos en Python, cómo funcionan
Si el lector está familiarizado con la programación orientada a objetos de Python, verá que es idéntica a cómo funcionan las clases de Python. Una clase y sus atributos actúan como modelo para crear muchos más objetos o instancias, cada uno con su propio conjunto de valores de atributos.
Sin embargo, para aumentar la claridad de nuestro código, definir una clase y proporcionar las características esenciales suele ser excesivo y, en su lugar, es mucho más rápido construir NamedTuples.