Tuplas
A tupla é uma lista que não muda. Guarda vários valores em ordem, com índice começando em 0, mas depois de criada ninguém troca, acrescenta ou tira nada. Ela é escrita com parênteses: (8.5, 7.0, 6.5).
Nesta lição0 de 5 vistas
notas = [8.5, 7.0, 6.5]notas[0] → 8.5
notas = (8.5, 7.0, 6.5)notas[0] → 8.5
Acessar é igual nas duas. A diferença aparece quando se tenta mudar.
Lista ou tupla?
Quase tudo igual, menos mudar| Lista | Tupla | |
|---|---|---|
| Escreve com | [7, 5, 9] | (7, 5, 9) |
Acessar v[0], fatia, len, in, for | pode | pode |
Trocar v[0] = 1 | pode | erro |
append, insert, del, pop, remove | pode | erro |
count, index | pode | pode |
| Um valor só | [5] | (5,) |
| Use para | valores que vão mudar: o que vai sendo lido | valores que andam juntos e ficam fixos: (nome, idade), (x, y) |
Antes de rodar, preveja
Com pessoa = ('Ana', 28, 'Petrolina'). Se der erro, escreva erro.
pessoa[0]pessoa[-1]len(pessoa)pessoa[0:2]28 in pessoapessoa.index('Petrolina')pessoa + (1,)type((5))
A tupla não muda
Mas o que está dentro dela podeTrocar um valor: erro
t = ('Python', 10, [1, 2])t[0] = 'Java'
No Thonny, aparece TypeError: 'tuple' object does not support item assignment.
Mudar a lista que está dentro: funciona
t = ('Python', 10, [1, 2])t[2].append(3)print(t)
A tupla continua guardando a mesma lista na posição 2. Quem mudou foi a lista, por dentro, e lista pode mudar.
Empacotar e desempacotar
Uma variável para cada valorDesempacotar
pessoa = ('Ana Maria', 28, 'Petrolina')nome, idade, cidade = pessoaprint(cidade)
Cada variável pega o valor da mesma posição. A quantidade tem que ser igual dos dois lados.
Trocar sem auxiliar
a = 3b = 5a, b = b, aprint(a, b)
O Python monta primeiro a tupla da direita, (b, a), com os valores antigos, e só depois distribui. Com a = b e depois b = a, os dois ficariam iguais.
a = int(input())b = int(input())a, b = b, aprint(a, b)
Linha 1a = int(input()) → 3 (o usuário digitou "3")
3
enumerate e zip
Tuplas entregues ao for, e o mesmo com whileOs dois entregam tuplas para o for, por isso o for tem duas variáveis. Cada um faz o mesmo que um while com índice.
enumerate: posição e valor
cidades = ['Petrolina', 'Juazeiro']for i, cidade in enumerate(cidades):print(i, cidade)
cidades = ['Petrolina', 'Juazeiro']i = 0while i < len(cidades):print(i, cidades[i])i = i + 1
zip: duas listas lado a lado
alunos = ['Ana', 'Bia']notas = [8.5, 7.0]for aluno, nota in zip(alunos, notas):print(aluno, nota)
alunos = ['Ana', 'Bia']notas = [8.5, 7.0]i = 0while i < len(alunos):print(alunos[i], notas[i])i = i + 1
Função que devolve vários valores
return a, b devolve uma tupladef menor_maior(a, b):if a < b:return a, breturn b, ax, y = menor_maior(9, 4)print(x, y)
return a, b devolve uma tupla. Quem chama desempacota direto em duas variáveis. É o que pede a questão das estatísticas: devolver (menor, maior, soma) de uma vez.
Erros que mais aparecem na prova
5 errosTentar mudar a tupla.
t[0] = 'x', t.append(3) e del t[1] dão erro. Se os valores vão mudar, a estrutura certa é a lista. A tupla serve para o que fica fixo: coordenadas, os dados de uma pessoa, os dias da semana.
Esquecer a vírgula na tupla de um valor.
(5) é só o número 5 entre parênteses. A tupla de um elemento é (5,). Quem faz a tupla é a vírgula: t = 5, também é uma tupla.
Quantidade errada ao desempacotar.
nome, idade = ('Ana', 28, 'Petrolina') dá erro: são 2 variáveis para 3 valores. Tem que ser uma variável para cada valor, na mesma ordem.
Usar index sem conferir antes.
cores.index('roxo') para o programa com erro quando o roxo não está lá. Confira com if 'roxo' in cores: antes de pedir a posição.
Confundir enumerate com range.
No for i, cidade in enumerate(cidades), o i é a posição e a cidade é o valor. Com uma variável só, cada volta recebe a dupla inteira (0, 'Petrolina').