Pregunta

Ahora estoy aprendiendo Python para una clase y acabamos de cubrir las tuplas como uno de los tipos de datos.Leí la página de Wikipedia al respecto, pero no pude entender dónde sería útil ese tipo de datos en la práctica.¿Puedo darme algunos ejemplos, tal vez en Python, donde se necesitaría un conjunto inmutable de números?¿En qué se diferencia esto de una lista?

¿Fue útil?

Solución

  • Las tuplas se utilizan siempre que desee devolver varios resultados de una función.
  • Como son inmutables, se pueden usar como claves para un diccionario (las listas no).

Otros consejos

Las tuplas son buenas claves de diccionario cuando necesitas combinar más de un dato en tu clave y no tienes ganas de crear una clase para ello.

a = {}
a[(1,2,"bob")] = "hello!"
a[("Hello","en-US")] = "Hi There!"

He usado esta característica principalmente para crear un diccionario con claves que son coordenadas de los vértices de una malla.Sin embargo, en mi caso particular, la comparación exacta de los flotadores involucrados funcionó bien, lo que puede no ser siempre cierto para sus propósitos [en cuyo caso probablemente convertiría los flotadores entrantes en algún tipo de entero de punto fijo]

Me gusta esta explicación.

Básicamente, debes usar tuplas cuando hay una estructura constante (la primera posición siempre contiene un tipo de valor y la segunda otro, y así sucesivamente), y las listas deben usarse para listas de valores homogéneos.

Por supuesto, siempre hay excepciones, pero ésta es una buena pauta general.

Las tuplas y las listas tienen los mismos usos en general.Los tipos de datos inmutables en general tienen muchos beneficios, principalmente en cuestiones de concurrencia.

Entonces, si tiene listas que no son de naturaleza volátil y quiere asegurarse de que ningún usuario las esté modificando, puede usar una tupla.

Ejemplos típicos son datos fijos en una aplicación como divisiones de empresa, categorías, etc.Si estos datos cambian, normalmente un único productor reconstruye la tupla.

La mejor manera de pensarlo es:

  • Una tupla es una registro cuyos campos no tienen nombres.
  • Utiliza una tupla en lugar de un registro cuando no puede molestarse en especificar los nombres de los campos.

Entonces, en lugar de escribir cosas como:

person = {"name": "Sam", "age": 42}
name, age = person["name"], person["age"]

O el aún más detallado:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Sam", 42)
name, age = person.name, person.age

Puedes simplemente escribir:

person = ("Sam", 42)
name, age = person

Esto es útil cuando desea pasar un registro que tiene solo un par de campos o un registro que solo se usa en unos pocos lugares.En ese caso, especificar un tipo de registro completamente nuevo con nombres de campos (en Python, usarías un objeto o un diccionario, como arriba) podría ser demasiado detallado.

