Pergunta

Estou aprendendo Python para uma aula agora e acabamos de abordar as tuplas como um dos tipos de dados.Eu li a página da Wikipedia sobre isso, mas não consegui descobrir onde esse tipo de dados seria útil na prática.Posso ter alguns exemplos, talvez em Python, onde seria necessário um conjunto imutável de números?Como isso é diferente de uma lista?

Foi útil?

Solução

  • Tuplas são usadas sempre que você deseja retornar vários resultados de uma função.
  • Como são imutáveis, podem ser usados ​​como chaves para um dicionário (listas não podem).

Outras dicas

Tuplas são boas chaves de dicionário quando você precisa combinar mais de um dado em sua chave e não tem vontade de criar uma classe para isso.

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

Usei esse recurso principalmente para criar um dicionário com chaves que são coordenadas dos vértices de uma malha.No entanto, no meu caso particular, a comparação exata dos carros alegóricos envolvidos funcionou bem, o que pode nem sempre ser verdade para seus propósitos [nesse caso, eu provavelmente converteria seus carros alegóricos recebidos em algum tipo de número inteiro de ponto fixo]

Eu gosto esta explicação.

Basicamente, você deve usar tuplas quando houver uma estrutura constante (a 1ª posição sempre contém um tipo de valor e a segunda outro, e assim por diante), e listas devem ser usadas para listas de valores homogêneos.

É claro que sempre há exceções, mas esta é uma boa orientação geral.

Tuplas e listas têm os mesmos usos em geral.Os tipos de dados imutáveis ​​em geral trazem muitos benefícios, principalmente em relação a questões de simultaneidade.

Portanto, se você tem listas que não são voláteis por natureza e deseja garantir que nenhum usuário as altere, você pode usar uma tupla.

Exemplos típicos são dados fixos em um aplicativo, como divisões de empresas, categorias, etc.Se esses dados mudarem, normalmente um único produtor reconstruirá a tupla.

A melhor maneira de pensar sobre isso é:

  • Uma tupla é um registro cujos campos não têm nomes.
  • Você usa uma tupla em vez de um registro quando não se dá ao trabalho de especificar os nomes dos campos.

Então, em vez de escrever coisas como:

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

Ou o ainda mais detalhado:

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

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

Você pode simplesmente escrever:

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

Isso é útil quando você deseja transmitir um registro que possui apenas alguns campos ou um registro que é usado apenas em alguns lugares.Nesse caso, especificar um tipo de registro totalmente novo com nomes de campos (em Python, você usaria um objeto ou um dicionário, como acima) poderia ser muito detalhado.

