O que é uma tupla útil para?

votos
36

Eu estou aprendendo Python para uma classe agora, e nós apenas coberto tuplas como um dos tipos de dados. Eu li a página da Wikipedia sobre ele, mas, eu não conseguia descobrir onde tal 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?

Publicado 03/09/2008 em 17:13
fonte usuário
Em outras línguas...                            


10 respostas

votos
45

  • Tuplas são usadas sempre que você quiser retornar vários resultados de uma função.
  • Como eles são imutáveis, eles podem ser usados ​​como chaves para um dicionário (listas não pode).
Respondeu 03/09/2008 em 17:18
fonte usuário

votos
18

Tuples fazer boas chaves de dicionário quando você precisa combinar mais de um pedaço de dados em sua chave e não sentir vontade de fazer uma classe para ele.

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

Eu 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 envolveu funcionou bem que pode nem sempre ser verdadeiro para os seus fins [caso em que eu provavelmente converter seus carros alegóricos de entrada para algum tipo de ponto fixo inteiro]

Respondeu 03/09/2008 em 17:20
fonte usuário

votos
8

Eu gosto desta explicação .

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

Claro que há sempre excepções, mas esta é uma boa orientação geral.

Respondeu 07/09/2008 em 14:12
fonte usuário

votos
2

A melhor maneira de pensar sobre isso é:

  • Uma tupla é um registro cujos campos não têm nomes.
  • Você usar uma tupla em vez de um registro quando você não pode ser incomodado para especificar os nomes dos campos.

Então, ao invés de escrever coisas como:

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

Ou 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 apenas escrever:

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

Isto é útil quando você quer passar em torno de um registro que tem apenas um par de campos, ou um registro que só é usado em alguns lugares. Nesse caso, a especificação de um novo tipo de registro inteiro com nomes de campo (em Python, você pode usar um objeto ou um dicionário, como acima) poderia ser muito detalhado.