Las tuplas se originan en el mundo de la programación funcional. (Haskell, OCaml, Elm, F#, etc.), donde se utilizan habitualmente para este fin.A diferencia de Python, la mayoría de los lenguajes de programación funcionales tienen tipos estáticos (una variable solo puede contener un tipo de valor y ese tipo se determina en el momento de la compilación).La escritura estática hace que el papel de las tuplas sea más obvio.Por ejemplo, en el idioma Elm:

type alias Person = (String, Int)

person : Person
person = ("Sam", 42)

Esto resalta el hecho de que siempre se supone que un tipo particular de tupla tiene un número fijo de campos en un orden fijo, y se supone que cada uno de esos campos siempre es del mismo tipo.En este ejemplo, una persona es siempre una tupla de dos campos, uno es una cadena y el otro es un número entero.

Lo anterior contrasta marcadamente con las listas, que se supone que tienen una longitud variable (el número de elementos normalmente es diferente en cada lista y usted escribe funciones para agregar y eliminar elementos) y cada elemento de la lista normalmente es del mismo tipo.Por ejemplo, tendría una lista de personas y otra lista de direcciones; no mezclaría personas y direcciones en la misma lista.Mientras que mezclar diferentes tipos de datos dentro de la misma tupla es el objetivo de las tuplas.Los campos de una tupla suelen ser de diferentes tipos (pero no siempre, p. ej.podrías tener un (Float, Float, Float) tupla para representar las coordenadas x,y,z).

Las tuplas y listas suelen estar anidadas. Es común tener una lista de tuplas.Podría tener una lista de tuplas de Persona así como una lista de objetos de Persona.También puedes tener un campo tupla cuyo valor sea una lista.Por ejemplo, si tiene una libreta de direcciones donde una persona puede tener varias direcciones, podría tener una tupla del tipo (Person, [String]).El [String] El tipo se usa comúnmente en lenguajes de programación funcionales para indicar una lista de cadenas.En Python, no escribirías el tipo, pero podrías usar tuplas como esa exactamente de la misma manera, poniendo un Person objeto en el primer campo de una tupla y una lista de cadenas en su segundo campo.

En Python surge la confusión porque el idioma no hacer cumplir cualquiera de estas prácticas que aplica el compilador en lenguajes funcionales de tipo estático.En esos idiomas, no se pueden mezclar diferentes tipos de tuplas.Por ejemplo, no puedes devolver un (String, String) tupla de una función cuyo tipo dice que devuelve un (String, Integer) tupla.Tampoco puede devolver una lista cuando el tipo dice que planea devolver una tupla y viceversa.Las listas se utilizan estrictamente para colecciones crecientes de elementos y las tuplas estrictamente para registros de tamaño fijo.Python no te impide romper ninguna de estas reglas si así lo deseas.

En Python, una lista a veces se convierte en una tupla para usarla como clave de diccionario, porque las claves del diccionario de Python deben ser inmutables (es decir,constantes), mientras que las listas de Python son mutables (puede agregar y eliminar elementos en cualquier momento).Esta es una solución alternativa para una limitación particular de Python, no una propiedad de las tuplas como concepto informático.

Entonces, en Python, las listas son mutables y las tuplas son inmutables.Pero esto es sólo una elección de diseño, no una propiedad intrínseca de las listas y tuplas en informática.También podrías tener listas inmutables y tuplas mutables.

En Python (usando la implementación CPython predeterminada), las tuplas también son más rápidas que los objetos o diccionarios para la mayoría de los propósitos, por lo que ocasionalmente se usan por ese motivo, incluso cuando nombrar los campos usando un objeto o diccionario sería más claro.

Finalmente, para que sea aún más obvio que las tuplas pretenden ser otro tipo de registro (no otro tipo de lista), Python también tiene tuplas nombradas:

from collections import namedtuple

Person = namedtuple("Person", "name age")

person = Person("Sam", 42)
name, age = person.name, person.age

Esta suele ser la mejor opción: más corta que definir una nueva clase, pero el significado de los campos es más obvio que cuando se usan tuplas normales cuyos campos no tienen nombres.

Las listas inmutables son muy útiles para muchos propósitos, pero el tema es demasiado complejo para responderlo aquí.El punto principal es que es más fácil razonar sobre las cosas que no pueden cambiar que sobre las cosas que sí pueden cambiar.La mayoría de los errores de software provienen de cosas que cambian de manera inesperada, por lo que restringir las formas en que pueden cambiar es una buena manera de eliminar errores.Si estás interesado, te recomiendo leer un tutorial de algún lenguaje de programación funcional como Elm, Haskell o Clojure (Elm es el más amigable).Los diseñadores de esos lenguajes consideraron la inmutabilidad tan útil que todo Las listas son inmutables allí.(En lugar de cambiar una lista para agregar o eliminar un elemento, usted hacer una nueva lista con el elemento agregado o eliminado.La inmutabilidad garantiza que la copia antigua de la lista nunca pueda cambiar, por lo que el compilador y el tiempo de ejecución pueden hacer que el código funcione bien reutilizando partes de la lista antigua en la nueva y recogiendo las partes sobrantes cuando sean más largas. necesario.)

Los encuentro útiles cuando siempre se trata de dos o más objetos como un conjunto.

Una tupla es una secuencia de valores.Los valores pueden ser de cualquier tipo y están indexados por números enteros, por lo que las tuplas no son como listas.La diferencia más importante es que las tuplas son inmutables.

Una tupla es una lista de valores separados por comas:

t = 'p', 'q', 'r', 's', 't'

Es una buena práctica encerrar tuplas entre paréntesis:

t = ('p', 'q', 'r', 's', 't') 

Una lista siempre puede reemplazar una tupla, con respecto a la funcionalidad (excepto, aparentemente, como claves en un dict).Sin embargo, una tupla puede hacer que las cosas vayan más rápido.Lo mismo ocurre, por ejemplo, con las cadenas inmutables en Java: ¿cuándo necesitarás no poder modificar tus cadenas?¡Nunca!

Acabo de leer una discusión decente sobre cómo limitar lo que se puede hacer para crear mejores programas; Por qué es importante la programación funcional

Una tupla es útil para almacenar múltiples valores.Como observará, una tupla es como una lista que es inmutable, p.una vez creado no se pueden agregar/eliminar/intercambiar elementos.

Un beneficio de ser inmutable es que debido a que la tupla tiene un tamaño fijo, permite que el tiempo de ejecución realice ciertas optimizaciones.Esto es particularmente beneficioso cuando se utiliza una tupla en el contexto de un valor de retorno o un parámetro de una función.

Además de los lugares donde se requieren sintácticamente, como la operación % de cadena y para múltiples valores de retorno, uso tuplas como una forma de clases ligeras.Por ejemplo, supongamos que tiene un objeto que pasa una cookie opaca a una persona que llama desde un método, que luego se pasa a otro método.Una tupla es una buena manera de empaquetar múltiples valores en esa cookie sin tener que definir una clase separada para contenerlos.

Sin embargo, trato de ser prudente acerca de este uso en particular.Si las cookies se utilizan generosamente en todo el código, es mejor crear una clase porque ayuda a documentar su uso.Si sólo se utilizan en un lugar (p. ej.un par de métodos), entonces podría usar una tupla.En cualquier caso, como es Python, puedes comenzar con una tupla y luego cambiarla a una instancia de una clase personalizada sin tener que cambiar ningún código en la persona que llama.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top