En Python, no hay una cláusula struct como en C.
Pero todavía hay formas de crear tipos de datos personalizados, cada uno con sus propias ventajas y desventajas, pero con ninguno de estos está limitado a un solo tipo de datos (aunque los ejemplos solo muestran uno).
Python no se preocupa mucho por los tipos de datos, siempre que sean compatibles con las funciones.
- ¿Cuáles son algunas características comunes utilizadas en la clasificación basada en audio?
- ¿Por qué el embolsado es más preciso que solo mirar todo el conjunto de datos y tomar el promedio?
- En los algoritmos de aprendizaje automático, ¿por qué la función sigmoidea se usa principalmente y no funciones como tanh (x)? En tanhx por ej. parece dividir el eje y de manera uniforme y aplanarse rápidamente a medida que x se aproxima a +/- infinito. El rango es: sigmoide [0-1] y tanh (x) [-1,1].
- ¿Cuáles son los algoritmos de aprendizaje de refuerzo más eficientes en datos / muestras?
- ¿Puede un contador estar completamente automatizado para 2030? Si es así, ¿cuál es la mejor manera de salvar mi trabajo?
El método más complicado es escribir una clase personalizada. Esto es muy similar a cómo se definen los tipos de datos integrados, pero implica un poco de código.
clase Pixel:
def __init __ (auto, rojo, verde, azul):
self.red = rojo
self.green = green
self.blue = azul
Entonces podemos instanciar un píxel y usarlo así:
pixel_white = Pixel (255, 255, 255) # píxel blanco
red_color_channel = pixel_white.red # 255
Algunos problemas al usar las clases es que son mutables y su representación no es muy útil. Además, debe hacer su propia verificación de tipo:
pixel_white.alpha = 0 # esto es legal
imprimir (pixel_white)
#
# Esto se puede cambiar definiendo un método __repr__ personalizado
En resumen, las clases te dan toda la flexibilidad del mundo, pero a veces solo quieres algo simple.
Aquí vienen las tuplas:
punto3d = (150, 0, 255) # XYZ
La principal ventaja es la poca cantidad de código que se necesita para crear uno.
# Acceso a un solo campo
print (punto 3d [0]) # 150
Dado que las tuplas no tienen campos con nombre de concepto, debe acceder a ellas por índice.
Como las tuplas son inmutables, no puede cambiar campos individuales. Tienes que destruir el objeto y crear uno nuevo.
# Las tuplas son inmutables
punto3d [0] = 5 # ilegal
punto3d = (5, 0, 255) # XYZ
La representación de objetos Tuples es más útil que la clase personalizada, pero aún no nos dice mucho acerca de lo que significan los números.
print (punto3d) # (150, 0, 255)
Como alternativa, también hemos nombrado tuplas, que es justo lo que dice; tuplas con nombre. Las tuplas con nombre resuelven muchos de los problemas con las tuplas ordinarias, pero conservan su inmutabilidad.
Se definen así:
de colecciones importadas namedtuple
p1 = namedtuple (‘Point3D’, ‘xy z’) (150, 0, 255)
# Acceso al valor único
x_coordinate = p1.x # 150
y_coordinado = p1 [1] # 0
# representación de objeto
print (p1) # Point3D (x = 150, y = 0, z = 255)
p1.x = 5 # es ilegal
Vemos que la representación de objetos ahora es realmente muy útil, y podemos acceder a los valores por nombre y por índice.
Además, no podemos cambiar los valores sin destruir el objeto, y la sintaxis de creación de objetos es un poco extraña.
En Python 3.6 se agregó una nueva forma de definir tuplas con nombre. Ahora, puede hacer una clase que herede una clase de tupla con nombre así:
de escribir import NamedTuple
Clase de coche (NamedTuple):
color: str
kilometraje: flotador
automático: bool
my_car = Car (“rojo”, 21.1, verdadero)
my_second_car = Auto (color = “verde”, kilometraje = 28.5, automático = Falso)
# representación de objeto
print (my_car) # Car (color = ‘rojo’, kilometraje = 21.1, automático = True)
# acceso al valor único
my_car_color = my_car.color # red
my_second_car_color = my_second_car [0] # verde
# la clase de coches sigue siendo inmutable
my_car.color = “black” # ilegal
my_car.price = 15000 # ilegal
Finalmente, también está el tipo de diccionario incorporado que de muchas maneras funciona de manera similar a una tupla mutable, llamada, pero sin el índice.
point3d = {
“x”: 150,
“y”: 0,
“z”: 250,
}
# representación de objeto
print (point3d) # {‘x’: 150, ‘y’: 0, ‘z’: 250}
# acceder a un solo valor
x_coordinate = point3d [“x”]
# mutabilidad
point3d [“x”] = 5 # es legal
point3d [“coord_system”] = “el mejor” # es legal
La forma en que debe definir nuevos tipos de datos mixtos depende de la situación, pero ahora tiene algunas herramientas para compensar la cláusula de estructura faltante.