Tuples origem no mundo da programação funcional (Haskell, OCaml, Elm, F #, etc.), onde eles são comumente usados para esta finalidade. Ao contrário de Python, linguagens de programação mais funcionais são de tipagem estática (uma variável só pode conter um tipo de valor, e que tipo é determinado em tempo de compilação). Tipagem estática faz o papel de tuplas mais evidente. Por exemplo, na língua Elm:

type Person = (String, Int)

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

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

A descrição acima é em contraste com listas , que se supõe ser de comprimento variável (o número de itens é normalmente diferente em cada lista, e você escrever funções para adicionar e remover itens) e cada item na lista é normalmente do mesmo tipo . Por exemplo, você tem uma lista de pessoas e uma outra lista de endereços - você não iria misturar pessoas e endereços na mesma lista. Considerando que a mistura de diferentes tipos de dados dentro da mesma tupla é o ponto de tuplos. Campos em um tuple são geralmente de diferentes tipos (mas nem sempre - por exemplo, você poderia ter uma (Float, Float, Float)tupla para representar x, y, z coordenadas).

Tuplas e listas são muitas vezes aninhados. É comum ter uma lista de tuplas. Você poderia ter uma lista de pessoas tuplas tão bem como uma lista de objetos Person. Você também pode ter um campo tupla cujo valor é uma lista. Por exemplo, se você tem um livro de endereços, onde uma pessoa pode ter vários endereços, você poderia ter uma tupla do tipo (Person, [String]). O [String]tipo é comumente usado em linguagens de programação funcional para denotar uma lista de strings. Em Python, você não iria escrever o tipo, mas você poderia usar tuplas como essa, exatamente da mesma maneira, colocando um Personobjeto no primeiro campo de uma tupla e uma lista de cordas em seu segundo campo.

Em Python, confusão surge porque a linguagem não cumprir qualquer uma dessas práticas que são aplicadas pelo compilador em linguagens funcionais de tipagem estática. Nessas línguas, você não pode misturar diferentes tipos de tuplas. Por exemplo, você não pode retornar uma (String, String)tupla de uma função cujo tipo diz que ele retorna uma (String, Integer)tupla. Você também não pode retornar uma lista quando o tipo diz que você pretende retornar uma tupla, e vice-versa. As listas são utilizadas estritamente para o cultivo de coleções de itens, e tuplas estritamente para registros de tamanho fixo. Python não impedi-lo de quebrar uma dessas regras, se você quiser.

Em Python, uma lista às vezes é convertido em uma tupla para o uso como uma chave de dicionário, porque chaves de dicionário Python precisa ser imutável valores (ie constante), enquanto listas Python são mutáveis ​​(você pode adicionar e remover itens a qualquer momento). Esta é uma solução alternativa para uma limitação particular em Python, não uma propriedade de tuplas como um conceito de ciência da computação.

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

Em Python (usando a implementação CPython padrão), tuplas também são mais rápidos que objetos ou dicionários para a maioria dos propósitos, então eles são usados ​​ocasionalmente, por essa razão, mesmo quando nomear os campos usando um objeto ou dicionário seria mais claro.

Finalmente, para torná-lo ainda mais óbvio que tuplas são destinados a ser um outro tipo de registro (não um outro tipo de lista), o Python também nomeadas tuplas :

from collections import namedtuple

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

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

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

Listas imutáveis são muito úteis para muitos propósitos , mas o tema é complexo demais para responder aqui. O ponto principal é que as coisas que não podem mudar são mais fáceis de raciocinar sobre que coisas que podem mudar. A maioria dos bugs de software vêm de coisas mudando de maneiras inesperadas, assim restringindo as maneiras pelas quais eles podem mudar é uma boa maneira de eliminar bugs. Se você estiver interessado, eu recomendo a leitura de um tutorial para uma linguagem de programação funcional, como Elm, Haskell ou Clojure (Elm é o mais amigável). Os designers dessas línguas consideradas imutabilidade tão útil que todas as listas são imutáveis lá. (Em vez de mudar uma lista para adicionar e ou remover um item, você fazer uma nova lista com o item adicionado ou removido . Imutabilidade garante que a cópia antiga da lista nunca pode mudar, de modo que o compilador e tempo de execução pode tornar o código um bom desempenho através da reutilização de peças da lista de velho no novo e as peças que sobraram quando eles são mais necessários de coleta de lixo.)

Respondeu 25/09/2018 em 14:45
fonte usuário

votos
2

Tuplas e listas têm as mesmas utilizações em geral. tipos de dados imutáveis ​​em geral, têm muitos benefícios, principalmente sobre questões de concorrência.

Então, quando você tem listas que não são de natureza volátil e você precisa garantir que nenhum consumidor está alterando-lo, você pode usar uma tupla.

Exemplos típicos são dados fixo em uma aplicação como divisões da empresa, categorias, etc. Se esta mudança de dados, normalmente um único produtor rebuilts tupla.

Respondeu 03/09/2008 em 17:25
fonte usuário

votos
2

Eu encontrá-los úteis quando você sempre lidar com dois ou mais objetos como um conjunto.

Respondeu 03/09/2008 em 17:19
fonte usuário

votos
1

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

Uma vantagem de ser imutável é que por causa da tupla é fixo tamanho permite que o tempo de execução para executar determinadas otimizações. Isto é particularmente benéfico quando um tupple é usado no contexto de um valor de retorno ou um parâmetro de uma função.

Respondeu 03/09/2008 em 17:23
fonte usuário

votos
1

Uma lista sempre pode substituir uma tupla, em relação à funcionalidade (exceto, aparentemente, como chaves em um dicionário). No entanto, uma tupla pode tornar as coisas mais rápido. O mesmo é verdadeiro para, por exemplo, cordas imutáveis ​​em Java - quando você vai precisar para ser incapaz de alterar suas cordas? Nunca!

Acabei de ler uma discussão decente em limitar o que você pode fazer, a fim de tomar melhores programas; Por quê programação funcional Matters Matters

Respondeu 03/09/2008 em 17:20
fonte usuário

votos
0

Um tuplo é uma sequência de valores. Os valores podem ser de qualquer tipo, e eles são indexados pelo número inteiro, então tuplas não são como listas. A diferença mais importante é que tuplas são imutáveis.

Um tuplo é uma lista separada por vírgulas de valores:

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

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

t = ('p', 'q', 'r', 's', 't') 
Respondeu 22/09/2016 em 11:54
fonte usuário

votos
0

Além dos lugares onde eles estão sintaticamente necessários, como a operação de cadeia% e para vários valores de retorno, eu uso tuplas como uma forma de aulas leves. Por exemplo, suponha que você tenha um objeto que passa para fora um cookie opaco para um chamador de um método que é, em seguida, passou para outro método. Uma tupla é uma boa maneira para embalar vários valores para esse cookie sem ter que definir uma classe separada para contê-los.

Tento ser criterioso sobre este uso particular, embora. Se os cookies são usados ​​liberalmente durante todo o código, é melhor criar uma classe porque ajuda a documentar o seu uso. Se eles são usados ​​apenas num único local (por exemplo, um par de métodos) então pode usar um tuplo. Em qualquer caso, porque é Python você pode começar com uma tupla e, em seguida, alterá-lo para uma instância de uma classe personalizada sem ter que alterar qualquer código no chamador.

Respondeu 09/09/2008 em 04:56
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more