Pular para o conteúdo principal

Tuplas

As tuplas são o tipo composto mais simples de todos e bastante comum de serem usadas em Python, da mesma forma que anteriormente vimos que a string "ABC" é uma sequência de caracteres, com as tuplas conseguimos fazer uma sequência de valores que podem ser de qualquer tipo.

Exemplo de um sistema que armazena coordenadas sem o uso de tuplas:

coord_x = 140
coord_y = 200
coord_z = 9

Coordenadas desta forma são muito úteis em softwares de desenho gráfico ou mapas, temos a reta x e a reta y de um plano cartesiano, e ainda adicionamos a coordenada z que é a profundidade, usada em sistemas 3d.

Cada uma das coordenadas se refere a um ponto nessa reta e para definir um único ponto nós usamos 3 variáveis e isso fica muito difícil de manter caso o nosso sistema tenha muitas dessas coordenadas, e aí que entram as tuplas.

coord = 140, 200, 9

# ou

coord = (140, 200, 9)

Em Python, sempre que um ou mais objetos forem encadeados com , isso será interpretado como um objeto do tipo tupla e a tupla pode opcionalmente ter parênteses.

"Olá %s você é o %03d da fila" % (nome, senha)

No exemplo acima de interpolação, os parênteses são obrigatórios, mas no caso das nossas coordenadas, o jeito mais comum de declarar é mesmo usando a sintaxe sem os parênteses e usar os parênteses apenas quando for necessário para desambiguar.

coord = 140, 200, 9

Portanto, com este tipo de objeto não temos mais as variáveis x, y e z, agora temos uma única coord e para acessar os objetos que estão dentro da tupla usamos o protocolo de subscrição, os objetos que possuem um método chamado __getitem__ permitem que a gente acesse os seus elementos usando fatiamento [ ].

Então, digamos que precisamos no nosso jogo posicionar um objeto na tela naquela exata coordenada como fazemos?

coord = 140, 200, 9

mover_x_para_coordenada(coord[0])
mover_y_para_coordenada(coord[1])
mover_z_para_coordenada(coord[2])

Repare que podemos acessar coord[0] e assim por diante usando [numero] e este número se refere a posição do valor que queremos dentro da tupla.

Nestes casos, assumimos que seu software na hora de criar a variável coord se encarrega de colocar cada coisa em seu devido lugar :)

Existe uma infinidade de usos práticos para as tuplas, faremos os principais usos como em retorno de funções e leitura de banco de dados.

Desempacotamento

A característica mais interessante das tuplas se chama unpacking ou desempacotamento em português (algumas linguagens chamam isso de spread, espalhamento, explode).

O desempacotamento permite fazer a operação contrária da atribuição.

# Empacotamento (atribuição)
coord = 140, 200, 9

# Desempacotamento (atribuição multipla)
x, y, z = coord

No desempacotamento, o Python automaticamente vai pegar cada um dos elementos da tupla e usar para definir as variáveis que separarmos por ,.

Aliás, está aí uma dica que ainda não falamos, é possível atribuir mais de uma variável simultaneamente, em Python a = b = c = d = None faz com que todas sejam referências para None.

Imutabilidade

Outra característica importante e que talvez seja decisiva na hora de escolher usar tuplas é que elas são imutáveis, uma vez criada a tupla, não é possível alterar, não dá para mudar os valores ou adicionar novos. (este tópico contém algumas exceções como escopos).

Algumas coisas que podemos fazer com as tuplas:

# Atribuir sem parenteses
coord = 140, 200, 9

# Atribuir com parenteses
coord = (140, 200, 9)

# Desempacotar
x, y, z = coord

# Ignorar elementos (será atribuído apenas o x)
x, *_ = coord

# Pegar apenas o primeiro e o último elemento
x, *_, y = coord

# Verificar o tamanho
len(coord)
3

# Acessar via subscrição pelo índice
coord[0]
140

# Fatiar
coord[1:]
(200, 9)