2.8. Tuplas¶
Uma tupla é uma sequência imutável e ordenada de valores. Uma vez criada, os itens internos não podem ser adicionados, removidos ou alterados.
2.8.1. Criando tuplas¶
Use parênteses (ou apenas vírgulas) para criar uma tupla:
empty = ()
point = (3, 4)
triple = 1, 2, 3 # parentheses are optional
mixed = (1, "two", 3.14)
nested = ((1, 2), (3, 4))
2.8.1.1. A pegadinha do elemento único¶
Parênteses ao redor de um valor são apenas parênteses; o que de fato cria uma tupla é a vírgula. Uma tupla de um elemento precisa de uma vírgula final:
>>> (1)
1 # just an int in parens
>>> (1,)
(1,) # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)
2.8.2. Comprimento, indexação e fatiamento¶
Igual a listas e strings – len(), indexação, fatiamento, in e + / * todos funcionam da mesma forma:
>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)
2.8.3. Imutabilidade¶
Tuplas não têm append, pop, sort nem qualquer outro método no próprio local. A atribuição indexada gera TypeError:
>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment
Para “modificar” uma tupla, construa uma nova com os valores alterados.
2.8.4. Desempacotamento¶
O principal superpoder de uma tupla é o desempacotamento: atribuir cada item a uma variável separada em uma única instrução.
O desempacotamento vincula cada elemento de uma tupla a uma variável nomeada em uma única atribuição.¶
>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4
O lado direito pode ser qualquer iterável – uma lista, uma string, o valor de retorno de uma função:
>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')
Um * inicial coleta “o restante” de um desempacotamento em uma lista:
>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]
2.8.5. Múltiplos valores de retorno¶
Uma função pode retornar uma tupla para entregar vários valores de uma só vez; o chamador os desempacota na chegada:
def size_of(rect):
return (rect[2] - rect[0], rect[3] - rect[1])
width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120
Os parênteses no return são opcionais – um simples return a, b também é uma tupla.
2.8.6. Tupla vs lista¶
Um guia prático sobre qual escolher:
Tupla para dados de formato fixo, frequentemente heterogêneos: pontos
(x, y), cores(r, g, b), múltiplos valores de retorno, argumentos de função empacotados para uso posterior.Lista para dados de comprimento variável, frequentemente homogêneos: uma lista de medições, uma fila de itens a processar, qualquer coisa à qual você espera anexar.
Tuplas também são hashable (desde que todos os elementos internos sejam hashable), então podem ser usadas como chaves em um dict.