2.8. Tuplos¶
Um tuplo é uma sequência imutável e ordenada de valores. Uma vez criado, os itens no seu interior não podem ser adicionados, removidos ou alterados.
2.8.1. Criar tuplos¶
Use parênteses (ou simplesmente vírgulas) para criar um tuplo:
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 armadilha do elemento único¶
Os parênteses à volta de um valor são apenas parênteses; o que realmente faz um tuplo é a vírgula. Um tuplo de um elemento precisa de uma vírgula no 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 cadeias de caracteres – len(), indexação, fatiamento, in e + / * funcionam todos 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¶
Os tuplos não têm append, pop, sort nem qualquer outro método no próprio lugar. A atribuição por índice levanta 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» um tuplo, construa um novo com os valores alterados.
2.8.4. Desempacotar¶
O superpoder principal de um tuplo é o desempacotamento: atribuir cada item a uma variável separada numa única instrução.
O desempacotamento liga cada elemento de um tuplo a uma variável com nome numa única atribuição.¶
>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4
O lado direito pode ser qualquer iterável – uma lista, uma cadeia de caracteres, o valor de retorno de uma função:
>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')
Um * no início recolhe «o resto» de um desempacotamento numa 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 devolver um tuplo para entregar vários valores de uma só vez; quem chama desempacota-os na receção:
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 é um tuplo.
2.8.6. Tuplo vs lista¶
Um guia prático para saber qual escolher:
Tuplo para dados de forma fixa, 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 a que se espere acrescentar.
Os tuplos são também hasháveis (desde que todos os elementos internos sejam hasháveis), pelo que podem ser usados como chaves num dict.