Tuplas se originam do mundo da programação funcional (Haskell, OCaml, Elm, F#, etc.), onde são comumente usados ​​para esse fim.Ao contrário do Python, a maioria das linguagens de programação funcionais são tipadas estaticamente (uma variável só pode conter um tipo de valor, e esse tipo é determinado em tempo de compilação).A digitação estática torna o papel das tuplas mais óbvio.Por exemplo, na linguagem Elm:

type alias Person = (String, Int)

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

Isso destaca o fato de que um tipo específico de tupla sempre deve ter um número fixo de campos em uma ordem fixa, e cada um desses campos sempre deve ser do mesmo tipo.Neste exemplo, uma pessoa é sempre uma tupla de dois campos, um é uma string e o outro é um número inteiro.

O que foi dito acima contrasta fortemente com as listas, que deveriam ter comprimento variável (o número de itens normalmente é diferente em cada lista e você escreve funções para adicionar e remover itens) e cada item na lista é normalmente do mesmo tipo.Por exemplo, você teria uma lista de pessoas e outra lista de endereços – você não misturaria pessoas e endereços na mesma lista.Considerando que misturar diferentes tipos de dados dentro da mesma tupla é o objetivo das tuplas.Os campos em uma tupla geralmente são de tipos diferentes (mas nem sempre - por exemplovocê poderia ter um (Float, Float, Float) tupla para representar as coordenadas x, y, z).

Tuplas e listas geralmente são aninhadas. É comum ter uma lista de tuplas.Você poderia ter uma lista de tuplas Person, bem como uma lista de objetos Person.Você também pode ter um campo de tupla cujo valor é uma lista.Por exemplo, se você tiver um catálogo de endereços onde uma pessoa pode ter vários endereços, você poderá ter uma tupla do tipo (Person, [String]).O [String] type é comumente usado em linguagens de programação funcionais para denotar uma lista de strings.Em Python, você não escreveria o tipo, mas poderia usar tuplas assim exatamente da mesma maneira, colocando um Person objeto no primeiro campo de uma tupla e uma lista de strings em seu segundo campo.

Em Python, surge confusão porque a linguagem não impor qualquer uma dessas práticas impostas pelo compilador em linguagens funcionais de tipo estaticamente.Nessas linguagens, você não pode misturar diferentes tipos de tuplas.Por exemplo, você não pode devolver um (String, String) tupla de uma função cujo tipo diz que ela retorna um (String, Integer) tupla.Você também não pode retornar uma lista quando o tipo diz que você planeja retornar uma tupla e vice-versa.As listas são usadas estritamente para coleções crescentes de itens e as tuplas estritamente para registros de tamanho fixo.Python não impede você de quebrar nenhuma dessas regras, se quiser.

Em Python, uma lista às vezes é convertida em uma tupla para uso como chave de dicionário, porque as chaves de dicionário Python precisam ser imutáveis ​​(ou seja,constantes), enquanto as listas Python são mutáveis ​​(você pode adicionar e remover itens a qualquer momento).Esta é uma solução alternativa para uma limitação específica do Python, não uma propriedade das tuplas como um conceito da ciência da computação.

Portanto, em Python, as listas são mutáveis ​​e as tuplas são imutáveis.Mas esta é apenas uma escolha de design, não uma propriedade intrínseca de listas e tuplas na ciência da computação.Você poderia muito bem ter listas imutáveis ​​e tuplas mutáveis.

Em Python (usando a implementação padrão do CPython), as tuplas também são mais rápidas que objetos ou dicionários para a maioria dos propósitos, portanto, são usadas ocasionalmente por esse motivo, mesmo quando nomear os campos usando um objeto ou dicionário seria mais claro.

Finalmente, para tornar ainda mais óbvio que as tuplas pretendem ser outro tipo de registro (não outro tipo de lista), Python também tem tuplas nomeadas:

from collections import namedtuple

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

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

Esta é muitas vezes a melhor escolha - mais curta do que definir uma nova classe, mas o significado dos campos é mais óbvio do que quando se usam tuplas normais cujos campos não têm nomes.

Listas imutáveis ​​são altamente úteis para muitos propósitos, mas o tópico é complexo demais para ser respondido aqui.O ponto principal é que é mais fácil raciocinar sobre coisas que não podem mudar do que coisas que podem mudar.A maioria dos bugs de software vem de mudanças inesperadas, portanto, restringir as maneiras pelas quais eles podem mudar é uma boa maneira de eliminar bugs.Se você estiver interessado, recomendo a leitura de um tutorial de uma linguagem de programação funcional como Elm, Haskell ou Clojure (Elm é o mais amigável).Os projetistas dessas linguagens consideraram a imutabilidade tão útil que todos as listas são imutáveis ​​​​lá.(Em vez de alterar uma lista para adicionar ou remover um item, você faça uma nova lista com o item adicionado ou removido.A imutabilidade garante que a cópia antiga da lista nunca possa ser alterada, de modo que o compilador e o tempo de execução possam fazer o código funcionar bem reutilizando partes da lista antiga na nova e coletando o lixo das partes restantes quando elas forem mais longas necessário.)

Acho-os úteis quando você sempre lida com dois ou mais objetos como um conjunto.

Uma tupla é uma sequência de valores.Os valores podem ser de qualquer tipo e são indexados por número inteiro, portanto as tuplas não são como listas.A diferença mais importante é que tuplas são imutáveis.

Uma tupla é uma lista de valores separados por vírgula:

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

é uma boa prática colocar tuplas entre parênteses:

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

Uma lista sempre pode substituir uma tupla, no que diz respeito à funcionalidade (exceto, aparentemente, como chaves em um ditado).No entanto, uma tupla pode tornar as coisas mais rápidas.O mesmo se aplica, por exemplo, a strings imutáveis ​​em Java – quando você precisará ser incapaz de alterar suas strings?Nunca!

Acabei de ler uma discussão decente sobre como limitar o que você pode fazer para criar programas melhores; Por que Por que a programação funcional é importante?

Uma tupla é útil para armazenar vários valores.Como você observa, uma tupla é como uma lista imutável - por exemplo.uma vez criado, você não pode adicionar/remover/trocar elementos.

Um benefício de ser imutável é que, como a tupla tem tamanho fixo, ela permite que o tempo de execução execute certas otimizações.Isso é particularmente benéfico quando uma tupla é usada no contexto de um valor de retorno ou parâmetro de uma função.

Além dos locais onde eles são sintaticamente necessários, como a operação string % e para vários valores de retorno, eu uso tuplas como uma forma de classes leves.Por exemplo, suponha que você tenha um objeto que distribui um cookie opaco para um chamador de um método, que é então passado para outro método.Uma tupla é uma boa maneira de incluir vários valores nesse cookie sem precisar definir uma classe separada para contê-los.

No entanto, tento ser criterioso sobre esse uso específico.Se os cookies forem usados ​​generosamente em todo o código, é melhor criar uma classe porque isso ajuda a documentar seu uso.Se forem utilizados apenas num local (por ex.um par de métodos), então eu poderia usar uma tupla.De qualquer forma, por ser Python, você pode começar com uma tupla e depois alterá-la para uma instância de uma classe personalizada sem precisar alterar nenhum código no chamador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top